如何避免拥有完整的动态链接路径?

How to avoid having a complete path for dynamic linking?

我已经生成了一个动态库libA.so。现在我想生成另一个链接到 libA.so.

的动态库 libB.so

使用 ldd 命令,我看到 libA.so:

的绝对路径
ldd full_path_to_libB/libB.so
    libx.so => full_path_to_libx (0x....)
    .
    .
    fullpath_to_libA/libA.so (0x....)

但我想避免只有 libA.so 的完整库路径才能通过 ldd 获取此文件:

ldd full_path_to_libB/libB.so
    libx.so => full_path_to_libx (0x....)
    .
    .
    libA.so => full_path_to_libA/libA.so (addr)

这假设将 full_path_to_libB 添加到 LD_LIBRARY_PATH。

为了添加额外的库存储库,我尝试向链接器添加一些选项,但没有任何效果。

g++: error: libA.so not found

是否可以避免仅获取完整路径 libA.so 以及如何使用哪个选项?

这就是 $ORIGIN 的用途。为了使用它,您需要在链接 libB.so 时向链接器添加以下标志: ,-rpath,'$ORIGIN' 这将确保 libB.so 始终尝试在其旁边找到 libA。

但是请注意,ldd 仍将显示 libA 的完整路径。

编辑:正确的做法如 SergeyA 所说:

g++ -shared -fPIC -L. -lA libB.cpp -Wl,-rpath,'$ORIGIN' -o libB.so

当您使用您的库构建的可执行文件与您的库位于同一路径时,您可以这样做:

g++ -shared -fPIC -L。 -lA libB.cpp -Wl,-rpath,. -o libB.so

它应该 link 到本地(-L。添加 . 作为构建路径和 -rpath,. 用于运行时)。正如 SergeyA 指出的那样,.是 $PWD,不是 $ORIGIN。