【c/c++编译工具】——Cmake的学习

news2025/2/27 18:04:44

简介

目录

简介

1. Cmake的基本语法

2. 常用指令

3. CMake常用的变量

4. CMake编译工程

5. 构建方式

6.  实战---CMake代码实战


  • CMake是一个跨平台的安装编译工具,可以用简单的语句来描述所有平台的安装(编译过程)。
  • CMake可以说已经成为大部分C++开源项目标配

不同平台编译项目工程文件是不同的,如在Visual Studio下,需要msbuild文件,在linux下需要编写Makefile文件,所以一个工程在不同的平台需要编写多个编译文件。  但是有了cmake工具后,我们只需要编写CMakeLists.txt文件就可以解决跨平台编译的问题。

 假设一个工程新增添了一个文件bar.cpp,如果我们在linux编译,我们就需要手写makefile文件,如果在VS下编译,就需要写msbuild文件。如下:

 但是有了cmake工具后,我们只需要编写CMakeLists.txt文件,cmake会根据不同的平台生成对应的编译文件,如果在linux下,cmake就会根据CMakeLists.txt产生对应的makefile文件。

 

 

1. Cmake的基本语法

  • 指令(参数 参数)
  • 指令是大小写无关,参数和变量是大小写相关的

例如:

add_excutable(hello main.cpp hello.cpp)
ADD_EXCUTABLE(hello main.cpp hello.cpp)
  • 变量使用${},但是在IF控制语句中是直接使用变量名 

2. 常用指令

指定最小版本指令---cmake_minimum_required

cmake_minimum_required(VERSION 2.8.3) #指定cmake的最小版本是2.8.3版本

定义工程名---project

project(main) #定义工程名为hello
project(main[c][java])#定义工程名为hello,且支持的语言为c和java

设置变量 ---set

set(SRC main.cpp hello.cpp) #设置SRC变量为main.cpp hello.cpp

link_directories相当于g++编译器中指定头文件中的-i选项

#将/usr/lib/mylibfolder ./lib添加到库文件的搜索路径中
link_directories(/usr/lib/mylibfolder ./lib) 

添加编译参数---add_compile_option

add_compile_option(-std=c++11)#添加编译参数 -std=c++11
add_compile_option(-wall -std=c++11)#添加编译参数 -Wall -std=c++11

编译生成可执行文件---add_executable

语法:
add_executable(目标文件 源文件 源文件)
例子:
add_executable(main main.cpp) #编译main.cpp生成可执行文件main
add_executable(main main.cpp add.cpp) #编译main.cpp add.cpp生成可执行文件main

#也可以用一个变量来表示多个源文件
set(SRC_LIST a.cpp b.cpp c.cpp)
add_executable(${PROJECT_NAME} ${SRC_LIST})
#PROJECT_NAME 是设置的工程工程名称
target_link_libraries(main hello)#将hello动态库添加需要链接的共享库中

3. CMake常用的变量

  • CMAKE_C_FLAGS gcc编译选项

  • CMAKE_CXX_FLAGES g++编译选项

	#在CMAKE_CXX_FLAGES 中选项后追加-std=c++11
	set(CMAKE_CXX_FLAGES ,"${CMAKE_CXX_FLAGES} -std=c++11")
  • CMAKE_BUILD_TYPE 编译类型
#设定编译类型为debug,如果要对项目进行调试,需要将CMAKE_BUILD_TYP设置为Debug类型
set(CMAKE_BUILD_TYPE  Debug);
#设定编译类型为realse
set(CMAKE_BUILD_TYPE  Realse);

4. CMake编译工程

在项目主目录下需要存在一个CMakeLists文件

两种方式设置编译规则:

  • 包含源文件的子文件夹包含CMakeLists.txt文件,主目录的CMakeLists.txt通过add_subdirectory添加子目录即可

  • 包含源文件的子文件夹未包含CMakeLists.txt文件,子目录编译规则体现在主目录的CMakeLists.txt中。

 编译流程

在linux平台下使用CMake构建C/C++工程的流程如下:

  1. 手动编写CmakeLists.txt

  2. 执行cmake PATH 生成Makefile(PATH是CMakeLists.txt所在的目录)

  3. 执行命令make进行编译

5. 构建方式

内部构建(不推荐)

内部构建会在同级目录下产生一堆中间件文件,这些中间文件并不是我们想要的,和工程文件放在一起会显得杂乱无章。

#在当前目录下,编译本目录CMakeLists.txt 生成Makefile和其他文件
cmake .
#执行make指令,生成target
make

外部构建(推荐)

将编译文件和源文件放在不同的目录下

mkdir build
#进入到build文件夹中
cd build
#编译上级目录的CMakeLists.txt,生成Makefile和其他文件
cmake ..
#执行make命令,生成target
make

