CMake:不要为链接中使用的单个库设置rpath

use*_*401 6 linux gcc cmake ld

我想要做的是配置我的CMakeLists文件,以便在构建我的项目时,链接器使用驻留在我的构建树中的共享库(.so)的副本来链接可执行文件,但是不设置rpath链接的可执行文件,以便系统必须在加载程序请求时提供库.

具体来说,我想在没有安装libOpenCL.so作为系统库的构建服务器场的构建期间链接libOpenCL.so.为此,libOpenCL.so位于项目构建树中,并使用CMakeLists文件中的绝对路径进行引用.这个绝对路径是为了确保如果系统确实安装了libOpenCL.so,那么就不会使用它.

但是,当运行最终的可执行文件时,CMake已经添加了rpath的绝对路径,该路径停止了libOpenCL的系统版本.由库加载器拾取并使用.

看似简单但我无法弄明白.

谢谢!

小智 5

我知道这个答案太晚了。我遇到了和你一样的要求。我们需要的是白名单方法,我们CMAKE_BUILD_RPATH明确地设置我们需要的内容。或者我们需要一个黑名单方法,我们告诉 cmake,RPATH我们不希望在可执行文件中使用它。RPath尚未记录从构建树中删除的方法:https : //gitlab.kitware.com/cmake/cmake/issues/16825

我采取的解决方案是:

设置RUNPATH而不是RPATH. 您可以通过以下语句实现此目的:

SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--enable-new-dtags")
Run Code Online (Sandbox Code Playgroud)

RUNPATH存在时,RPATH被忽略。 RUNPATH- 与 相同RPATH,但经过搜索LD_LIBRARY_PATH,仅在最新的 UNIX 上受支持

然后我可以使用环境变量来实现库的覆盖LD_LIBRARY_PATH


Ste*_*fan -1

根据CMake Wiki,这应该不是问题:

默认情况下,如果您不更改任何 RPATH 相关设置,CMake 会将具有完整 RPATH 的可执行文件和共享库链接到构建树中的所有使用的库。安装时,它会清除这些目标的 RPATH,因此它们会使用空的 RPATH 进行安装。

那么您可以尝试简单地安装它吗?