macos - 如何在 OS X 上更改 RPATH

标签 macos path cmake openkinect rpath

我正在从 openkinect 网站进行简单安装以使用 xbox kinect。问题是没有 OSX 发行版,并且假设自制软件会为您完成安装。

在安装的最后一步,我发现了一条有用的线索,了解我的安装出了什么问题。

网站告诉我的。 “如果链接出现问题,则必须更改每个 libfreenect 库的 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 中的库有关,这使得这个问题更容易解决。

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

子注释(类似问题):

最佳答案

不确定这对您的情况是否真的有帮助。但我经常能够解决 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>所示的那个。请注意,您还可以更改 rpathinstall_name_tool以类似的方式(但我自己没有尝试过):

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

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

关于macos - 如何在 OS X 上更改 RPATH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40325858/

相关文章:

c++ - GoogleTest for Android NDK C++ with CMake

python - OS X 上预装了多少个版本的 python?

swift - NSEvent.keyCode 到 Swift 中的 unicode 字符

swift - Finder 同步扩展等待在 XCode 7.0.1 OSX 10.10 中附加

javascript - D3 库中动画曲线的最少资源方式

Java-获取资源文件的字符串路径

cmake - 当find_package找不到库时在cmake-gui中选择路径

java - 为 CMake 设置自定义 Java 版本

macos - Cocoa 文本系统中的幻像字符

java - 如何在 lambda 函数中传递多个 get 参数?