【问题标题】:How do you add an rpath to an executable in cmake on build (not install) on OSX?如何在 OSX 上构建(而不是安装)时将 rpath 添加到 cmake 中的可执行文件?
【发布时间】:2012-12-01 03:19:47
【问题描述】:

所以,如果你已经有一个二进制文件,你可以在 OSX 上使用“install_name_tool”为它添加一个 rpath,如下所示:

install_name_tool -add_rpath @executable_path/blah

xcode 会在您构建应用程序包时自动执行此操作。

我知道在cmake中你可以使用它来设置共享库的install_name:

set_target_properties(nshared PROPERTIES BUILD_WITH_INSTALL_RPATH 1 INSTALL_NAME_DIR "@rpath")

我的问题是,向二进制文件中添加 rpath 相当于什么?

(对于“你为什么要那样做?”在你们中间,去看看你的 Applications/ 文件夹中任何应用程序上的 otool -l ,你会看到很多应用程序的条目如下:

Load command 15
          cmd LC_RPATH
      cmdsize 36
         path @executable_path/../../Frameworks/

这是标准做法。我只是想在cmake中做到这一点)

【问题讨论】:

  • 一个更普遍的问题是,为什么官方documentation 中描述的为目标设置RPATH 的技术显然不适用于可执行文件?

标签: macos cmake


【解决方案1】:

您可以使用POST_BUILD commandLC_RPATH 加载命令添加到构建的可执行文件中:

add_custom_command(TARGET executable 
    POST_BUILD COMMAND 
    ${CMAKE_INSTALL_NAME_TOOL} -add_rpath "@executable_path/../../Frameworks/"
    $<TARGET_FILE:executable>)

变量CMAKE_INSTALL_NAME_TOOL 包含了Darwin 下install_name_tool 可执行文件的路径。

【讨论】:

  • 根据我的经验,在从干净目录首次构建后,此解决方案会导致任何构建出错。自定义 POST_BUILD 命令在每个构建上运行,无论目标是否过期,并且 install_name_tool 返回非零退出状态并显示一条消息,表明正在添加的 rpath 值已存在于目标文件中(因为它已添加在第一次构建期间)。 CMake 的文档似乎表明 POST_BUILD 命令只有在目标过期时才会运行,但事实并非如此。
  • 一个更普遍的问题是为什么官方documentation 中描述的为目标设置RPATH 的技术显然不适用于可执行文件?
  • 我无法让您链接到的文档中的内容正常工作。
猜你喜欢
  • 1970-01-01
  • 2014-05-07
  • 1970-01-01
  • 1970-01-01
  • 2022-12-13
  • 1970-01-01
  • 2021-06-23
  • 1970-01-01
相关资源
最近更新 更多