6.  实战---CMake代码实战

编写 CMakeLists.txt文件使add.c和main.c文件生成main可执行文件

main.cc文件:

#include<iostream>
using namespace std;

int main()
{
    cout<<add(10,20)<<endl;
    return 0;
}

add.hpp文件

#include<iostream>

int add(int x,int y);

add.cc文件

#include<iostream>

int add(int x,int y);

编写需要在源文件下创建CMakeLists.txt文件

CMakeLists.txt文件内容:

cmake_minimum_required(VERSION 2.8.12.2) #最低版本号

project(main)                            #项目名称

set(CMAKE_BUILD_TYPE  Debug);            #设置编译类型为Debug
add_executable(${PROJECT_NAME} main.cc add.cc) #编译文件

接下来再创建一个build目录,并进入build目录并执行 cmake ..  ,那么在build目录下就会产生4个文件,其中包括一个Makefile文件。

 在执行make就会在build目录下生成main文件

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

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

相关文章

将自己的服务注册成Windows服务

winsw下载地址 https://github.com/winsw/winsw/releases 如何注册服务 将WinSW.exe复制到自定义的目录同目录下创建projectName.xml。特别注意&#xff0c;xml和exe必须同名配置 xml文件 xml配置信息如下 <service><id>wjb-member</id><name>wjb-me…

15-721 Chapter7 索引

锁的分类 锁占用少量内存&#xff0c;实际上在不竞争的情况下性能不错. 第一个就是靠test_and_set实现的自旋锁&#xff0c;高效&#xff0c;因为在用户态&#xff0c;但是却不可扩展&#xff0c;对cache&#xff0c;os都不友好 第二个是mutex&#xff0c;实际上两个部分组成…

浮空,定位

浮动原理&#xff1a; 清除浮动 高度塌陷是怎么造成的&#xff0c;浮动元素脱离当前文档流&#xff0c;然后无法撑起父容器导致了高度塌陷&#xff0c;因为父容器没有设置高度 解决方法&#xff1a; 1.将父元素变成bfc元素 2.父元素浮动 3.清除浮动&#xff1a; 通过给父元…

小伙被内卷逼成扫地僧,把牛客网所有面试题整理成25W字面试手册

很多工作过了 5 年之后的工程师&#xff0c;都表示写不动 CRUD 代码了&#xff0c;都会考虑转架构师&#xff0c;但是一想到面试&#xff0c;可能心里就会一紧。 一般面试大厂架构师的岗位至少需要 3 轮技术面试&#xff0c;我咨询了一下阿里的大佬&#xff0c;了解到每一轮的…

数字化时代,如何建造会“运转”的数仓

在建设数仓之前需要根据数据基础和业务需求来决定要建设什么标准的数仓。 常见数仓问题 1、公共底层加工逻辑分散&#xff1a;对于来自多个数据源&#xff0c;但需要使用相同过滤和解析方式公共底层数仓&#xff0c;其过滤和解析代码在每个任务或配置中直接静态复制&#xff…

【系统集成项目管理工程师】项目范围管理

&#x1f4a5;十大知识领域&#xff1a;项目范围管理 项目范围管理包括以下 6 个过程: 编制范围管理计划过程收集需求过程定义范围过程创建工作分解结构过程确认范围过程范围控制过程 一、编制范围管理计划过程 对如何定义、确认和控制项目范围的过程进行描述 1、输出&#xff…

ch02-PyTorch数据预处理

ch02-PyTorch数据预处理0.引言1.数据读取机制 Dataloader 与 Dataset1.1.纸币二分类1.2.DataSet与DataLoader1.2.1.torch.utils.data.DataLoader&#xff1a;构建可迭代的数据装载器1.2.2.torch.utils.data.Dataset&#xff1a;Dataset抽象类1.2.3.以人民币分类为例2.数据预处理…

【Python】如何正确执行python装饰器?

文章目录前言一、错误的做法是什么&#xff1f;二、正确的方法总结前言 说到Python装饰器的执行顺序&#xff0c;有很多半吊子张口就来&#xff1a; 靠近函数名的装饰器先执行&#xff0c;远离函数名的装饰器后执行。 这种说法是不准确的。但是这些半吊子多半还会不服&#…

海明码的计算和检错纠错

海明码 1.学习前提 学习海明码之前&#xff0c;我们要约定3个原则&#xff1a; 海明码只能检测出2位错&#xff0c;纠1位错(因此不要问如果3位错怎么办等幼稚问题)。海明码默认进行偶校验(除非特殊说明使用奇校验)。海明码是一串由0和1组成的序列(除01外没有其他的值&#x…

