之后如何使导入的目标成为GLOBAL?

2023-12-26

来自FindBoost.cmakeCMake 3.8的模块:

foreach(COMPONENT ${Boost_FIND_COMPONENTS})
  if(_Boost_IMPORTED_TARGETS AND NOT TARGET Boost::${COMPONENT})
    string(TOUPPER ${COMPONENT} UPPERCOMPONENT)
    if(Boost_${UPPERCOMPONENT}_FOUND)
      if(Boost_USE_STATIC_LIBS)
        add_library(Boost::${COMPONENT} STATIC IMPORTED)
      else()
        # Even if Boost_USE_STATIC_LIBS is OFF, we might have static
        # libraries as a result.
        add_library(Boost::${COMPONENT} UNKNOWN IMPORTED)
      endif()

以及相应的评论该模块的文档 https://cmake.org/cmake/help/v3.8/module/FindBoost.html:

需要注意的是,导入的目标的行为与此模块创建的变量不同:在同一目录或具有不同选项(例如静态或共享)的子目录中多次调用 find_package(Boost) 不会覆盖目标的值由第一次调用创建。

我看到不设定目标的合理性GLOBAL.

然而,使它们全球化的首选方式是什么?

我习惯于在子目录中定义项目的依赖项,包括任何find_package(...)来电。因此,Boost 导入的目标在其他目录中不可用,例如/tests/CMakeLists.txt:

<project_root>
  /3rdparty
    /git-submodule-of-a-small-lib
    /CMakeLists.txt
  /include
    /...
  /tests
    /CMakeLists.txt
  /CMakeLists.txt

有一个IMPORTED_GLOBAL https://cmake.org/cmake/help/latest/prop_tgt/IMPORTED_GLOBAL.htmlCMake >= 3.11 中的目标属性:

set_target_properties(Boost::unit_test_framework PROPERTIES IMPORTED_GLOBAL TRUE)

对于旧版本:find_package()使用标准add_library()调用,因此您可以随时更改/扩展其功能以拥有IMPORTED始终有目标GLOBAL类似的东西:

3rdparty\CMakeLists.txt

function(add_library)
    set(_args ${ARGN})
    if ("${_args}" MATCHES ";IMPORTED")
        list(APPEND _args GLOBAL)
    endif()
    _add_library(${_args})
endfunction()

find_package(Boost REQUIRED COMPONENTS unit_test_framework)

免责声明

正如 @CraigScott 评论的那样,覆盖 CMake 的内置函数是危险的:

  • [CMake] 使用函数重写时无限循环 https://cmake.org/pipermail/cmake/2011-March/043320.html
  • CMake 问题 #14357:多次定义 add_library 的覆盖宏/函数会导致分段错误 https://gitlab.kitware.com/cmake/cmake/issues/14357

参考

  • CMake 问题 #1254:添加新的目标属性IMPORTED_GLOBAL https://gitlab.kitware.com/cmake/cmake/merge_requests/1254
  • CMake 问题 #1222:[线程、Boost] 创建具有 GLOBAL 范围的 IMPORTED 目标的选项 https://gitlab.kitware.com/cmake/cmake/merge_requests/1222
  • CMake 问题 #17256:可以将 IMPORTED 目标提升为 IMPORTED GLOBAL https://gitlab.kitware.com/cmake/cmake/issues/17256
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

之后如何使导入的目标成为GLOBAL? 的相关文章

