C++ c++;具有运行路径的二级依赖项解析

C++ c++;具有运行路径的二级依赖项解析,c++,gcc,cmake,rpath,C++,Gcc,Cmake,Rpath,我有以下问题: 我正试图使用默认的gnu编译器(gcc-7)和可用的链接器版本在Ubuntu18上构建软件 现在我们有了这样的情况,一个可执行文件可以链接一个共享库,而这个共享库又链接了另一个共享库。因此,可执行文件具有第二依赖性。但次要依赖项仅从rpath中获取,而不是从运行路径中获取。因此,即使将次要依赖项放在可执行文件的runpath文件夹中,也不会找到它 当谷歌测试与cmake结合使用时,发现了这个问题。由于未找到辅助依赖项,因此无法编译测试。因此,设置LD\u LIBRARY\u PA

我有以下问题:

我正试图使用默认的gnu编译器(gcc-7)和可用的链接器版本在Ubuntu18上构建软件

现在我们有了这样的情况,一个可执行文件可以链接一个共享库,而这个共享库又链接了另一个共享库。因此,可执行文件具有第二依赖性。但次要依赖项仅从rpath中获取,而不是从运行路径中获取。因此,即使将次要依赖项放在可执行文件的runpath文件夹中,也不会找到它

当谷歌测试与cmake结合使用时,发现了这个问题。由于未找到辅助依赖项,因此无法编译测试。因此,设置
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;
世界;

strm
libprimary
负责加载
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]