在mac某机器中cmake生成makefile文件的时候,发现提示如下:

....
CMake Warning (dev):
  Policy CMP0042 is not set: MACOSX_RPATH is enabled by default.  Run "cmake
  --help-policy CMP0042" for policy details.  Use the cmake_policy command to
  set the policy and suppress this warning.

  MACOSX_RPATH is not specified for the following targets:

   cjson
   iniparser
   stemmer
   word2vec

This warning is for project developers.  Use -Wno-dev to suppress it.

-- Generating done
....

而之前在linux下这组CMakeLists.txt文件一直很好的工作,不知为何突然出来这个warning了. 简单的google了一下,立刻发现其实这是2.8.2就有的更新了,为了针对mac下搞的安装lib库各种奇怪的位置而弄的一些fix. 维护者Kitware的一个说明可以看这里.作者各种介绍了OSX中的各种存放到rpath的逻辑,查看详细内容各位可以直接看原文,我直接说需要做的一些修改.

...... 现在我们知道@rpath是怎么工作以及它为何是一个好东西了,现在我们用一个简单的例子来说明如何使用它. 可以注意到的是,目标属性是MACOSX_RPATH和INSTALL_RPATH,MACOSX_RPATH是一个简单的开关来决定@rpath 是否被使用.在之前,INSTALL_NAME_DIR被用来控制决定安装的名字,但此时我们不再这样使用,若此时依然被使用,它会覆盖MACOSX_RPATH标记,方便起见,我们可能还是设置CMAKE_MACOSX_RPATH的值来覆盖多个目标

例子如下

cmake_minimum_required(VERSION 2.8.12)
project(OSXRPath) 
 
# enable @rpath in the install name for any shared library being built
# note: it is planned that a future version of CMake will enable this by default
set(CMAKE_MACOSX_RPATH 1)
 
# add a shared library
add_library(foo SHARED foo.cpp)
 
# add an executable
add_executable(bar.cpp)
# use the shared library
# note: CMake will automatically add an RPATH to this executable which 
#   is the absolute location of libfoo.dylib in the build tree.
target_link_libraries(bar foo)
 
# installation
install(TARGETS foo DESTINATION lib)
install(TARGETS bar DESTINATION bin)
 
# the install RPATH for bar to find foo in the install tree.
# if the install RPATH is not provided, the install bar will have none
set_target_properties(bar PROPERTIES INSTALL_RPATH "@loader_path/../lib")

我们通过高亮的第六行设置CMAKE_MACOSX_RPATH启用其feature即可.

博客中还提到,为了更方便的debug,有如下几个tips

  • 查看一个shared library的install name , 可以使用命令"otool -D <file>"
  • 查看一个shared library依赖库的install name , 可以使用命令 "otool -L <file>"
  • 查看用@rpath的shared library依赖的RPATHs位置,使用"otool -l <file> | grep LC_RPATH -A2"
  • 修改RPATHs可以使用-rpath, -add_rpath,和 -delete_rpath.参数
来自的你,很高兴你能看到这儿。若本文对你有所用处,或者内容有什么不足之处,敬请毫不犹豫给个回复。谢谢!