gpt4 book ai didi

使用 -L 添加 link_library 时,Cmake 未设置 RPATH

转载 作者:行者123 更新时间:2023-12-04 17:34:43 28 4
gpt4 key购买 nike

按以下方式设置链接库时

target_link_libraries (SOME_TARGET -L/somedir -lfoo)

cmake 不处理 RPATH。使用“-L”和“-l”不是最佳实践,还是完全错误?创建我自己的 Find*.cmake 时,我通常使用 find_library()但是我得到的查找脚本并没有这样做,而是使用“-L”和“-l”采用上述形式。

文档并没有真正解释 RPATH 是如何收集的,文档也不是很清楚它如何处理“-l”和“-L”,你得到的唯一指针是

"Item names starting with -, but not -l or -framework, are treated as linker flags"

最佳答案

指定依赖于工具链的标志,如 -l-L通常不推荐使用,因为它破坏了可移植性并且可能产生与您预期不同的效果。

设置链接器路径的正确方法是 link_directories 命令。

CMake 中惯用的解决方案是使用 find_library用于定位库,然后将完整路径传递给链接器,因此您根本不需要担心链接目录。

现在,RPATH 是一个不同的野兽,因为它也决定了动态库在运行时的位置。通常,默认设置在这里工作得相当好。如果您发现自己处于不幸的境地,但它没有,有许多目标属性和 CMake 变量会影响这一点:

There are a few properties used to specify RPATH rules. INSTALL_RPATH is a semicolon-separated list specifying the rpath to use in installed targets (for platforms that support it). INSTALL_RPATH_USE_LINK_PATH is a boolean that if set to true will append directories in the linker search path and outside the project to the INSTALL_RPATH. SKIP_BUILD_RPATH is a boolean specifying whether to skip automatic generation of an rpath allowing the target to run from the build tree. BUILD_WITH_INSTALL_RPATH is a boolean specifying whether to link the target in the build tree with the INSTALL_RPATH. This takes precedence over SKIP_BUILD_RPATH and avoids the need for relinking before installation. INSTALL_NAME_DIR is a string specifying the directory portion of the “install_name” field of shared libraries on Mac OSX to use in the installed targets. When the target is created the values of the variables CMAKE_INSTALL_RPATH, CMAKE_INSTALL_RPATH_USE_LINK_PATH, CMAKE_SKIP_BUILD_RPATH, CMAKE_BUILD_WITH_INSTALL_RPATH, and CMAKE_INSTALL_NAME_DIR are used to initialize these properties.



(来自 set_target_properties docs)

另外,您可能想看看 CMake Wiki page for RPATH handling .

不幸的是,整个 RPATH 业务相当复杂,一个彻底的解释需要的空间远远超过 StackOverflow 答案的适当空间,但我希望这足以让您入门。

关于使用 -L 添加 link_library 时,Cmake 未设置 RPATH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25378337/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com