2401cmake,学习cmake4

步10:增加生成式

生成器式是在构建系统生成时,执行的用来生成特定配置专有信息的工具.

可在诸如LINK_LIBRARIES,INCLUDE_DIRECTORIES,COMPILE_DEFINITIONS等许多目标属性内容中使用生成式.

也可在如target_link_libraries(),target_include_directories(),target_compile_definitions()等使用命令的属性时使用生成式.

可用生成式来启用条件链接,编译时定义条件,条件包含目录等.条件可基于构建配置,目标属性,平台信息或其他可查询信息.

生成式有包括逻辑式,信息式和输出式等不同类型.
逻辑式用来创建条件输出.基本式是01式,$<0:...>结果是个空串,$<1:...>结果是"..."的内容.同样都可嵌套.

一般用来根据不同条件来添加编译器标志,如语言级警告.好的模式是把这些信息和允许传播这些信息INTERFACE目标关联起来.

从构建一个INTERFACE目标,并指定需要C++11标准级别,而非CMAKE_CXX_STANDARD开始.
下述代码,把:

//指定`C++`标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

替换为:

add_library(tutorial_compiler_flags INTERFACE)
target_compile_features(tutorial_compiler_flags INTERFACE cxx_std_11)

下一步添加项目期望的编译器警告标志.因为警告标志基于编译器,用COMPILE_LAND_AND_ID生成器式,来控制在给定语言和一系列编译器id下,使用哪些标志.如下:

set(gcc_like_cxx "$")
set(msvc_cxx "$")
target_compile_options(tutorial_compiler_flags INTERFACE"$<${gcc_like_cxx}:$>""$<${msvc_cxx}:$>"
)

可见在BUILD_INTERFACE条件内封装警告信息.这样可让安装项目用户不会继承警告标志.

练习,修改MathFunctions/CMakeLists.txt,使所有目标都有调用tutorial_compiler_flagstarget_link_libraries().

步11增加导出配置

第四步中,为CMake增加了安装库和头文件的功能.第七步增加了打包这些信息以发布其他人的能力.

下一步是增加必要信息,使其他CMake项目无论是构建目录,本地安装还是按包,都可用我们的项目.

第一步是更新install(TARGETS)命令,来不仅指定DESTINATION也指定EXPORT.

EXPORT关键字生成,一个含有可导入安装树中,安装命令列举的所有目标代码的CMake文件.于是可通过更新MathFunctions/CMakeLists.txt里的install命令,来显式导出(EXPORT)MathFunctions库:

set(installable_libs MathFunctions tutorial_compiler_flags)
if(TARGET SqrtLibrary)list(APPEND installable_libs SqrtLibrary)
endif()
install(TARGETS ${installable_libs}DESTINATION libEXPORT MathFunctionsTargets)
install(FILES MathFunctions.h DESTINATION include)

现在已导出了MathFunctions,也需要显式安装生成的MathFunctionsTargets.cmake文件.可在顶级CMakeLists.txt底部添加:

install(EXPORT MathFunctionsTargetsFILE MathFunctionsTargets.cmakeDESTINATION lib/cmake/MathFunctions
)

这时应试运行CMake.如果都正确设置了,CMake应该会如下报错:

在源目录前缀中,
Target "MathFunctions" INTERFACE_INCLUDE_DIRECTORIES property contains
path:"/Users/robert/Documents/CMakeClass/Tutorial/步11/MathFunctions"

CMake报错描述的是,生成导出信息时,会导出在其他设备上可能无效的绑定到当前设备内在路径.
方法是更新MathFunctionstarget_include_directories(),以明确在构建目录安装包使用时需要的不同INTERFACE位置.

即应如下修改MathFunctions中的target_include_directories()调用:

target_include_directories(MathFunctionsINTERFACE $ $)

更新后,就可重新运行CMake,且不再有警告了.

这里,已配置CMake打包好了期望目标信息.但是仍需要生成MathFunctionsConfig.cmake,来使CMakefind_package()可找到我们的项目.

所以继续在顶级项目下,创建名为Config.cmake.in的文件,并写入:

@PACKAGE_INIT@
include ( "${CMAKE_CURRENT_LIST_DIR}/MathFunctionsTargets.cmake" )

然后为了正确配置安装该文件.在顶级CMakeLists.txt尾写入:

