Linux CMake:Don';t为链接中使用的单个库设置rpath

Linux CMake:Don';t为链接中使用的单个库设置rpath,linux,gcc,cmake,ld,Linux,Gcc,Cmake,Ld,我想做的是配置我的CMakeLists文件,以便在构建我的项目时,链接器使用驻留在我的构建树中的共享库(.so)的副本来链接可执行文件,但不在链接的可执行文件中设置rpath,以便在加载程序请求时系统必须提供库 具体地说,我想在构建期间在没有将libOpenCL.so作为系统库安装的构建场上链接libOpenCL.so。为此,libOpenCL.so位于项目构建树中,并使用CMakeLists文件中的绝对路径进行引用。此绝对路径用于确保如果系统碰巧安装了libOpenCL.so,则不会使用它 但

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

具体地说,我想在构建期间在没有将libOpenCL.so作为系统库安装的构建场上链接libOpenCL.so。为此,libOpenCL.so位于项目构建树中,并使用CMakeLists文件中的绝对路径进行引用。此绝对路径用于确保如果系统碰巧安装了libOpenCL.so,则不会使用它

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

看起来很简单,但我不太明白

谢谢

根据调查,这应该不是问题:

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


所以你可以试着简单地安装它?

我知道这个答案太晚了。我面临着和你一样的要求。 我们需要的要么是白名单方法,在白名单方法中,我们根据需要显式地设置
CMAKE\u BUILD\u RPATH
。或者我们需要一种黑名单方法,告诉cmake,我们不希望在可执行文件中使用它。从生成树中删除
RPath
的方法尚未记录:

我采取的解决办法是:

设置
RUNPATH
而不是
RPATH
。您可以通过以下语句实现这一点:

SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--enable-new-dtags")
当出现
RUNPATH
时,将忽略
RPATH
RUNPATH
-与
RPATH
相同,但在
LD\u LIBRARY\u PATH
后搜索,仅在最新的UNIX上受支持


然后,我可以使用环境变量
LD\u library\u PATH

实现对库的覆盖,您可以完全控制RPATH设置,而不是让CMake自动生成它。请参阅wiki about。我想修改生成树rpath,而不是安装rpath。此外,我使用的一些库是自定义库,安装后应该有一个rpath。为某些库保留rpath并为其他库丢弃它,这是我问题的关键。理想情况下,每个库的rpath配置,但我可以;在cmake:(@user2746401)中找不到这一点,那么编译是否“就地”进行,而不将最终的二进制文件移动到其他地方?即使您将删除所有二进制文件的rpath,“临时”OpenCL库仍然是链接器的最佳匹配,不是吗?@ToniBig我正在构建。如果我剥离rpath,库加载器将无法找到我的自定义库,因此加载器将无法找到“临时”OpenCL库。请注意,这是库加载器问题,而不是链接器配置问题。