当前位置: 首页 > news >正文

CMake教程 - basic point

CMake教程 - basic point

1 - Building a Basic Project

最基本的CMake项目是由单个源代码文件构建的可执行文件。对于像这样简单的项目,只需要一个带有三个命令的CMakeLists.txt文件。

注意:尽管CMake支持大写、小写和混合大小写命令,但小写命令是首选,并将在整个教程中使用。

任何项目的顶级CMakeLists.txt都必须从使用cmake_minimum_required()命令指定一个最小的CMake版本开始。这将建立策略设置,并确保以下CMake功能使用兼容版本的CMake运行。要启动一个项目,我们使用project()命令来设置项目名称。这个调用对于每个项目都是必需的,并且应cmake_minimum_required()之后不久就被调用。我们将看到,此命令还可以用于指定其他项目级别信息,如语言或版本号。最后,add_executable()命令告诉CMake使用指定的源代码文件创建一个可执行文件。

语法说明

设置项目cmake最低版本要求

cmake_minimum_required(VERSION <min>[...<policy_max>] [FATAL_ERROR])

设置项目名称,同时也设定了几个环境变量

project(<PROJECT-NAME> [<language-name>...])
project(<PROJECT-NAME>[VERSION <major>[.<minor>[.<patch>[.<tweak>]]]][DESCRIPTION <project-description-string>][HOMEPAGE_URL <url-string>][LANGUAGES <language-name>...])
PROJECT_SOURCE_DIR    当前source code 路径
PROJECT_BINARY_DIR    当前source bin路径

使用指定的souce file 向项目中添加一个可执行文件

add_executable(<name> [WIN32] [MACOSX_BUNDLE][EXCLUDE_FROM_ALL][source1] [source2 ...])

demo

main.c

#include <stdio.h>int main(int argc, char **argv)
{printf("hello world\n");return 0;
}

CMakeLists.txt

#cmake version
cmake_minimum_required(VERSION 3.2)#project name
project(basic_demo)message("echo project dir is ${PROJECT_SOURCE_DIR}")
message("echo project bin is ${PROJECT_BINARY_DIR}")
#add executable
add_executable(basic_demo main.c)

编译

可以创建一个文件夹用于存放cmake产生的文件,然后执行 cmake . , 编译文件cmake --build .

2 - Specifying the C++ Standard

CMake有一些特殊的变量,这些变量要么是在幕后创建的,要么是在项目代码中设置的。许多这些变量都以CMAKE开头。在为项目创建变量时避免这种命名约定。其中两个特殊的用户可设置变量是CMAKE_CXX_STANDARD和CMAKE_CXX_STANDARD_REQUIRED。它们可以一起用于指定构建项目所需的c++标准。

变量说明

CMAKE_CXX_STANDARD

如果在创建目标器时设置了CXX STANDARD目标器属性的默认值,c++标准,其特性被要求构建此目标。此属性指定构建此目标所要求的c++标准的特性。对于某些编译器,这会导致在编译行中添加一个标志,如-std=gnu++11。对于没有标准级别概念的编译器,例如2015 Update 3之前的Microsoft Visual c++,这没有影响。支持的值有:

CMAKE_CXX_STANDARDversion
98C++98
11C++11
14C++14
17C++17
20C++20
23C++23
CXX_STANDARD_REQUIRED

如果在创建目标器时设置了CXX_STANDARD_REQUIRED目标器属性,则该属性为默认值。

描述CXX STANDARD的值是否是必需的。如果此属性设置为ON,则CXX_STANDARD目标属性的值被视为需求。如果此属性为OFF或未设置,则CXX_STANDARD目标属性被视为可选属性,并且如果所请求的不可用,则可能“衰减”到以前的标准。对于没有标准级别概念的编译器,例如MSVC 1800 (Visual Studio 2013)和更低的版本,这没有影响。

demo

main.cpp

#include <iostream>int main(int argc, char **argv)
{std::string var = "3.14156";const double input_value = std::stod(var);  //stod是c11 中有的 ,如果不设定cxx version 就会报错std::cout << input_value << std::endl;std::cout << "hello world " << std::endl;return 0;
}

CMakeLists.txt

#set cmake version
cmake_minimum_required(VERSION 3.2)#project name
project(basic_demo2)#set CXX version
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED true)#add executable
add_executable(basic_demo2 main.cpp)

3 - Adding a Version Number and Configured Header File

有时,在CMakelists.txt文件中定义的变量在源代码中也有,这可能很有用。在这种情况下,我们希望打印项目版本。实现这一点的一种方法是使用已配置的头文件。我们创建了一个包含一个或多个变量要替换的输入文件。这些变量具有特殊的语法,看起来像@VAR@。然后,我们使用coffet_file()命令将输入文件复制到给定的输出文件中,并将这些变量替换为CMakelists.txt文件中VAR的当前VAR值。虽然我们可以直接在源代码中编辑版本,但使用这个特性是首选,因为它创建了一个单一的真相来源,并避免了重复。

