我正在使用CMake的link_libraries
代码指定({包含}特定版本libstdc++.so
的文件夹的路径。
最初,在32位计算机上,这很好用:在内置但未安装的可执行文件上运行ldd <target>
显示libstdc++.so
指向所需的版本,我能够运行ctest
以执行测试,即使系统libstdc++.so
早于测试所需的时间。
但是,当我将代码移植到64位计算机时,所需的libstdc++.so
路径不再包含在链接的可执行文件中。这迫使我(ab)使用LD_LIBRARY_PATH
来运行项目的测试。
我试图用一个小的测试用例来复制这个问题,但是我无法在 平台上包含所需的路径,所以它可能是问题与32位到64位移植活动无关。但是,在32位平台上构建时,我已注释掉link_libraries
行,并确认没有它,所需的库路径不包含。我还检查了很多次,以确保我为所需的64位库指定了一个有效的路径。
知道这里还会发生什么吗?
答案 0 :(得分:0)
您可能希望了解RPATH
选项:http://en.wikipedia.org/wiki/Rpath
基本搜索顺序为:[1]
DT_RPATH动态部分属性中的(以冒号分隔的)路径 二进制文件(如果存在)和DT_RUNPATH属性不存在。该 环境变量LD_LIBRARY_PATH中的(冒号分隔的)路径, 除非可执行文件是setuid / setgid二进制文件,在这种情况下它是 忽略。
您当然可以通过CMAKE_[EXE,SHARED,STATIC,MODULE]LINKER__FLAGS
手动设置,例如
cmake -DCMAKE_SHARED_LINKER_FLAGS="-Wl,-rpath -Wl,/path/to/lib"
但也有可能使用CMake本身http://www.cmake.org/Wiki/CMake_RPATH_handling