按以下方式设置链接库时
target_link_libraries (SOME_TARGET -L/somedir -lfoo)
cmake 不处理 RPATH。使用“-L”和“-l”不是最佳实践,还是实际上完全错误?创建我自己的 Find*.cmake 时,我通常使用find_library()
但我得到的查找脚本不会执行此操作,而是使用“-L”和“-l”采用上述形式。
该文档并没有真正解释如何收集 RPATH,也没有真正清楚它如何处理“-l”和“-L”,您得到的唯一指针是
“以 - 开头但不是 -l 或 -framework 的项目名称被视为
链接器标志”
指定依赖于工具链的标志,例如-l
and -L
通常不建议这样做,因为它会破坏可移植性并且可能会产生与您预期不同的效果。
设置链接器路径的正确方法是link_directories http://www.cmake.org/cmake/help/v3.0/command/link_directories.html命令。
CMake 中惯用的解决方案是使用find_library
用于定位库,然后将完整路径传递给链接器,因此您根本不需要担心链接目录。
现在,RPATH 是一个不同的野兽,因为它还确定动态库在运行时的位置。通常,默认设置在这里工作得相当好。如果您发现自己处于不幸的情况,但事实并非如此,有许多目标属性和 CMake 变量会影响这一点:
有一些属性用于指定 RPATH 规则。安装_RPATH
是一个以分号分隔的列表,指定要在已安装的文件中使用的 rpath
目标(针对支持它的平台)。 INSTALL_RPATH_USE_LINK_PATH
是一个布尔值,如果设置为 true 将在链接器中附加目录
搜索路径并将项目外部添加到 INSTALL_RPATH。
SKIP_BUILD_RPATH 是一个布尔值,指定是否跳过自动
生成允许目标从构建树运行的 rpath。
BUILD_WITH_INSTALL_RPATH 是一个布尔值,指定是否链接
带有 INSTALL_RPATH 的构建树中的目标。这优先
通过 SKIP_BUILD_RPATH 并避免之前重新链接的需要
安装。 INSTALL_NAME_DIR 是指定目录的字符串
Mac OSX 上共享库的“install_name”字段的一部分
在已安装的目标中使用。创建目标时的值
变量 CMAKE_INSTALL_RPATH、CMAKE_INSTALL_RPATH_USE_LINK_PATH、
CMAKE_SKIP_BUILD_RPATH、CMAKE_BUILD_WITH_INSTALL_RPATH 和
CMAKE_INSTALL_NAME_DIR 用于初始化这些属性。
(来自set_target_properties docs http://www.cmake.org/cmake/help/v3.0/command/set_target_properties.html)
另外,您可能想看看用于 RPATH 处理的 CMake Wiki 页面 https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/RPATH-handling.
不幸的是,整个 RPATH 业务相当复杂,全面的解释需要的空间远远超过 StackOverflow 答案的空间,但我希望这足以让您开始。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)