如何在 Linux 上硬编码动态库路径

How to hard code a dynamic library path on Linux

我想在 Linux 中对我的可执行文件中的库路径进行硬编码。在 OS X 上,这是通过在构建库时在 -o 参数后提供完整路径来实现的。例如,我在 OS X:

上构建了一个这样的库
cc foo.c --shared -o /home/sander/libfoo.so

当我用这个库构建一个名为 'bar' 的可执行文件时 links,并且我在可执行文件上使用 otool -L,我得到这个输出:

bar:
    /home/sander/libfoo.so (compatibility version 0.0.0, current version 0.0.0)

我现在可以从任何地方 运行 这个可执行文件,而且它总是能够找到库。

我正在寻找 Linux 与 gcc 的等效功能。我宁愿不使用 rpath,因为它不会 link 指向特定的库 + 路径。

就这样编译,所以不要使用-llib而是指定它作为编译对象:

cd /full/path/to/lib
gcc -shared -fpic -o liblib.so lib.c             # make the lib
gcc -c -o prog.o prog.c                          # compile program
gcc -o prog prog.o "/full/path/to/lib/liblib.so" # link everything together

编辑: 我最初在 OS X 上写道,在 -o 选项之后指定绝对路径还是相对路径并不重要。那是不正确。它确实会影响 Mach-O LC_ID_DYLIB 加载命令中库的 "name"。感谢@Sander Mertens 让我知道。