【问题标题】:how to change RPATH on OS X如何在 OS X 上更改 RPATH
【发布时间】:2016-10-30 03:42:12
【问题描述】:

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

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

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

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

子注释(类似问题):

【问题讨论】:

    标签: macos path cmake openkinect rpath


    【解决方案1】:

    不确定这对您的情况是否真的有帮助。但我通常能够通过正确的cmake 参数解决与rpath 相关的问题:

    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>
    

    ...其中&lt;old-path&gt;otool -L &lt;file&gt; 显示的那个。请注意,您也可以以类似的方式将rpath 更改为install_name_tool(但我自己还没有尝试过):

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

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

    【讨论】:

    • 我还发现this 的帖子非常有用,描述了CMAKE_MACOSX_RPATHCMAKE_INSTALL_RPATH 的用法。
    猜你喜欢
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多