cmake构建后处理事件

使用 CMake 构建基于 Qt 的项目 在使用 CMake 构建基于 Qt 的项目时,通常需要进行一些特定的配置来确保 Qt 库的正确使用。 阅读详情

使用add_custom_command()函数

参考官方文档:https://cmake.org/cmake/help/v3.20/command/add_custom_command.html#command:add_custom_command

之前使用Visual Studio 2010时记得有在项目配置里写后处理事件的脚本,经常遇到权限问题,那时以为是Visual Studio 2010 特别地执行后处理,但其实cmake的函数非常丰富,自带这些需求。windows平台的软件开发真得不堪回首。。。

add_custom_command()函数增加自定义的构建规则到生成的构建系统(我理解就是生成的Makefile,集成了构建系统的参数以及这里增加的自定义的构建规则)。

有两个主要的签名:

1、第一个签名用来增加一个生成输出(文件)的自定义命令

自定义命令可被用来生成源文件。例如:

add_custom_command(
  OUTPUT out.c
  COMMAND someTool -i ${CMAKE_CURRENT_SOURCE_DIR}/in.txt
                   -o out.c
  DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/in.txt
  VERBATIM)
add_library(myLib out.c)

这里增加了一个自定义命令,对生成的out.c执行somTool,然后编译生成的源文件为库的一部分。当in.txt发生改变时该生成规则将再次运行。

栗子,官网给出的Examples: Generation Files说自定义命令可被用来生成源文件。我最终尝试的结果是生成的源文件还必须参与构建目标则add_custom_command()才会被执行。

add_custom_command(
  OUTPUT cache.cpp  #Custom commands may be used to generate source files
  COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/tiny_main.cpp cache.cpp
  DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tiny_main.cpp
  VERBATIM
)
add_executable(cache cache.cpp)   #上面"生成的"输出文件OUTPUT必须作为源文件参与构建目标则add_custom_command()才会被执行
# message(STATUS "$<OUTPUT>file is: " cache.cpp)  #不作为源文件用途的其他使用都不会触发add_custom_command()被执行!

官网还介绍了cmake 3.20新增的特性:可以使用cmake的表达式来指定每个配置的输出。例如:

add_custom_command(
  OUTPUT "out-$<CONFIG>.c"
  COMMAND someTool -i ${CMAKE_CURRENT_SOURCE_DIR}/in.txt
                   -o "out-$<CONFIG>.c"
                   -c "$<CONFIG>"
  DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/in.txt
  VERBATIM)
add_library(myLib "out-$<CONFIG>.c")

这里<config>是构建配置,我尝试先message打印这个$<CONFIG>但没打印出什么东西,在cmake时也增加了比如--config、--verbose配置,这里d的$<config>配置不知道指的啥配置?

2、构建事件

第二个签名增加自定义的命令到构建目标,比如一个库或可执行程序。当要在构建目标之前或之后执行一些操作时很有用。此时该自定义命令成为所构建的目标的一部分并且只当目标本身被构建后才被执行。如果目标已经被构建过,则命令不会被执行。

add_custom_command(TARGET <target>
                   PRE_BUILD | PRE_LINK | POST_BUILD
                   COMMAND command1 [ARGS] [args1...]
                   [COMMAND command2 [ARGS] [args2...] ...]
                   [BYPRODUCTS [files...]]
                   [WORKING_DIRECTORY dir]
                   [COMMENT comment]
                   [VERBATIM] [USES_TERMINAL]
                   [COMMAND_EXPAND_LISTS])

这定义了一个与构建指定<target>相关的新的命令。<target>必须在当前目录被定义(指当前CMakeLists.txt表示的层级?);在其他目录中定义的targets可能不许指定。

命令何时发生取决于以下哪项被指定:

PRE_BUILD:在Visual Studio Generators,在target的其他规则被执行前执行。在其他生成器中,只在PRE_LINK命令之前执行;

PRE_LINK:在源文件们sources被编译之后但在链接二进制.o中间文件或执行静态库的librarian或archiver之前被执行(这是说在源文件被编译成xxx.o之后,但在链接其他.o文件或链接静态库.a或动态库.so之前)。

POST_BUILD:在target相关的所有其他规则(PRE_BUILD与PRE_LINK的规则)已被执行之后执行。

官网给出的第二个栗子:

add_library(myPlugin MODULE myPlugin.c)
add_custom_command(
  TARGET myPlugin POST_BUILD
  COMMAND someHasher -i "$<TARGET_FILE:myPlugin>"
                     --as-code "myPlugin-hash-$<CONFIG>.c"
  BYPRODUCTS "myPlugin-hash-$<CONFIG>.c"
  VERBATIM)
add_executable(myExe myExe.c "myPlugin-hash-$<CONFIG>.c")

将在链接完myPlugin后执行someHaser,比如生成包含有检查myPlugin的哈嘻的代码的一个.c文件,从而myExe可执行程序能在加载"myPlugin-hash-$<CONFIG>.c"之前验证它。这里自定义命令生成的副产品BYPRODUCTS被构建目标myExe所引用,从而构建时首先执行自定义命令。

另外比如经常需要的拷贝${PROJECT_BINARY_DIR}的targets到别处的后处理命令:

add_custom_command(
  TARGET Tutorial
  PRE_BUILD
  COMMAND echo "test POST_BUILD"
  COMMAND pwd   #就是执行cmake的目录,或者WORKING_DIRECTORY如果有的话
  COMMAND ls -l #由于是PRE_BUILD,此时目标Tutorial还没有生成
  # WORKING_DIRECTORY ${PROJECT_BINARY_DIR} #将在执行本条自定义命令时首先cd到WORKING_DIRECTORY
  COMMENT "comment: test POST_BUILD" #注释内容将在打印COMMAND输出之前首先输出
)
message(STATUS "$<CMAKE_CURRENT_SOURCE_DIR> in project: " ${CMAKE_CURRENT_SOURCE_DIR})  #/Users/haypin/cmake_tutorial/Step5
add_custom_command(TARGET Tutorial
  POST_BUILD  
  COMMAND cp ${PROJECT_BINARY_DIR}/Tutorial ${PROJECT_SOURCE_DIR}/Tutorial_bin
)

 

CMake + Ninja 构建程序示例 Ninja是一种专注于速度的小型构建系统,特别适合用于大型项目的增量编译。它最初由 Google 的工程师为加速 Chromium 浏览器的构建过程而开发,并逐渐成为一种广泛使用的替代构建工具,尤其是在配合 CMake 等高级构建配置工具时。 阅读详情

相关推荐

CMake构建工具使用教程

CMake是一个开源的、跨平台的C++构建工具。

zzy979481894的博客 3980

cmake debug 模式_cmake 管理debug release

CMake 管理项目的release 和debug一个c/c++库,在编译的时候,可以选择编译是否带调试信息,带调试信息的就是Debug版,不带调试信息的就是Release版。 在CMakeLists.txt里一般不会制定当前工程是否是Debug还是Release, 这个信息可以通过CMake的命令参数传输进去,使用方法如下:cmake 其实我们在Visual Studio的配置管理那里,可以看到...

weixin_39797324的博客 1826

CMake 构建 Qt 项目 (Linux)

我们可以使用qmake来编译Qt项目,而qmake是专门为Qt应用量身打造的构建工具,但这里我们使用CMake去构建Qt项目,毕竟CMake更强大,而且应用范围更广。

码上看世界 3728

一文读懂CMake

一文读懂CMake

CAir2的专栏 3345

CMake-GUI图形化界面管理CMake构建过程

CMake-GUI是一个基于CMake的图形用户界面,它提供了一个直观的方式来创建、配置、生成和管理项目构建系统,无需编辑CMakeLists.txt文件。对于IT行业的专业人员,特别是那些负责项目构建和集成的开发人员,CMake-GUI带来了诸多优势。CMakeLists.txt是CMake的配置脚本文件,它包含了项目构建的所有指令。它指导CMake如何处理源代码,生成适合特定平台的构建系统。每个CMake项目都至少需要一个CMakeLists.txt文件。

weixin_42591413的博客 2498

opencv读取海康威视摄像头相关配置

1、开发环境 海康威视的网络摄像头使用: 开发工具:vs2015 C++ 海康SDK 2、相关操作 下载海康威视SDK:网址:http://www.hikvision.com/cn/download_61.html • 1:对照自己的开发平台可以下载设备网络SDK_Win32设备网络SDK_Win64,解压到本地文件下: • 2:VS配置 、Opencv配置。参考址 http://blog.youkuaiyun.com/poem_qianmo/article/details/19809337 (建议自己创

HMJ115的博客 985

CMAKE常见问题及解决方案

CMAKE常见问题及解决方案

