CMake:不要为链接

时间:2016-03-03 15:19:12

标签: linux gcc cmake ld

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

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

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

看似简单,但我无法弄明白。

谢谢!

2 个答案:

答案 0 :(得分:1)

我知道这个答案太迟了。我面临着与您相同的要求。 我们需要的是白名单方法,在其中我们根据需要明确设置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")

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

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

答案 1 :(得分:0)

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

  

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

所以你可能会尝试简单地安装它?