Path

從原始碼建構程式碼並將它們添加到您的路徑

  • November 9, 2015

通常在 Debian 上,當您從儲存庫安裝東西時,它們就可以工作。它使事情變得很好,生活也很美好。這對於儲存庫中的最新內容非常有用。

我正在建構一些我想從 github 或 mercurial 手動更新的工具。

使用 cmake 或 configure 腳本來建構程式碼很好,我還添加了自己的前綴路徑,以便我可以在需要時輕鬆刪除或更新包。

我只是從 mercurial 建構 SDL2 並將其安裝到 /opt/SDL2 並將其添加到我的路徑中。我必須這樣做才能建構 SDL_image

在完成它的過程後給了我這個輸出。

Libraries have been installed in:
  /opt/SDL_IMAGE/lib

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
  - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
    during execution
  - add LIBDIR to the `LD_RUN_PATH' environment variable
    during linking
  - use the `-Wl,-rpath -Wl,LIBDIR' linker flag
  - have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.

上面的輸出說明了很多,我不確定如何解析它。在過去,我使用了一個簡化了很多這些東西的 mac,但是在 linux 上我遇到了一些麻煩。

通過閱讀上面的程式碼,我的理解是我應該在我的 bashrc 文件中添加這樣的內容。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/SDL_IMAGE/lib
export LD_RUN_PATH=$LD_RUN_PATH:/opt/SDL_IMAGE/lib

到我的 bashrc,這樣當我連結 sdl 圖像標題時它會找到它?我已經瀏覽了 ld 的手冊頁,但老實說我不明白,這就是我問的原因。

特別是這一行:使用 `-Wl,-rpath -Wl,LIBDIR’ 連結器標誌

Mac OS X 上的 Xcode 和 Fink|Homebrew|MacPorts 具有這些複雜性(它們只是在很大程度上對您隱藏)。這個問題有兩個方面,編譯和執行。編譯將需要安裝到自定義路徑的任何庫的各種詳細資訊。某些庫的此資訊可以由 提供pkg-config,例如,對於我在主目錄下維護的一個小軟體倉庫:

$ ls ~/usr/rhel6-x86_64/lib/pkgconfig/
goptfoo.pc  jkiss.pc  libsodium.pc
$ echo $PKG_CONFIG_PATH
/homes/jdoe/usr/rhel6-x86_64/lib/pkgconfig
$ pkg-config --libs --cflags libsodium
-I/homes/jdoe/usr/rhel6-x86_64/include  -L/homes/jdoe/usr/rhel6-x86_64/lib -lsodium  
$ 

對於針對自定義安裝樹中的庫建構的任何軟體,必須將這些魔術字元串輸入到編譯過程中。細節將根據是否Makefileautotoolscmake等等而有所不同。一種簡單的方法是設置CFLAGS為包含pkg-config輸出,或者只是在建構行中包含輸出:

mkpwhash: mkpwhash.c
       gcc -std=gnu99 `pkg-config --cflags --libs libsodium` -lcrypt -Werror -Wall -Wextra -Wundef -ftrapv -fstack-protector-all -pedantic -pipe -o mkpwhash mkpwhash.c

對於autotoolsor cmake,您需要四處探勘以了解他們如何將這個特定的洋蔥連接到他們的腰帶上,例如研究configure.ac使用的軟體包中的現有配置autotools等。

要執行已編譯為使用自定義路徑中的共享庫的內容,設置LD_LIBRARY_PATH可能就足夠了(或者,在系統範圍內,使用ld.so.conf):

$ unset LD_LIBRARY_PATH
$ ldd ~/usr/rhel6-x86_64/bin/mkpwhash | grep sodium
       libsodium.so.13 => not found
$ exec $SHELL
$ echo $LD_LIBRARY_PATH 
/homes/jdoe/usr/rhel6-x86_64/lib
$ ldd ~/usr/rhel6-x86_64/bin/mkpwhash | grep sodium
       libsodium.so.13 => /homes/jdoe/usr/rhel6-x86_64/lib/libsodium.so.13 (0x00007e5c12ca7000)
$

(這是 unix,有幾種方法可以去除Bos grunniens,因此從您的建構過程輸出中得到“至少一個……”的建議。更複雜的軟體倉庫可能會使用stow或類似的,這取決於繩子的數量(和,因此,頭痛)你想給自己。)

引用自:https://unix.stackexchange.com/questions/241887