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

How to avoid having a complete path for dynamic linking?

本文关键字:路径 链接 何避免 动态      更新时间:2023-10-16

我生成了一个动态库 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 以及如何使用哪个选项?

编辑:正确的方法是如谢尔盖所说:

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

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

这就是

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

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