install(EXPORT MathFunctionsTargetsFILE MathFunctionsTargets.cmakeDESTINATION lib/cmake/MathFunctions
)
include(CMakePackageConfigHelpers)
//生成包含导出的配置文件
configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in"${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsConfig.cmake"INSTALL_DESTINATION "lib/cmake/example"NO_SET_AND_CHECK_MACRONO_CHECK_REQUIRED_COMPONENTS_MACRO
)
//生成配置文件的版本文件
write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsConfigVersion.cmake"VERSION "${Tutorial_VERSION_MAJOR}.${Tutorial_VERSION_MINOR}"COMPATIBILITY AnyNewerVersion
)
//安装配置文件
install(FILES${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsConfig.cmakeDESTINATION lib/cmake/MathFunctions
)

这里,已生成了可重定位的且可在安装或打包项目后使用的CMake配置.如果想在构建目录中使用项目.只需要在顶级CMakeLists.txt尾添加:

export(EXPORT MathFunctionsTargetsFILE "${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsTargets.cmake"
)

有此导出,生成MathFunctionsTargets.cmake后,其他项目可无需安装就使用,在构建目录里配置好的MathFunctionsConfig.cmake.

步12:打包DebugRelease

注意,该示例仅对单配置生成器有效.而对多配置生成器无效(如VS)

默认,CMake模型是只包含一个配置构建目录,也就是Debug,Release,MinSizeRelRelWithDebInfo等的构建目录.

但是是可通过CPack打包多个构建目录,及构建一个同一项目包含多个配置的包.

首先,要确认debugrelease构建使用不同的可执行和库名字.使用d作为调试的可执行和库的后缀.

在顶级CMakeLists.txt文件的开头设置CMAKE_DEBUG_POSTFIX:

set(CMAKE_DEBUG_POSTFIX d)
add_library(tutorial_compiler_flags INTERFACE)

tutorial的可执行文件添加DEBUG_POSTFIX属性:

add_executable(Tutorial tutorial.cxx)
set_target_properties(Tutorial PROPERTIES DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX})
target_link_libraries(Tutorial PUBLIC MathFunctions)

并给MathFunctions库添加版本号.在MathFunctions/CMakeLists.txt设置VERSIONSOVERSION属性:

set_property(TARGET MathFunctions PROPERTY VERSION "1.0.0")
set_property(TARGET MathFunctions PROPERTY SOVERSION "1")

步12目录,创建debugrelease子目录,结构如下:

-12- debug- release

现在设置debugrelease构建.可用CMAKE_BUILD_TYPE来设置配置类型:

cd debug
cmake -DCMAKE_BUILD_TYPE=Debug ..
cmake --build .
cd ../release
cmake -DCMAKE_BUILD_TYPE=Release ..
cmake --build .

现在已完成了构建debugrelease.可用自定义配置文件同一发布包中打包构建两个.在步12目录里,创建叫MultiConfig.cmake的文件.在文件中,首先包含cmake创建的默认配置文件.

接着,用CPACK_INSTALL_CMAKE_PROJECTS变量来指定安装哪个项目.这时,想安装debugrelease两个版本:

include("release/CPackConfig.cmake")
set(CPACK_INSTALL_CMAKE_PROJECTS"debug;Tutorial;ALL;/""release;Tutorial;ALL;/"
)

步12目录下,运行cpack命令,通过config选项来指定自定义配置文件:

cpack --config MultiCPackConfig.cmake

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/660562.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

校园二手交易小程序|基于微信小程序的闲置物品交易平台设计与实现(源码+数据库+文档)

校园二手交易小程序目录 目录 基于微信小程序的闲置物品交易平台设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、商品信息管理 3、公告信息管理 4、论坛信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕…

Vue之前端Broadcast Channel API的简单使用

前端Broadcast Channel API的简单使用 Broadcast Channel API 是一个用于在不同窗口或标签页之间进行通信的 API。它允许一个页面向另一个页面发送消息&#xff0c;这些页面可以在同一浏览器实例中打开&#xff0c;或者在不同的浏览器实例中打开。 以下是 Broadcast Channel …

R语言基础学习-02 (此语言用途小众 用于数学 生物领域 基因分析)

变量 R 语言的有效的变量名称由字母&#xff0c;数字以及点号 . 或下划线 _ 组成。 变量名称以字母或点开头。 变量名是否正确原因var_name2.正确字符开头&#xff0c;并由字母、数字、下划线和点号组成var_name%错误% 是非法字符2var_name错误不能数字开头 .var_name, var.…

蓝桥杯备战——11.NE555测频

1.分析原理图 我们可以看到&#xff0c;上图就是一个NE555构建的方波发生电路&#xff0c;输出方波频率1.44/2(R8Rb3)C,如果有不懂NE555内部结构&#xff0c;工作原理的&#xff0c;可以到B站学习。实在不懂仿真也行&#xff0c;比如我下面就是仿真结果&#xff1a; 然后就是下…

与数组相关经典面试题

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

su导入3d模型为什么不圆滑---模大狮模型网

在将SU(SketchUp)模型导入到其他3D软件中时&#xff0c;可能会遇到模型没有圆滑的情况。这可能是由于以下原因&#xff1a; 模型导出设置不正确&#xff1a;在导出SU模型时&#xff0c;需要确保正确选择导出设置。例如&#xff0c;在导出为.obj格式时&#xff0c;需要选择正确的…

免费的ChatGPT网站 ( 7个 )

ChatGPT的核心功能是基于用户在输入时的语言或文本生成相应的回复或继续内容。此外&#xff0c;它还能够完成多种任务&#xff0c;如撰写邮件、视频脚本、文案、翻译、代码编写以及撰写论文等。 博主归纳总结了7个国内非常好用&#xff0c;而且免费的chatGPT网站&#xff0c;AI…

信息安全风险评估

