如何在 MacOS 上使用 CMake 设置多个 RPATH 目录
How to set multiple RPATH directories using CMake on MacOS
我们如何在 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 重新创建此行为?
根据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"
)
我们如何在 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 重新创建此行为?
根据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"
)