如何在OSX上的构建(不安装)的cmake中为可执行文件添加rpath?

Dou*_*oug 9 macos cmake

因此,如果您已经有二进制文件,可以使用'install_name_tool'在OSX上添加一个rpath,如下所示:

install_name_tool -add_rpath @executable_path/blah
Run Code Online (Sandbox Code Playgroud)

当您构建应用程序包时,xcode会自动执行此操作.

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

set_target_properties(nshared PROPERTIES BUILD_WITH_INSTALL_RPATH 1 INSTALL_NAME_DIR "@rpath")
Run Code Online (Sandbox Code Playgroud)

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

(对于'为什么你会这样做?',在你的应用程序/文件夹中的任何应用程序上查看otool -l,你会看到很多应用程序的条目如下:

Load command 15
          cmd LC_RPATH
      cmdsize 36
         path @executable_path/../../Frameworks/
Run Code Online (Sandbox Code Playgroud)

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

sak*_*kra 13

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

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

该变量CMAKE_INSTALL_NAME_TOOL包含install_name_toolDarwin下可执行文件的路径.

  • 我想知道是否有人可以在引入一堆“RPATH”变量时为 cmake 3.14 及更高版本更新这个 10 年前的问题/答案。我仍然无法上班。 (5认同)
  • 一个更普遍的问题是为什么官方[文档](https://gitlab.kitware.com/cmake/community/-/wikis/doc/cmake/RPATH-handling)中描述的为目标设置“RPATH”的技术显然不适用不适用于可执行文件? (3认同)
  • 根据我的经验,这个解决方案在第一次构建干净目录后导致任何构建错误.无论目标是否已过期,自定义POST_BUILD命令都会在每个构建上运行,并且install_name_tool返回非零退出状态,并显示一条消息,表明已添加的rpath值已存在于目标文件中(因为它已添加在第一次构建期间).CMake的文档似乎表明POST_BUILD命令只会在目标已过期时运行,但似乎并非如此. (2认同)