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

news/2024/11/28 1:34:06/

简介

目录

简介

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++11set(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.ppmy.cn/news/41823.html

相关文章

害怕冲突吗?冲突也有正面的意义?

目录 一、害怕冲突的表现 二、害怕冲突的形成原因 三、冲突的意义 四、怎么办&#xff1f; 一、害怕冲突的表现 明明自己不愿意做的事情&#xff0c;也委曲求全答应下来&#xff1b; 害怕被拒绝&#xff0c;笑、讽刺而不去做自己想做的事情&#xff1b; 自卑、敏感、处处…

使用LeafLet叠加Geoserver wms图层到已有底图的方法

背景 随着现代城市交通建设的飞速发展&#xff0c;各个城市的地铁路线和地铁站点也是越来越多。地铁极大的方便了广大人民的交通出行。作为Giser&#xff0c;经常会遇到需要将一份shp数据在地图上展示&#xff0c;甚至需要在网页端进行浏览的需要。把shp这种空间矢量数据进行we…

Ubuntu16.04更换eigen3版本

Ubuntu16.04更换eigen3版本卸载eigen3查看系统是否安装eigen3&#xff0c;并找到其位置删除安装eigen3提前下载好指定版本的eigen3解压、编译、安装拷贝查看eigen3版本卸载eigen3 查看系统是否安装eigen3&#xff0c;并找到其位置 sudo updatedb locate eigen3Linux updatedb…

【华为OD机试真题】区块链文件转储系统(javapython)100%通过率

区块链文件转储系统 知识点栈链表单调栈Q滑窗 时间限制:2s空间限制:256MB限定语言:不限 题目描述: 区块链底层存储是一个链式文件系统,由顺序的N个文件组成,每个文件的大小不一,依次为F1,F2…Fn。随着时间的推移,所占存储会越来越大。 云平台考虑将区块链按文件转储…

无公网IP,在外公网远程访问RabbitMQ服务「内网穿透」

文章目录前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址前言 RabbitMQ是一个在 AMQP(高级消息队列协议)基础上…

C++代理模式探索:在复杂系统中发挥控制与保护的作用

C代理模式探索&#xff1a;在复杂系统中发挥控制与保护的作用引言代理模式基本概念静态代理实现动态代理实现代理模式的应用场景代理模式的优缺点代理模式与其他设计模式的关联代理模式在C/C中的实现懒加载代理模式 - 用于延迟加载大型对象远程代理模式 - 用于访问远程对象的接…

美国全力打击币圈 “一套花式组合拳”,打得从业者透不过气

银行危机“平息”过后&#xff0c;美国监管机构对币圈接连出手&#xff0c;一套花式组合拳打得从业者透不过气&#xff0c;也使得加密行业在政府的拳头之下风声鹤唳。 首先&#xff0c;切断加密货币与传统金融机构的联系。美国金融体系陷入混乱之际&#xff0c;一系列历史性的银…

线性表的链式存储——链表

目录 1.概念 2.链表 2.1 单链表概念及结构 2.2双链表的概念及结构 2.3 循环链表 3.链表的具体使用 4.自己实现链表及方法&#xff1a; 双链表&#xff1a; 单链表&#xff1a; 1.概念 链式存储是常用的动态存储方式&#xff0c;相对于顺序表&#xff0c;可以更好的任…