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

2024-03-26

按以下方式设置链接库时

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(使用前将#替换为@)

使用 -L 添加 link_library 时,Cmake 未设置 RPATH 的相关文章

  • CMake FindThreads.cmake 找不到我的 pthreads.h 标头

    我在用着android cmake http code google com p android cmake 编译 Android 应用程序 这实质上创建了一个 CMake 工具链文件 用于使用 Android NDK 提供的工具链 As
  • 将 CMake 与具有钻石依赖项的库一起使用

    假设我有四个独立的项目 三是图书馆 Common Foo and Bar 其中之一是可执行文件 App Both Foo and Bar依赖于公共库 并且App依赖于取决于Foo and Bar 此外 其中一些项目有一些脚本需要运行来生成一
  • 如何将 CMake 输出保存到文件?

    我通常可以通过以下方式保存 bash 命令的输出 gt gt output file txt 但是当我执行时cmake输出仍然发送到屏幕而不是预期的输出文件 cmake D CMAKE BUILD TYPE RELEASE D CMAKE
  • 自定义框架未加载 dyld:库未加载:@rpath/Custom.framework/

    我有一个带有多个自定义动态框架的应用程序 这意味着我使用 iOS 8 作为 Xcode 6 2 上的 SDK 我的 Mac 在优胜美地 这些框架有 Swift 源代码和资源 该应用程序是分布式企业应用程序 因此我只需创建一个 IPA 并通过
  • 调用always_inline‘_mm_mullo_epi32’时内联失败:目标特定选项不匹配

    我正在尝试使用 cmake 编译 C 程序 该程序使用 SIMD 内在函数 当我尝试编译它时 出现两个错误 usr lib gcc x86 64 linux gnu 5 include smmintrin h 326 1 错误 调用alwa
  • 如何从单独的文件下载用于 cmake 中交叉编译的工具链?

    我有一个项目 根目录中有一个 CMakeLists txt 文件 该项目在 Linux 和 OSX 上编译得很好 现在我想为 MIPS OpenWRT 交叉编译它 我想尽可能地自动化它 所以我将使用以下代码来下载工具链并设置编译器变量 Ex
  • cmake 发现错误的 python 库

    我是 CMake 新手 无法理解一些使用概念 我正在从 C 程序调用 python 脚本 include
  • 如何使用Cmake使用框架?

    对于 Macos 我想链接到一些框架 在 Windows 中 我想链接到一些库 比如OpenGL Framework 如何使用cmake表达这个需求 您可以尝试以下代码 target link libraries
  • VS 2015 命令提示符中不再找到 rc.exe

    我刚刚安装了 Windows 10 创意者更新 版本 10 0 15063 我安装了多个版本的 Visual Studio 2012 2013 2015 和 2017 我几周前才安装了 VS 2017 Problem CMake 版本 3
  • CMake 64 位和 SFML 64 位

    我正在尝试使用适用于 Windows 的 CMake 64 位和 SFML 2 5 1 64 位构建 C 项目 当我在项目上运行 cmake 时 我收到一条错误消息 我能让它工作的唯一方法是改变CMAKE PREFIX PATH指向 SFM
  • Jenkins + Cmake + JIRA = 多个相互依赖项目的 CI?

    我们的系统中有许多小项目在 Linux 上运行 Slackware 7 11 正在慢慢迁移到 RHEL 6 0 大约 50 100 个应用程序和 15 20 个库 我们几乎所有的应用程序都使用我们的一个或多个库 我们的源树看起来像这样 ap
  • fbtorch:cmake 找不到 torch 目录

    我正在尝试构建并安装 fbtorch 但是当我使用 cmake 时出现以下错误 CMake Error at CMakeLists txt 9 FIND PACKAGE By not providing FindTorch cmake in
  • 如何安装和使用 YAML-Cpp

    我想学习 YAML 并将其与 C 一起使用 但我一直在尝试设置YAML Cpp 让我解释一下到目前为止我所做的事情 我下载了源代码 版本0 5 1 安装的 Cmake 适用于 Windows 安装了 Boost 库 为 Visual Stu
  • 在cmake中检测项目语言

    我想检测当前的项目语言 例如 如果我有这样的东西 cmake minimum required VERSION 3 0 project foo VERSION 1 0 LANGUAGES CXX 我需要这样的东西 if project la
  • 将 cmake 与自定义文件生成器结合使用

    我想使用 CMake 生成混淆的 lua 文件以供交付 在我的一生中 我无法让 add custom command add custom target 为我构建这些文件 我缺少一些东西 ADD CUSTOM TARGET LUABIND
  • CXX 编译器标识未知

    我们在使用 Visual Studio 2012 在 Windows 7 64 位下使用 CMake v2 8 12 编译项目时遇到问题 CMake 给我们提供了以下错误 我们已经尝试使用管理员权限从 Visual Studio 命令行启动
  • 如何在cmake中添加cuda源代码的定义

    我使用的是 Visual Studio 2013 Windows 10 CMake 3 5 1 一切都可以使用标准 C 正确编译 例如 CMakeLists txt project Test add definitions D WINDOW
  • 如何将脚本的依赖项添加到 CMake 中的目标?

    链接我的程序后 我需要对其执行一些后处理 我添加了一个add custom command TARGET 效果很好 但是 这个额外的自定义命令运行一个脚本 未生成 它已签入代码库 并且我希望如果该脚本发生更改 目标将被视为过时 以便正确重建
  • clang-tidy - 忽略第三方标头代码

    我正在为我的项目使用 CMake 并且我想向项目引入 clang tidy 检查 我用于此目的CMAKE CXX CLANG TIDY and clang tidy用于检查设置的文件 我想在 CI 中使用警告作为错误来可靠地检查提交是否引入
  • 如何在 Windows 中使用 cmake 构建和链接 google benchmark

    我正在尝试构建 google benchmark 并使用 cmake 将其与我的库一起使用 我已经成功构建了 google benchmark 并使用 cmake 成功运行了所有测试 不幸的是 我无法使用 cmake 或 cl 将其与 Wi

随机推荐