通常在 Debian 上,当您从存储库安装东西时,它们就会正常工作。它把事情安排得很好,生活也很美好。这对于存储库中的最新内容非常有用。
我正在构建一些工具,我想从 github 或 Mercurial 手动更新它们。
使用 cmake 或配置脚本来构建代码就可以了,我还添加了自己的前缀路径,以便在需要时可以轻松删除或更新包。
我只是从 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' 链接器标志
答案1
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
$
这些神奇的字符串必须输入到针对自定义安装树中的库构建的任何软件的编译过程中。细节将根据是否Makefile
或autotools
等等而有所不同cmake
。一种简单的方法是设置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
对于autotools
或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,有几种方法可以去除角质格鲁尼牛,因此来自构建过程输出的“至少一个...”建议。可能会使用更复杂的软件库stow
或类似的,取决于你想给自己多少绳子(以及由此带来的头痛)。)