如何在OS X上更改RPATH

Max*_*Max 6 macos path rpath cmake openkinect

我正在从openkinect的网站上进行简单的安装,以使用xbox kinect.问题是没有OSX发行版,并假设自制软件将为您安排.

在安装的最后一步,我找到了一个有用的线索,说明我的安装有什么问题.

我被网站告知."如果链接有问题,则必须使用以下命令更改每个libfreenect lib的rpath:"

for i in /opt/local/lib/libfreenect*.dylib; do sudo install_name_tool -id $i $i; done
sudo install_name_tool -change libfreenect.0.2.dylib /opt/local/lib/libfreenect.0.2.dylib /opt/local/lib/libfreenect_sync.dylib
sudo install_name_tool -change libfreenect.0.2.dylib /opt/local/lib/libfreenect.0.2.dylib /opt/local/lib/libfreenect_cv.dylib
sudo install_name_tool -change libfreenect_sync.0.2.dylib /opt/local/lib/libfreenect_sync.0.2.dylib /opt/local/lib/libfreenect_cv.dylib
for i in glview regview hiview glpclview tiltdemo record cppview cvdemo; do sudo install_name_tool -change libfreenect.0.2.dylib /opt/local/lib/libfreenect.0.2.dylib /opt/local/bin/$i; sudo install_name_tool -change libfreenect_sync.0.2.dylib /opt/local/lib/libfreenect_sync.0.2.dylib /opt/local/bin/$i; done
Run Code Online (Sandbox Code Playgroud)

我的rpath肯定设置不正确.当用CMake构建时,这个次要消息肯定证实了我的怀疑.

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:

   fakenect
   freenect
   freenect_sync
Run Code Online (Sandbox Code Playgroud)

我遇到的唯一问题是上面给出的命令不起作用.部分原因是我的Mac将我的所有文件放在了下面/usr/local/lib/而不是/opt/local/lib/.我复制一些文件从usropt它减少链接错误的数目,但我还是留下了一些.同样,它们都与未加载的库有关opt,这使得这个问题更容易解决.

任何有关如何正确执行上面第一个代码块的帮助都会有所帮助!

分注(类似问题):

nor*_*ius 8

不确定这对您的情况是否真的有帮助。但我经常能够rpath用适当的cmake参数解决-related 问题:

INSTALL_DIR="/where/it/goes"
cmake .. \
   -DCMAKE_BUILD_TYPE=Release \
   -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" \
   -DCMAKE_MACOSX_RPATH=ON \
   -DCMAKE_INSTALL_RPATH="$INSTALL_DIR/lib" 
Run Code Online (Sandbox Code Playgroud)

时不时地(例如,如果手头的项目没有正确设置链接器属性),我仍然需要install_name_tool在安装后参与。例如:

install_name_tool -change \
    @rpath/QtWidgets.framework/Versions/5/QtWidgets \
    /opt/dev/lib/qt/QtWidgets.framework/Versions/5/QtWidgets \
    "$INSTALL_DIR/lib/libvtkRenderingQt-7.1.1.dylib"
Run Code Online (Sandbox Code Playgroud)

libvtkRenderingQt-7.1.1.dylib是一个从 CMake 项目创建的库,使用与上面相同的 CMake 标志构建。由于某些原因,libvtkRenderingQt无法从 Qt 框架中找到资源,已通过上述命令修复。在伪语法中:

install_name_tool -change <old-path> <new-path> <file>
Run Code Online (Sandbox Code Playgroud)

...这里<old-path>是所示的一个otool -L <file>。请注意,您也可以以类似的方式更改rpathwith install_name_tool(但我自己还没有尝试过):

install_name_tool -rpath <old-path> <new-path> <file>
Run Code Online (Sandbox Code Playgroud)

最后一点:我更喜欢将我自己构建的工具安装到本地目录(例如/opt/dev,或某个用户​​目录),以免弄乱从其他渠道(如 macport、brew 等)获得的其他安装。这也可以防止您需要 sudo 操作,如您的示例所示。