变量说明

<PROJECT_NAME>_VERSION_MAJOR

项目的主版本号

<PROJECT_NAME>_VERSION_MINOR

项目的次版本号

拷贝文件到另外一个位置并且修改内容

configure_file(<input> <output>[NO_SOURCE_PERMISSIONS | USE_SOURCE_PERMISSIONS |FILE_PERMISSIONS <permissions>...][COPYONLY] [ESCAPE_QUOTES] [@ONLY][NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])

input file和outfile对比

inputfile					outfile
#cmakedefine VAR			#define VAR or #undef VAR
#cmakedefine VAR 1			#define VAR 01
#cmakedefine01 VAR			#define VAR 1 or #define VAR 0input file中的变量使用@var@  or ${var} $CACHE{VAR} $ENV{VAR}

加入头文件路径

target_include_directories(<target> [SYSTEM] [AFTER|BEFORE]<INTERFACE|PUBLIC|PRIVATE> [items1...][<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])

demo

main.cpp

#include <iostream>
#include "basicconfig.h"int main(int argc, char **argv)
{std::cout << "verson major" << basic_demo_VERSION_MAJOR << "version minor" << basic_demo_VERSION_MINOR << std::endl;std::cout << "hello world " <<std::endl;return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.2)project(basic_demo VERSION 1.2)
configure_file(basicconfig.h.in basicconfig.h)add_executable(basicdemo main.cpp)
target_include_directories(basicdemo PRIVATE  ${PROJECT_SOURCE_DIR})           

basicconfig.h.in

#define basic_demo_VERSION_MAJOR @basic_demo_VERSION_MAJOR@
#define basic_demo_VERSION_MINOR @basic_demo_VERSION_MINOR@

相关文章:

CMake教程 - basic point

CMake教程 - basic point 1 - Building a Basic Project 最基本的CMake项目是由单个源代码文件构建的可执行文件。对于像这样简单的项目&#xff0c;只需要一个带有三个命令的CMakeLists.txt文件。 注意&#xff1a;尽管CMake支持大写、小写和混合大小写命令&#xff0c;但小…...

day52--动态规划11

想死&#xff0c;但感觉死的另有其人&#xff0c;&#xff0c;怎么还在动态规划&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV 第一题&#xff1a;买卖股票的最佳时机III 给定一个数组&#xff0c;它…...

Jenkins入门级安装部署

前言 Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件项目可以进行持续集成。通常&#xff0c;项目中常用Jenkins作为编译打包项目的工具&#xff0…...

tcpdump 异常错误

tcpdump 进行抓包的时候&#xff0c;-w 提示 Permission denied&#xff1a; sudo tcpdump -w test1.log tcpdump: test1.log: Permission denied 开始以为是用户权限的问题&#xff0c;后来换用 root 账户还是不行&#xff0c;经搜索&#xff0c;是 AppArmor 的问题。 解决方…...

如何绘制【逻辑回归】中threshold参数的学习曲线

threshold参数的意义是通过筛选掉低于threshold的参数&#xff0c;来对逻辑回归的特征进行降维。 首先导入相应的模块&#xff1a; from sklearn.linear_model import LogisticRegression as LR from sklearn.datasets import load_breast_cancer from sklearn.model_selecti…...

4.1 数据库安全性概述

思维导图&#xff1a; 前言&#xff1a; - **第一章回顾**&#xff1a;数据库特点 - 统一的数据保护功能&#xff0c;确保数据安全、可靠、正确有效。 - 数据保护主要涵盖&#xff1a; 1. **数据的安全性**&#xff08;本章焦点&#xff09; 2. 数据的完整性&#xff08;第…...

tftp服务的搭建

TFTP服务的搭建 1 先更新一下apt包 sudo apt-get update2 服务器端(虚拟机上)安装 TFTP相关软件 sudo apt-get install xinetd tftp tftpd -y3 创建TFTP共享目录 mkdir tftp_sharetftp_shaer的路径是/home/cwz/tftp_share 3.1 修改共享目录的权限 sudo chmod -R 777 tftp…...

c语言简介

C 语言最初是作为 Unix 系统的开发工具而发明的。 1969年&#xff0c;美国贝尔实验室的肯汤普森&#xff08;Ken Thompson&#xff09;与丹尼斯里奇&#xff08;Dennis Ritchie&#xff09;一起开发了 Unix 操作系统。Unix 是用汇编语言写的&#xff0c;无法移植到其他计算机&…...

OpenLayers.js 入门教程:打造互动地图的入门指南