ASEMI代理AD8606ACBZ-REEL7原装ADI车规级AD8606ACBZ-REEL7

编辑&#xff1a;ll ASEMI代理AD8606ACBZ-REEL7原装ADI车规级AD8606ACBZ-REEL7 型号&#xff1a;AD8606ACBZ-REEL7 品牌&#xff1a;ADI/亚德诺 封装&#xff1a;WLCSP-8 批号&#xff1a;2023 引脚数量&#xff1a;8 安装类型&#xff1a;表面贴装型 AD8606ACBZ-REEL7…

Serverless 冷启动:如何让函数计算更快更强?

问题背景 Serverless 计算也称服务器无感知计算或函数计算&#xff0c;是近年来一种新兴的云计算编程模式。其致力于大幅简化云业务开发流程&#xff0c;使得应用开发者从繁杂的服务器运维工作中解放出来&#xff08;例如自动伸缩、日志和监控等&#xff09;。借助 Serverless…

APT攻击及密码学

目录标题什么是APT攻击&#xff1f;APT攻击过程APT防御技术APT防御过程沙箱处理流程密码学什么是对称加密&#xff1f;什么是非对称加密&#xff1f;SSL工作过程什么是APT攻击&#xff1f; APT攻击即高级可持续威胁攻击&#xff0c;也称为定向威胁攻击&#xff0c;指某组织对特…

fastCGI快速上手

fastCGI OVERVIEWfastCGI一、CGI二、fastCGI三、fastCGI使用1.fastCGI和spawn-fcgi安装2.nginx fastcgi&#xff08;1&#xff09;nginx的数据转发&#xff08;2&#xff09;spawn-fcgi启动&#xff08;3&#xff09;fastCGI进程处理3.fastCGI总结四、其他1.fastCGI环境变量2.…

【图像分割】LabelMe基本使用/标注标签格式转换及可视化

前言 之前一直在做目标检测的相关内容&#xff0c;使用LabelImg标注检测数据轻车熟路。不过最近尝试探索一下图像分割场景&#xff0c;需要用到LabelMe标注用于分割的数据标签&#xff0c;本文进行过程记录。 图像分割数据标签示例 以道路分割为例&#xff0c;下图是deepglo…

基于MVC+SSH的文章发布系统源码数据库毕业论文

目 录 摘要 1 Abstract 2 1 绪论 1.1 课题背景 1.2 研究现状及发展趋势 1.3 课题意义与目的 1.4 研究内容 1.5 论文组织 2 开发工具和技术介绍 2.1 开发工具 2.1.1 Myeclipse简介 2.1.2 MySQL简介 2.1.3 Tomcat简介 2.2 开发技术 2.…

【LInux】MySQL高可用之主从复制

一、Mysql主从架构技术说明 Mysql内建的复制功能是构建大型&#xff0c;高性能应用程序的基础。将Mysql的数据分布到 多个系统上去&#xff0c;这种分布的机制&#xff0c;是通过将Mysql的某一台主机&#xff08;Master&#xff09;的数据复 制到其它主&#xff08;slaves&…

音频模块的介绍

一、术语总结 1.HIFI 级   “HIFI”一词通常指高保真音频&#xff08;High-Fidelity Audio&#xff09;&#xff0c;是指尽可能保持音频信号的原始质量&#xff0c;让听众感受到最真实的音乐表现。因此&#xff0c;“HIFI级”通常指具有高保真音频性能的产品或设备&#xff…

音视频开发十六:SDL基础概念

SDL 纹理渲染 纹理 ​ 在SDL中&#xff0c;纹理是图像的描述信息。用SDL_Texture表示一个纹理对象&#xff08;texture&#xff09;&#xff0c;它是一个用于存储像素数据的结构体类型。 渲染 ​ **互联网解释&#xff1a;**渲染是在电脑绘图中是指用软件从模型生成图像的…

【Linux】线程互斥详解:多线程会有什么问题?什么是互斥锁?C++怎么封装使用互斥锁?

多线程可以提高程序的并发性和运行效率&#xff0c;充分利用计算机的多核资源. 前面的几篇文章已经介绍了, Linux线程的基本概念、基本控制等内容. 我们已经看到了多线程可以提升运行效率等. 但是, 也发现了问题, 多线程可能会导致输出混乱、访问共享资源混乱、竞争等问题. 输…

Vue中 import ...与import{ }、import from ‘@路径‘ 与 import from ‘../路径‘

遇到的问题&#xff1a; 不带{ }以组件方式 引入后&#xff0c;用 组件名. 变量 的方式一直提示变量未定义的问题&#xff0c;改成直接 带{ }引入变量直接使用变量就不提示错误了&#xff0c;&#xff08;不知道是不是我引入的包和他人不一样的原因...&#xff09;&#xff0…