我已经生成了一个动态库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以及如何使用哪个选项?
答案 0 :(得分:2)
编辑:正确的做法是谢尔盖先生说:
g ++ -shared -fPIC -L。 -lA libB.cpp -Wl,-rpath,'$ ORIGIN'-libB.so
当您使用库构建的可执行文件与库的路径相同时,您可以执行此操作:
g ++ -shared -fPIC -L。 -lA libB.cpp -Wl,-rpath,。 -o libB.so
它应链接到本地(-L。添加。作为构建路径和-rpath,。用于运行时)。正如SergeyA所指出的那样。是$ PWD,而不是$ ORIGIN。
答案 1 :(得分:1)
这是$ ORIGIN的用途。为了使用它,在链接libB.so时需要跟随链接器的标志:,-rpath,'$ORIGIN'
这将确保libB.so总是试图通过它的方来找到libA。
请注意,ldd仍将显示libA的完整路径。