【问题标题】:How to set multiple RPATH directories using CMake on MacOS如何在 MacOS 上使用 CMake 设置多个 RPATH 目录
【发布时间】:2017-03-01 23:33:57
【问题描述】:

我们如何在 MacOS 上的 CMake 中的目标上设置多个 RPATH 目录?在 Linux 上,我们可以只使用冒号分隔的列表:

set_target_properties(mytarget
    PROPERTIES
    INSTALL_RPATH "\$ORIGIN/../lib:\$ORIGIN/../thirdparty/lib"
)

在 MacOS 上,从技术上讲,我们可以添加一个冒号分隔的列表,otool -l 应该会显示它,但不会搜索这些目录:

set_target_properties(mytarget
    PROPERTIES
    INSTALL_RPATH "@loader_path/../lib:@loader_path/../thirdparty/lib"
)

通常,如果我要在 MacOS 上拥有多个 RPATH 目录,我会发送多个链接器标志,这些标志将与 otool -l 分开显示。比如:

g++-mp-4.7 mytarget.cpp -o mytarget -Wl,-rpath,@loader_path/../lib,-rpath,@loader_path/../thirdparty/lib

这给出了:

Load command 15
          cmd LC_RPATH
      cmdsize 32
         path @loader_path/../lib (offset 12)
Load command 16
          cmd LC_RPATH
      cmdsize 48
         path @loader_path/../thirdparty/lib (offset 12)

如何使用 CMake 重新创建此行为?

【问题讨论】:

    标签: cmake rpath


    【解决方案1】:

    根据documentation,路径不应该用冒号分隔,而是用分号

    set_target_properties(mytarget
        PROPERTIES
        INSTALL_RPATH "@loader_path/../lib;@loader_path/../thirdparty/lib"
    )
    

    或者,使用命令set让CMake处理分隔符:

    set(MY_INSTALL_RPATH
        "@loader_path/../lib"
        "@loader_path/../thirdparty/lib"
    )
    set_target_properties(mytarget
        PROPERTIES
        INSTALL_RPATH "${MY_INSTALL_RPATH}"
    )
    

    编辑:(感谢 Tsyvarev 的评论)

    或者,使用命令set_property,它接受多值属性:

    set_property(
        TARGET mytarget
        PROPERTY INSTALL_RPATH
        "@loader_path/../lib"
        "@loader_path/../thirdparty/lib"
    )
    

    【讨论】:

    • .. 或使用接受多值属性的set_property(TARGET)
    • @wasthishelpful 工作就像一个魅力。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2020-10-04
    • 2020-02-10
    • 2022-01-11
    • 2021-11-17
    • 1970-01-01
    • 2016-06-17
    • 2021-07-12
    • 1970-01-01
    相关资源
    最近更新 更多