本文已收录至《全国计算机等级考试——信息 安全技术》专栏 简介 信息安全风险评估从早期简单的漏洞扫描、人工审计、渗透性测试这种类型的纯技术操作&#xff0c;逐渐过渡到目前普遍采用国际标准的BS7799、ISO17799、国家标准《信息系统安全等级评测准则》等方法&#xff0c;…

Unity 访问者模式(实例详解)

文章目录 实例1&#xff1a;简单的形状与统计访客实例2&#xff1a;游戏对象组件访问者实例4&#xff1a;Unity场景对象遍历与清理访客实例5&#xff1a;角色行为树访问者 访问者模式&#xff08;Visitor Pattern&#xff09;在Unity中主要用于封装对一个对象结构中各个元素的操…

VS之调用程序对DLL中全局变量的使用

接上篇《VS生成C动态链接库DLL》&#xff0c;能够生成DLL&#xff0c;且能调用后&#xff0c;遇到一个问题&#xff0c;即在DLL程序中定义了一些全局变量&#xff0c;应用程序需要使用&#xff0c;本以为可以直接使用&#xff0c;没想到&#xff0c;还是需要设置才可以&#xf…

秦始皇帝陵K0007陪葬坑文物展览与文物预防性保护的璀璨交汇

秦始皇帝陵博物院近日迎来了一场引人注目的展览——“何止秦俑——秦陵苑囿之K0007陪葬坑”。此次展览首次集中展示了K0007陪葬坑出土的别具一格的陶俑、鲜活灵动的青铜水禽等珍贵文物。然而&#xff0c;这些文物的安全展出离不开高科技的监测平台与实时终端的24小时不间断保护…

搜维尔科技:第九届元宇宙数字人大赛,参赛小组报名确认公告!

各位参赛选手大家好&#xff0c;近期已收到新增报名信息如下表&#xff0c;请各位参赛选手确认&#xff0c;如果信息有误或信息不完整请电话联系赛务组工作人员进行更正 随着元宇宙时代的来临&#xff0c;数字人设计成为了创新前沿领域之一。为了提高大学生元宇宙虚拟人角色策划…

Asp.net移除Server, X-Powered-By, 和X-AspNet-Version头

移除X-AspNet-Version很简单,只需要在Web.config中增加这个配置节: <httpRuntime enableVersionHeader"false" />移除Server在Global.asax文件总增加&#xff1a; //隐藏IIS版本 protected void Application_PreSendRequestHeaders() {HttpContext.Current.Res…

GolangCI-Lint配置变更实践

GolangCI-Lint配置变更实践 Golang编程中&#xff0c;为了便于调试和代码质量和安全性检查。利用该方法可以在开发周期的早期捕获错误&#xff0c;并且检查团队编程风格&#xff0c;提高一致性。这对团队协作开发特别有用&#xff0c;可以提高开发的效率&#xff0c;保持代码质…

熟悉MATLAB 环境

一、问题描述 熟悉MATLAB 环境。 二、实验目的 了解Matlab 的主要功能&#xff0c;熟悉Matlab 命令窗口及文件管理&#xff0c;Matlab 帮助系统。掌握命令行的输入及编辑&#xff0c;用户目录及搜索路径的配置。了解Matlab 数据的特点&#xff0c;熟悉Matlab 变量的命名规则&a…

巨人踏步,港口自动驾驶提速向前打开行业新空间

按照吞吐量排名&#xff0c;全世界最大的50个港口&#xff0c;中国占了29个。在中国的港口和码头上&#xff0c;一场进化正在发生&#xff1a;人在这个生态中占的比重越来越少&#xff0c;技术接管的要素正在越来越多。像是最具代表性的全球综合自动化程度最高的码头——上海洋…

Unity_Render Pipeline

Unity_Render Pipeline 目录 Unity_Render Pipeline Unity管线的不同点: 渲染管线平台支持对比:

vue-cli项目运行流程介绍

一、前言 ​ 本文介绍 vue-cli搭建的项目运行流程&#xff0c;基于已经搭建好的基础项目。关于 vue-cli 构建项目的详细流程&#xff0c;可参考博文&#xff1a;使用vue脚手架构建项目 二、main.js 项目运行 会加载入口文件 main.js /* html文件中&#xff0c;通过script …

Linux部署DataEase数据分析工具并结合内网穿透实现任意设备远程查看数据

文章目录 前言1. 安装DataEase2. 本地访问测试3. 安装 cpolar内网穿透软件4. 配置DataEase公网访问地址5. 公网远程访问Data Ease6. 固定Data Ease公网地址 前言 DataEase 是开源的数据可视化分析工具&#xff0c;帮助用户快速分析数据并洞察业务趋势&#xff0c;从而实现业务…

基于STM32的云上OneNET智慧大棚(包含程序设计报告)

目录 概要 作品介绍 设计原理 设计作品结构 软件部分 概要 为了解决传统农业生产效率低下&#xff0c;消耗大量的人力物力&#xff0c;不能精确的对农作物实现监控的问题&#xff0c;从而最大限度的提高农业生产力&#xff0c;实现优质、高产、低耗、环保的可持续发展物联…