探讨CMake中关于RPATH的使用

    最近研究CMake,发现CMake对于RPATH的管理也非常人性化。官方说法是当动态库的编译也和执行档在同级目录下的时候,CMake会自动给执行档加入适当的RPATH.具体可以通过readelf -d executable来查看相关的RPATH路径。所以有的时候用QMake编译之后还得手动加一把LD_LIBRARY_PATH,而用CMake编译之后,直接执行执行档就可以了。

    相关RPATH的说明,同学可以自行google学习,简单来说,RPATH就是在LD_LIBRARY_PATH之前,会优先让执行档去寻找相应的动态库,当然了有的操作系统支持RUNPATH的话,会在RUNPATH设置情况下自动忽略RPATH,而会先去寻找LD_LIBRARY_PATH之后再去着RUNPATH,(注意这里面的顺序关系,RUNPATH在LD_LIBRARY_PATH之后,而其会让RPATH忽略,但RPATH却在LD_LIBRARY_PATH之前),相关顺序这里简单交代下: RPATH   --   LD_LIBRARY_PATH -- RUNPATH(出现会屏蔽RPATH) -- /etc/ld.so.conf -- builtin dircetories(/lib, /usr/lib)。

    在这里我主要介绍下CMake对于RPATH的相关管控。默认行为已经在第一段说明了,那就是CMake在默认情况下是会给你的exe加入相关RPATH的,这个时候可能会有不想要相关RPATH的需求,仔细查阅寻找之后发现,CMake里面维护了3个比较重要的RPATH变量,即CMAKE_SKIP_RPATH,CMAKE_SKIP_BUILD_RPATH,CMKAE_INSTALL_RPATH.

    对于第一个变量CMAKE_SKIP_RPATH,简单的来说,就是强制CMake不在构建期间和安装install期间给你加上它所认为的RPATH.

cmake .. -DCMAKE_SKIP_RPATH=TRUE

   第二个和第三个变量也比较简单,就是分别在构建期间和安装期间不允许CMake给你加入相关RPATH

cmake .. -DCMAKE_SKIP_BUILD_RPATH=TRUE

cmake .. -DCMAKE_SKIP_INSTALL_RPATH=TRUE

当然了,如果你之后想要追加RPATH,只需要对这三个变量设置成FALSE就可以了。

 

参考链接: www.cmake.org/Wiki/CMake_RPATH_handling#No_RPATH_at_all

你可能感兴趣的:(Path)