随机推荐

  • 想要通过在 swift 中使用滑动手势在选项卡栏之间导航

    我想使用滑动手势在选项卡栏控制器之间导航 同时保留默认选项卡栏 我使用了这段代码 但显示错误 import UIKit class FirstViewController UIViewController override func vie
  • 模拟指标有什么影响?

    使用 xib 文件时 更改模拟指标会对您的代码 应用程序产生什么影响 或者它只是为了您的利益而作为预览工具 实际上 更改模拟指标确实会以一种非常隐蔽的方式影响您的应用程序 我发现在使用 SwipeView 库时 我的幻灯片都受到更改模拟指标
  • Ubuntu 上的 Haskell (GHC) 中的线程延迟问题

    我注意到我的一些机器上 GHC Conc 中的 threadDelay 函数有奇怪的行为 以下程序 main do print start threadDelay 1000 1000 print done 正如预期的那样 运行需要 1 秒
  • 使用BackgroundWorker处理多个操作

    我在 winform 上有一个 DataGridView 我在表单的加载方法中动态添加 DatagridViewButtonColumn 按钮名称为 btnAction 文本显示为 Process 因此 网格中的每一行的最后一列都会有此 处
  • 使用导航视图菜单项上的选择器添加自定义形状波纹

    我想添加带有圆角矩形的波纹效果以及导航视图项目的选择器 但它不断添加灰色矩形波纹效果 导航视图
  • Chrome 的“跨源读取阻止 (CORB) 阻止了跨源响应”离子

    我正在尝试对用户进行身份验证 但由于以下原因我无法调用 Api跨源读取阻止 CORB 被阻止问题我的login ts代码是 if this plugins isOnline if this wait true return else if
  • 如何在c#中找到驱动器的空闲百分比

    如何在c 中找到驱动器的百分比 例如 如果 c 为 100 GB 并且已用空间为 25 GB 则可用百分比应为 75 Use the DriveInfo class http msdn microsoft com en us library
  • Facebook Webforms 应用程序获取 app_data 查询字符串

    如何从 Facebook Webforms 应用程序获取 app data 查询字符串 我希望能够在查询字符串中发送一些信息 以便我可以在我的应用程序上显示不同的主屏幕 该应用程序位于页面选项卡中 例子 如何从 app data 获取 Pa
  • 显示图像并转换为灰度 - OpenCV for Android、Java API

    我正在 Eclipse 中编写一个 Android 应用程序 它使用OpenCV4Android http code opencv org projects opencv wiki OpenCV4AndroidAPI 我怎样才能显示一个Ma
  • 从 C++ 本机插件更新 Vector3 数组

    Marshal Copy 方法仅支持少数数组类型 现在我只知道如何复制IntPtr 从 C 代码指向浮点数组 float IntPtr pvertices GetVerticesFromCPP float vertices new floa
  • 使用 linq 删除代码时出现错误

    我遇到有关使用组合框删除数据的问题 该错误提示我不知道如何解决 任何人都可以帮助我吗 private void btnDel Click object sender EventArgs e using testEntities Setupc
  • ByVal 与 ByRef VBA

    我尝试过 JaredPar 回答的问题ByRef 与 ByVal 说明 https stackoverflow com questions 4383167 byref vs byval clarification ByVal在 VB NET
  • ant 构建文件设置 javac 位置

    我正在编辑一个旧项目的构建文件 当我向使用 Java 1 6 的项目添加一些 jar 文件时 它不会构建 它说 javac javac invalid target release 1 6 很明显 我需要告诉 ant 构建文件使用 java
  • 在 C++0x 中专门化 lambda 模板

    我编写了一个特征类 它可以让我提取有关 C 0x 中函数或函数对象的参数和类型的信息 使用 gcc 4 5 0 进行测试 一般情况处理函数对象 template
  • linux下可以分配大容量的虚拟内存吗?

    对于某些目的来说 分配大量的虚拟空间并仅在访问的页面中进行分页会很有效 分配大量内存是瞬时的 并且不会实际抓取页面 char p new char 1024 1024 1024 256 好吧 上面指出的是错误的 因为它是一个 32 位数字
  • Python 评估错误

    x 5 print eval x 1 builtins None 出现错误 TypeError NoneType object is not subscriptable 为什么我会出现上述错误 另外 如何为 eval 函数指定几个内置方法
  • Ruby、Mac、Geektool 问题,文件访问权限?

    我有一个内置的 Ruby 脚本TextMate http en wikipedia org wiki TextMate并可以在TextMate中成功运行 我还可以直接从终端成功运行此脚本 该脚本中有这样一段代码 Get the XML fi
  • Struts 2.0从服务器下载文件

    我已经创建了下载方法来从服务器端下载文件到客户端 但是出现了此错误 文件已成功下载到客户端 但我有此错误 所以我无法正确返回到上一页 这是我的错误 SEVERE Servlet service for servlet default thr
  • 如何传递表值参数

    我试图将表值参数传递给存储过程 但我不断收到异常 见下文 SqlCommand c new SqlCommand getPermittedUsers myConn CommandType CommandType StoredProcedur
  • 之后如何使导入的目标成为GLOBAL?

    来自FindBoost cmakeCMake 3 8的模块 foreach COMPONENT Boost FIND COMPONENTS if Boost IMPORTED TARGETS AND NOT TARGET Boost COM