C++ c++;具有运行路径的二级依赖项解析
我有以下问题: 我正试图使用默认的gnu编译器(gcc-7)和可用的链接器版本在Ubuntu18上构建软件 现在我们有了这样的情况,一个可执行文件可以链接一个共享库,而这个共享库又链接了另一个共享库。因此,可执行文件具有第二依赖性。但次要依赖项仅从rpath中获取,而不是从运行路径中获取。因此,即使将次要依赖项放在可执行文件的runpath文件夹中,也不会找到它 当谷歌测试与cmake结合使用时,发现了这个问题。由于未找到辅助依赖项,因此无法编译测试。因此,设置C++ c++;具有运行路径的二级依赖项解析,c++,gcc,cmake,rpath,C++,Gcc,Cmake,Rpath,我有以下问题: 我正试图使用默认的gnu编译器(gcc-7)和可用的链接器版本在Ubuntu18上构建软件 现在我们有了这样的情况,一个可执行文件可以链接一个共享库,而这个共享库又链接了另一个共享库。因此,可执行文件具有第二依赖性。但次要依赖项仅从rpath中获取,而不是从运行路径中获取。因此,即使将次要依赖项放在可执行文件的runpath文件夹中,也不会找到它 当谷歌测试与cmake结合使用时,发现了这个问题。由于未找到辅助依赖项,因此无法编译测试。因此,设置LD\u LIBRARY\u PA
LD\u LIBRARY\u PATH
可能不是一个选项,或者至少会使一切变得复杂
下面是一个例子,说明Ubuntu18系统上的gcc-7出现了什么问题(但在Ubuntu16上gcc-5可以正常工作):
secondary.hpp
#包括
阶级世界{
公众:
std::string world();
};
secondary.cpp
#包括“secondary.hpp”
std::string World::World(){
回归“世界”;
}
primary.hpp
#包括
同学们好{
公众:
std::string helloWorld();
};
primary.cpp
#包括“primary.hpp”
#包括“secondary.hpp”
#包括
std::string Hello::helloWorld(){
std::stringstream strm;
世界;
strmlibprimary
负责加载libsecondary
,而不是app
。这意味着app
的DT_运行路径条目不适用
由于您可以控制所有库,因此可以在libprimary
和libsecondary
的编译语句中添加-Wl,-rpath=…
。这确实可以解决问题。但是,通常我可以重新定位库,因此设置rpath(或runpath)对于libprimary
,除非我决定重新定位libsecondary
,否则它将只起作用。这基本上是正确的,如果库是在不同的系统(例如CI管道)上编译的,我仍然感到困惑,rpath正在选择任何库(也是可传递的库)运行路径不确定。不确定,为什么行为如此不同。事实上,这是正确的答案,也可以在ld手册中找到:
linux-vdso.so.1 (0x00007fff0cf8c000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f9e86fe7000)
libprimary.so => <some_path>/libprimary.so (0x00007f9e86de5000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f9e86bcd000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9e867dc000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f9e8643e000)
/lib64/ld-linux-x86-64.so.2 (0x00007f9e87573000)
libsecondary.so => not found
Dynamic section at offset 0x1d40 contains 31 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libstdc++.so.6]
0x0000000000000001 (NEEDED) Shared library: [libprimary.so]
0x0000000000000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000001d (RUNPATH) Library runpath:[<some_path>/build]