本文简介 戴尬猴&#xff0c;我是德育处主任 本文介绍如何使用 OpenLayers.js &#xff08;后面简称 ol&#xff09;。ol 是一个开源 JavaScript 库&#xff0c;可用于在Web页面上创建交互式地图。 ol能帮助我们在浏览器轻松地使用地图功能&#xff0c;例如地图缩放、地图拖动…...

黑马头条:app端文章查看

黑马头条&#xff1a;app端文章查看 黑马头条&#xff1a;app端文章查看文章列表加载1. 需求分析2. 表结构分析3. 导入文章数据库3.1 导入数据库3.2 导入对应的实体类 4. 实现思路5. 接口定义6. 功能实现6.1&#xff1a;导入heima-leadnews-article微服务&#xff0c;资料在当天…...

常见使用总结篇(一)

Autowired和Resource注解的区别 Autowired注解是Spring提供的&#xff0c;Resource注解是J2EE本身提供Autowird注解默认通过byType方式注入(没有匹配会通过byName方式)&#xff0c;而Resource注解默认通过byName方式注入(没有匹配会通过byType方式)Autowired注解注入的对象需要…...

【软考系统架构设计师】2023年系统架构师冲刺模拟习题之《数据库系统》

在数据库章节中可能会考察以下内容&#xff1a; 文章目录 数据库完整性约束&#x1f31f;数据库模式&#x1f31f;&#x1f31f;ER模式&#x1f31f;关系代数&#x1f31f;&#x1f31f;并发控制&#x1f31f;数据仓库与数据挖掘&#x1f31f;&#x1f31f;反规范化技术&#x…...

北邮22级信通院数电:Verilog-FPGA(7)第七周实验(1):带使能端的38译码器全加器(关注我的uu们加群咯~)

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 关注作者的uu们可以进群啦~ 目录 方法一&#xff…...

SIT3491ISO具有隔离功能,256 节点,全双工 RS422/RS485 芯片

SIT3491ISO 是一款电容隔离的全双工 RS-422/485 收发器&#xff0c;总线端口 ESD 保护能力 HBM 达到 15kV 以上&#xff0c;功能完全满足 EIA-422 以及 TIA/EIA-485 标准要求的 RS-422/485 收发器。 SIT3491ISO 包括一个驱动器和一个接收器&#xff0c;两者均…...

在windows服务器上部署一个单机项目以及前后端分离项目

目录 一. 单机项目在windows服务器上的部署 1.1 在本机上测试项目无误 1.1.1 在数据库中测试sql文件没问题 1.1.2 在tomcat中测试war文件无误 1.1.3 测试完成后&#xff0c;进入浏览器运行单机项目确保无误 1.2 在windows服务器中运行项目 二. 前后端分离项目在服务器上…...

使用jdbc技术,在数据库中存储大数据对象(使用字节IO流读取图片等给blob等二进制类型数据赋值)

在MySQL中&#xff0c;BLOB是一种数据类型&#xff0c;代表二进制大对象&#xff08;Binary Large Object&#xff09;&#xff0c;可以存储大量的二进制数据&#xff0c;如图像、声音、视频等。BLOB类型的数据在存储和检索时会以二进制方式进行处理&#xff0c;而不是字符方式…...

统计学习方法 支持向量机(下)

文章目录 统计学习方法 支持向量机&#xff08;下&#xff09;非线性支持向量机与和核函数核技巧正定核常用核函数非线性 SVM 序列最小最优化算法两个变量二次规划的求解方法变量的选择方法SMO 算法 统计学习方法 支持向量机&#xff08;下&#xff09; 学习李航的《统计学习方…...

【python】如何注释

一&#xff1a;通过#注释行 #这个是个注释 print(hello world) 二&#xff1a;通过或"""注释段落 这个注释段落 这是注释段落 这是注释段落print(hello world) """ 这是多行注释&#xff0c;用三个双引号 这是多行注释&#xff0c;用三个双引…...

C++——C++入门(二)

C 前言一、引用引用概念引用特性常引用使用场景传值、传引用效率比较值和引用的作为返回值类型的性能比较 引用和指针的区别 二、内联函数概念特性知识点提升 三、auto关键字类型别名思考auto简介auto的使用细则auto不能推导的场景 四、基于范围的for循环范围for的语法范围for的…...

容联七陌百度营销通BCP解决方案,让营销更精准

百度营销通作为一个快速迭代、满足客户多元化营销需求的高效率营销工具成为众多企业的选择&#xff0c;通过百度营销通BCP对接&#xff0c;企业就可以在百度咨询页接入会话&#xff0c;收集百度来源的访客搜索关键词&#xff0c;通过百度推广获取更多的精准客户&#xff0c;从而…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...