CMake的学习之路
目录
一、基础命令
二、编译选项和设置
三、文件和目录操作
四、控制流命令
五、其他命令
六、CMake构建级别
CMake是一个跨平台的自动化建构系统,它使用一种人类可读的配置文件(CMakeLists.txt)来控制软件编译过程。以下是CMake中的一些常用命令,按照功能和类型进行分类:
一、基础命令
cmake_minimum_required:指定CMake的最低版本要求。
示例:cmake_minimum_required(VERSION 3.10)
project:定义项目的名称和版本。
示例:project(MyProject VERSION 1.0)
add_executable:将源代码文件编译为可执行文件。
示例:add_executable(my_program main.cpp)
add_library:将源代码文件编译为库文件。SHARED表示动态库,STATIC表示静态库。
示例:add_library(my_lib SHARED my_lib.cpp)
MESSAGE:在CMake配置过程中打印信息。
示例:MESSAGE(STATUS "This is a status message.")
set:为变量设置值。
示例:set(MY_VARIABLE "some_value")
install:安装文件到指定的目录。install的安装可以包括:二进制、动态库、静态库以及文件、目录、脚本等。
示例:install(TARGETS my_program DESTINATION bin)
二、编译选项和设置
add_definitions:向C/C++编译器添加-D定义。
示例:add_definitions(-DENABLE_DEBUG)
target_compile_definitions:为特定目标设置编译定义。
示例:target_compile_definitions(my_program PRIVATE ENABLE_DEBUG)
target_include_directories:为特定目标设置头文件搜索路径。
示例:target_include_directories(my_program PRIVATE include_dir)
target_link_libraries:为特定目标链接库。
示例:target_link_libraries(my_program PRIVATE another_lib)
三、文件和目录操作
file:用于文件操作,如读取、写入、复制等。
示例:file(GLOB SRC_LIST "./src/*.cpp")
aux_source_directory:搜索指定目录中的源文件。
示例:aux_source_directory(. SRC_LIST)
add_subdirectory:将另一个CMakeLists.txt文件添加到构建中。
示例:add_subdirectory(subdirectory)
四、控制流命令
if:条件语句。
示例:if(UNIX)
while 和 foreach:循环语句,但CMake中较少使用。
五、其他命令
include:包含其他CMake文件。
示例:include(OtherCMakeLists.txt)
configure_file:配置文件模板,并替换其中的变量。
find_package 和 find_library:搜索并加载外部库或包。
add_test 和 enable_testing:添加测试目标和启用测试。
CMake语法指定了许多变量如下:
注意:
- 变量使用${}方式取值,但是在 IF 控制语句中是直接使用变量名
- 指令是大小写无关的,参数和变量是大小写相关的
- 指令(参数 1 参数 2…) 参数使用括弧括起,参数之间使用空格或分号分开。例如:add_executable(hello main.cpp func.cpp)或者add_executable(hello main.cpp;func.cpp)
- set(SRC_LIST main.cpp) 可以写成 set(SRC_LIST “main.cpp”),如果源文件名中含有空格,就必须要加双引号
- add_executable(hello main) 后缀可以不写,他会自动去找.c和.cpp,最好不要这样写,可能会有这两个文件main.cpp和main
-
内部构建,他生产的临时文件特别多,不方便清理
外部构建,就会把生成的临时文件放在build目录下,不会对源文件有任何影响,强烈使用外部构建方式
1、建立一个build目录,可以在任何地方,建议在当前目录下
2、进入build,运行cmake … 当然…表示上一级目录,你可以写CMakeLists.txt所在的绝对路径,生产的文件都在build目录下了
3、在build目录下,运行make来构建工程
六、CMake构建级别
CMake具有许多内置的构建配置,可用于编译工程。 这些配置指定了代码优化的级别,以及调试信息是否包含在二进制文件中。这些优化级别,主要有:
Release —— 不可以打断点调试,程序开发完成后发行使用的版本,占的体积小。 它对代码做了优化,因此速度会非常快,在编译器中使用命令: -O3 -DNDEBUG 可选择此版本。
Debug ——调试的版本,体积大。在编译器中使用命令: -g 可选择此版本。
MinSizeRel——最小体积版本。在编译器中使用命令:-Os -DNDEBUG可选择此版本。
RelWithDebInfo—— 既优化又能调试。在编译器中使用命令:-O2 -g -DNDEBUG可选择此版本。
在命令行运行CMake的时候, 使用cmake命令行的-D选项配置编译类型
cmake .. -DCMAKE_BUILD_TYPE=Release
示例:
cmake_minimum_required(VERSION 3.5)
#如果没有指定则设置默认编译方式
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)#在命令行中输出message里的信息message("Setting build type to 'RelWithDebInfo' as none was specified.")#不管CACHE里有没有设置过CMAKE_BUILD_TYPE这个变量,都强制赋值这个值为RelWithDebInfoset(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the type of build." FORCE)# 当使用cmake-gui的时候,设置构建级别的四个可选项set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release""MinSizeRel" "RelWithDebInfo")
endif()project (build_type)
add_executable(cmake_examples_build_type main.cpp)
相关文章:
CMake的学习之路
目录 一、基础命令 二、编译选项和设置 三、文件和目录操作 四、控制流命令 五、其他命令 六、CMake构建级别 CMake是一个跨平台的自动化建构系统,它使用一种人类可读的配置文件(CMakeLists.txt)来控制软件编译过程。以下是CMake中的一些…...
算法体系-22 第二十二节:暴力递归到动态规划(四)
一 最小距离累加和 1.1 描述 给定一个二维数组matrix,一个人必须从左上角出发,最后到达右下角 沿途只可以向下或者向右走,沿途的数字都累加就是距离累加和 返回最小距离累加和 1.2 分析...
Docker:利用Docker搭建一个nginx服务
文章目录 搭建一个nginx服务认识nginx服务Web服务器反向代理服务器高性能特点 安装nginx启动nginx停止nginx查找nginx镜像拉取nginx镜像,启动nginx站点其他方式拉取nginx镜像信息通过 DIGEST 拉取镜像 搭建一个nginx服务 首先先认识一下nginx服务: NGI…...
docker Pulling fs layer 含义
在使用Docker时,当你执行 docker pull 命令来获取一个新的镜像,控制台输出中可能会出现 "Pulling fs layer" 的信息。这是Docker拉取镜像过程中的一个步骤,下面是对这一过程的解释: Docker 镜像是由一系列的层…...
c#中上传超过30mb的文件,接口一直报404,小于30mb的却可以上传成功
在一次前端实现上传视频文件时,超过30mb的文件上传,访问接口一直报404,但是在Swagger中直接访问接口确是正常的,且在后端控制器中添加了限制特性,如下 但是却仍然报404,在apifox中请求接口也是报404, 网上说: 在ASP.NET Core中,配置请求过来的文件上传的大小限制通常…...
VRRP跟踪接口及认证(华为)
#交换设备 VRRP跟踪接口及认证 一、相关概念 1.VRRP跟踪接口 当 VRRP 的 Master 设备的上行接口出现问题, 而 Master 设备一直保持 Active 状态,那么就会导致网络出现中断,所以必须要使得 VRRP 的运行状态和上行接口能够关联。在配置了 VRRP 元余的网…...
梯度提升树GBDT系列算法
Boosting方法的基本元素与基本流程💫 在Boosting集成算法当中,我们逐一建立多个弱评估器(基本是决策树),并且下一个弱评估器的建立方式依赖于上一个弱评估器的评估结果,最终综合多个弱评估器的结果进行输出…...
探索智慧农业系统架构的设计与应用
随着科技的不断进步和农业现代化的推进,智慧农业正逐渐成为农业发展的重要趋势。智慧农业系统架构的设计与应用,将农业生产与信息技术相结合,为农业生产提供了新的思路和解决方案。本文将深入探讨智慧农业系统架构的设计与应用,从…...
【C语言】一篇文章带你深度理解函数
目录 1. 函数的概念 2. 库函数 2.1 标准库和头文件 2.2 库函数的使用方法 2.2.1 举例 sqrt 2.2.2 库函数文档的一般格式 3. 自定义函数 3.1 函数的语法形式 3.2 函数的举例 4. 形参和实参 4.1 实参 4.2 形参 4.3 实参和形参的关系 5. …...
荣耀手机删除系统APP
1、打开开发者模式 设置–系统–关于手机–快速多次点击手机的版本号,即可进入开发者模式。 然后进入开发人员选项,开启USB调试,如下图。 2、数据线连接电脑,检查设备连接情况 按键盘winR键,在弹窗中输入cmd&#…...
vue+elementui+springboot图片上传
1、前端代码 <template><div><el-uploadclass"avatar-uploader"action"http://localhost:8081/ch06/demo/uploadAvatar":show-file-list"false":on-success"handleAvatarSuccess":before-upload"beforeAvatarUpl…...
路由器怎么设置局域网?
局域网(Local Area Network,LAN)是指在一个相对较小的地理范围内,如家庭、办公室或学校等,通过路由器等设备连接起来的计算机网络。设置局域网可以方便地实现内部资源共享和信息交流。本文将介绍如何设置局域网以及一个…...
Linux2(文件类型分类 基本命令2 重定向)
目录 一、文件类型分类 二、基本命令2 1. find 帮助查询 2. stat 查看文件的信息 3. wc 统计文本 4. 查看文本内容 4.1 cat 4.2 more 4.3 less 4.4 head 4.5 tail 5. cal 显示日历 6. date 显示时间 7. du 文件大小 8. ln 链接 软链接 硬链接 区别 9. histo…...
c->c++(一):部分KeyWord
本文主要探讨c相关关键字的使用。 char char默认是unsigned/signed取决平台,wchar_t宽字符:用于Unicode编码(超过一个字节),用wcin和wcout输入输出,字符串为wstring char8_t(20),char16_t(11起),char32_t(11):指定占用字节数且是无符号,字符串类u8string,u16s…...
【iOS】YYModel源码阅读笔记
文章目录 前言一、JSON转换库对比二、YYModel性能优化三、YYModel的使用四、架构分析YYClassInfo 剖析 五、流程剖析转换前准备工作 – 将JSON统一成NSDictionary将NSDictionary 转换为Model对象提取Model信息使用NSDictionary的数据填充Model 总结 前言 先前写了JSONModel的源…...
C++Qt做一个鼠标在按钮上悬浮3s显示一个悬浮窗口
当你想要在 Qt 中创建一个自定义按钮并添加悬浮窗口的功能时,你可以通过继承 QPushButton 类来实现。下面是一个示例代码,演示了如何创建一个自定义按钮类 HoverButton,并在鼠标悬浮在按钮上 3 秒后显示一个悬浮窗口,窗口包含图片…...
sslh一键在一个端口上运行多个服务(KALI工具系列二十三)
目录 1、KALI LINUX 简介 2、sslh工具简介 3、信息收集 3.1 目标主机IP(win) 3.2 KALI的IP 4、操作示例 4.1 监听特定端口 4.2 配置SSH 4.3 配置apache 4.4 配置sshl 4.5 验证配置 5、总结 1、KALI LINUX 简介 Kali Linux 是一个功能强大、…...
Vue27-内置指令04:v-once指令
一、需求 二、v-once指令 获取初始值: 三、小结...
Pytorch环境配置的方法
Pytorch虚拟环境配置全流程 以安装pytorch1.9.1为例 1. 创建虚拟环境 安装Anaconda3,打开 PowerShell 创建虚拟环境并进入: conda create -n torch1.9.1 python3.8 conda activate torch1.9.1 conda create -n torch1.9.1 python3.8 conda activate to…...
数字化制造案例分享以及数字化制造能力评估(34页PPT)
资料介绍: 通过全面的数字化企业平台和智能制造技术的应用,制造型企业不仅提升了自身的竞争力,也为整个制造业的数字化转型提供了借鉴。同时,数字化制造能力的评估是企业实现数字化转型的关键环节,需要从技术变革、组…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...
springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...