m0_73443478的博客 1051

Prometheus+Grafana部署及企业微信邮件/群消息告警通知配置

本文详细介绍了在Ubuntu 22.04系统上部署普罗米修斯监控系统的完整流程。首先说明了系统配置要求(2核CPU、4G内存、100G硬盘),然后分步骤指导下载、解压和安装普罗米修斯服务。文章包含配置prometheus.yml文件、启动服务、设置系统服务等关键操作,并提供了访问9090端口验证服务的方法。接着介绍了通过node_exporter监控Linux主机的配置过程,包括安装、启动服务和修改普罗米修斯配置文件添加监控项。最后还涉及了mysqld_exporter的部署流程,用于监控MySQL数据库服

m0_58761900的博客 1640

c++ 编译添加dll_【C++学习笔记(三)】OpenCV_contrib4.1.0,cmake编译提示缺少boostdesc_bgm.i...

点上方蓝字计算机视觉与深度学习获取更多干货在右上方···设为星标★,与你不见不散一. 错误报告的原因: Opencv_contrib 需要自己编译,我们选用的是cmake进行编译 在cmake中设置好路径,进行configure,标红了许多,提示有warning.这也是后面在VS 中install报错的原因,缺少相关的文件。c...

weixin_39976251的博客 286

XTDrone——ALOAM与3D激光雷达三维SLAM(处理没有点云和坐标系报错的问题)

本文介绍了XTDrone中配置如何在三维环境中使用A-LOAM算法配合velodyneHDL32激光雷达包括依赖包安装、代码修改和PX4系统配置,以及相关报错细节的注意事项。

weixin_45390670的博客 1327

FAA和EASA在机载电子硬件适航中的发展历史与差异

FAA和EASA在机载电子硬件的适航审查中虽然存在一些差异,但通过近年来的合作,这些差异正在逐步缩小。两者通过。

qq_41854911的博客 745

cmake编译之后产生的项目解析

cmake

贾路飞的博客 1390

华为OD机试真题2026双机位C卷 C语言 实现【明日之星选举】

给定一组选票votes。votes[i]代表第 i 张选票的内容,包含一个字符串"zhangsan,hanmei",表示推荐zhangsan为明日之星,反对 hanmei 称为明日之星。赞成或反对使用逗号(,)分割。 给定一个数组n,表示最后将筛选出赞成票最多的n个人,如果赞成票相同,则反对票越少,排序越靠前;如果赞成票和反对票都相同,则按照姓名字典序升序排序。

MISAYAONE的博客 184

【CMake】CMake构建项目入门

本文介绍了CMake跨平台构建工具的基本使用方法。首先讲解了CMake的安装(Ubuntu系统)和版本检查,然后通过Hello World示例演示了完整的构建流程:创建CMakeLists.txt配置文件,使用PROJECT、SET、MESSAGE、ADD_EXECUTABLE等核心指令,以及内部/外部构建方式的区别。重点解析了CMake语法规则,包括变量引用、指令参数格式等注意事项。最后建议完善工程结构,添加src源代码目录、doc文档目录和README等文件。文章配有详

Antonio915的博客 1694

SPD-Conv+YOLOv8:空间深度转换卷积赋能小目标检测,从原理到实战的科研级优化指南

从理解SPD-Conv“空间到深度+逐步卷积”的核心设计,到亲手将其嵌入YOLOv8并验证在小目标场景的表现,再到基于此探索属于自己的科研与工程方向——这个过程能让你深刻理解“小目标特征保留”在检测任务中的核心价值。现在就开始行动,相信你会在小目标检测的“细节捕捉”之路上,走出一条属于自己的技术路径。实验通常会证明:嵌入SPD-Conv后,YOLOv8在小目标AP上提升5-8个百分点,mAP50-95提升3-5个百分点,而推理速度仅下降5%以内,充分体现了其“保细节+提精度”的优势。

m0_64661770的博客 163

推荐系统[九]项目技术细节讲解z2:搜索Query理解[Term Weight、Query 改写、同义词扩写]和语义召回技术

在 pooling 方法上,我们也尝试过不同层 pooling,或者在多层上增加 attention 聚合 BERT 多层结果,效果和最后一层所有 token 做 average pooling 相当。损失函数方面,在排序阶段使用pairwise比 pointwise 损失函数的效果会更好。

丨汀、的博客 1109

CMake构建工具

