如何避免拥有完整的动态链接路径?
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。
我已经生成了一个动态库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。