如何避免动态链接的完整路径
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 以及如何使用哪个选项?
编辑:正确的方法是如谢尔盖所说:
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 的完整路径。
相关文章:
- 在 Visual Studio 2010(及更高版本)中定义包含或链接路径变量的位置
- 如何在g++中从链接库中删除路径
- CMake 链接 2 个具有相对路径的库
- 在可执行文件中使用带有符号链接的相对路径
- 链接库时的默认目录上的GCC或G 路径搜索顺序
- CMake为什么通过相对路径链接外部库
- mingw链接路径
- 如何将共享库与具有相对路径的 CMake 链接
- 使用 cmake 的不同链接和加载库路径
- 编译C++中动态链接库,存在运行路径问题
- 访问注册表数据以设置链接器和包含路径
- CMake链接路径
- C++:链接器找不到 -lcrypto,但库在路径中
- CMake:从外部项目链接共享C++对象会生成具有相对路径的二进制文件,而不是绝对路径
- 如何避免动态链接的完整路径
- 路径文件存在导致链接器错误 2028/2019
- G++添加包含和链接路径
- 如何找到外部变量的链接路径
- 在不使用完整路径的情况下创建共享库链接
- 用静态库的完整路径链接可执行文件