CMake 是一个跨平台的开源构建工具,用于管理和构建 C++ 项目。它允许开发人员使用简单的配置文件来描述项目的构建过程,然后根据这些配置文件生成特定于平台的构建系统(如 Makefile、Visual Studio 项目等),从而实现跨平台的项目构建。跨平台性:CMake 可以生成适用于各种操作系统和构建工具的构建文件,包括 Linux、Windows、macOS 等,以及各种编译器和 IDE。简单的配置文件。

qq_51482778的博客 2616

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

CMake自定义命令终极指南:掌握文件生成与构建事件触发机制

CMake自定义命令是构建系统中实现灵活文件生成和构建事件触发的核心功能。无论您需要生成配置文件、处理资源文件,还是在构建前后执行特定操作,`add_custom_command`命令都能提供强大的解决方案。本文将详细介绍CMake自定义命令的两种主要用法:文件生成和构建事件触发,帮助您掌握这一关键构建工具。 ## 什么是CMake自定义命令? CMake自定义命令允许您在构建过程中执行任意命

gitblog_00257的博客 1095

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

CMake构建

文章目录CMake是用来干啥的?Ubuntu安装CMake一、CMake构建的简单使用:Helloworld二、CMake构建:多源文件初级:少数源文件 add_executable()进阶:更多源文件 aux_source_directory() 或 set()三、CMake构建:多目录多源文件新命令:include_directories()四、CMake构建:正规组织结构方式一:两个CMakeLists.txt方式二:一个CMakeLists.txt五、CMake构建:编译动态库和静态库六、CMake

似水流年 2884

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

CMake工程构建详解

CMake: 使用简单方便,可以跨平台,构建项目编译环境。比直接写Makefile简单(在构建大型工程编译时,需要写大量的文件依赖关系),可以通过简单的CMake配置生成负责的本地Makefile文件,一个命令便将我们项目想编译的可执行文件、静态库、动态库都编译出来了。而且配置文件可以直接拿到其它平台上使用,无需修改,非常方便。1、:通过 project() 指定项目名称;2、:工程的根目录;3、:执行 cmake 命令的目录;4、:当前 CMakeList.txt 文件所在的目录;

FLM19990626的博客 3116

CMake之构建配置

cmake构建目标文件,以及构建目标文件的属性设置等

u010378559的博客 4347

Qt Creator + CMake 构建教程

Qt 6 以下的版本使用构建可能会存在一些问题。

falwat的专栏 8165

【CMake】《CMake构建实战:项目开发卷》笔记-Chapter6-CMake构建初探

从本章开始,我们不再仅仅停留在CMake脚本程序中,而是开始将CMake看作一个用于构建项目的利器了。在了解CMake的具体用法之前,先要清楚地掌握CMake项目的构建流程。换句话说,就是要清楚地掌握CMake项目的生命周期——从源程序和CMake目录程序,到构建好的二进制文件,再到这些二进制文件的安装和打包分发,最终到其他项目的源程序借助CMake使用这些二进制文件提供的功能。本章会说明CMake是怎样实现这样一个生命周期的,重点介绍其构建项目过程中的6个阶段,尤其是与构建紧密相关的阶段。

江湖人称菠萝包 1644

CMake入门:使用CMake构建项目

CMake通过CMakelist进行项目构建,它是一个跨平台的工具,只需要一份CMakelist就可以在全平台构建项目,CMake会控制对应构建系统(如Makefile或Ninja)完成构建,非常方便。本文以Clion新建项目生成的cmakelist和开源项目RT-Thread所构建的cmakelist做为示例进行介绍。

M676398701的博客 1798

Cmake项目构建教程

project定义项目的名称和语言,MyProject是项目的名称,它会被赋值给cmake的预定义变量 ${PROJECT_NAME},并且可以在整个 CMakeLists.txt 文件中使用这个变量来引用项目名称。在这个例子中,表示项目使用C和C++语言。除了包含example目录的源文件外,需要再将子目录demo加到变量中,使用include_directories指定编译器在编译源文件时搜索头文件的路径(仅影响项目路径,不影响生成的构建目标),最后使用add_library生成一个当前目录的库。

qq_32634339的博客 1575
上一篇: C++编译链接的理解与static修饰全局函数
下一篇: OpenCV Error: Assertion failed (total >= 0 && (depth == 4 || depth == 5)) in pointPolygonTest
HayPinF
博客等级 码龄9年 175粉丝 140原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值