在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")博客中还提到,为了更方便的debug,有如下几个tips
- 查看一个shared library的install name , 可以使用命令"otool -D <file>"
<li>查看一个shared library依赖库的install name , 可以使用命令 "otool -L <file>"</li>
<li>查看用@rpath的shared library依赖的RPATHs位置,使用"otool -l <file> | grep LC_RPATH -A2"
Comments
No comments yet — be the first to write one.