如何在OS X上更改RPATH

时间:2016-10-30 03:42:12

标签: macos path cmake openkinect rpath

我正在从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

我的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

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

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

子注(类似问题):

1 个答案:

答案 0 :(得分:3)

不确定这对您的案例是否真的有用。但我经常能够通过适当的rpath参数解决cmake相关问题:

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" 

每隔一段时间(例如,如果手头的项目没有正确设置链接器属性),我仍然需要在安装后使用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"

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

install_name_tool -change <old-path> <new-path> <file>

...其中<old-path>显示为otool -L <file>。请注意,您也可以使用rpath以类似的方式更改install_name_tool(我自己还没试过这个):

install_name_tool -rpath <old-path> <new-path> <file>

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