CMake'link_directories`用于libstdc++.so

CMake'link_directories`用于libstdc++.so,c++,cmake,dynamic-linking,libstdc++,C++,Cmake,Dynamic Linking,Libstdc++,我正在使用CMake的link_libraries代码指定包含特定版本libstdc++.so的文件夹的路径 最初,在32位机器上,这很好:在构建但未安装的可执行文件上运行ldd表明libstdc++.so指向了所需的版本,并且我能够运行ctest来执行测试,即使系统libstdc++.so比测试要求的要旧 然而,当我将代码移植到64位机器时,所需的libstdc++。因此,链接的可执行文件中不再包含路径。这迫使我滥用LD_LIBRARY_路径来运行项目的测试 我试图用一个小测试用例来复制这个问

我正在使用CMake的link_libraries代码指定包含特定版本libstdc++.so的文件夹的路径

最初,在32位机器上,这很好:在构建但未安装的可执行文件上运行ldd表明libstdc++.so指向了所需的版本,并且我能够运行ctest来执行测试,即使系统libstdc++.so比测试要求的要旧

然而,当我将代码移植到64位机器时,所需的libstdc++。因此,链接的可执行文件中不再包含路径。这迫使我滥用LD_LIBRARY_路径来运行项目的测试

我试图用一个小测试用例来复制这个问题,但我无法让它在两个平台上都包含所需的路径,因此问题可能与32位到64位的移植活动无关。但是,在32位平台上构建时,我已经注释掉了link_libraries行,并确认如果没有它,则不包括所需的库路径。我还多次检查以确保为所需的64位库指定了有效路径


知道这里还可能发生什么吗?

您可能想了解有关RPATH选项的信息:

基本搜索顺序为:[1]

DT_RPATH dynamic section属性中以冒号分隔的路径 如果存在且DT_运行路径属性不存在,则为二进制文件的。这个 环境变量LD_LIBRARY_PATH中的冒号分隔路径, 除非可执行文件是setuid/setgid二进制文件,在这种情况下 忽略

当然,您可以通过CMAKE_uu[EXE,SHARED,STATIC,MODULE]LINKER_uu标志手动设置它,例如


但是也有可能使用CMake本身

我查看了CMake用于操作RPath的本机选项,但是似乎没有一种方法可以在构建时设置它,而不使用CMake_BUILD_WITH_INSTALL_RPath选项,但是如果可能的话,我希望继续使用strip RPath on installation功能。我想这可能与手动链接器标志选项有关,我想我只需要将其应用于我打算在本地测试的目标…但是你知道为什么我会首先看到不同的行为吗?我想剥离将仅用于安装,例如,调用make install以便您可以尝试一下。我猜第一件事就是因为你在那里很幸运。在/etc/ld.so.conf/*中可能有一些环境变量或其他东西,这很神奇。我在前面的评论中列出的选项要求我在调用make install时不剥离路径,但我确实希望安装剥离路径。这意味着您没有使用make test或ctest进行测试?我想这就是你所说的测试。当然,如果您调用makeinstall,那么剥离的Rpath将无法工作。是的,我正在使用ctest进行测试。我希望路径出现在ctest运行的未安装的二进制文件中,但在已安装的二进制文件中被剥离。
cmake -DCMAKE_SHARED_LINKER_FLAGS="-Wl,-rpath -Wl,/path/to/lib"