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

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

简介

目录

简介

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.kler.cn/news/11884.html

相关文章:

  • Jetpack Compose之对话框和进度条
  • JavaScript 进阶 - 0基础第一天
  • Elasticsearch使用篇 - 管道聚合
  • 【Spring源码】Spring事务原理
  • 在 Rocky linux 8.7 使用 Kubespray v2.21.0 离线部署 kubernetes v1.24.0 集群
  • 密码基础知识——密码的概念与作用
  • 【云原生】k8s NetworkPolicy 网络策略是怎么样的
  • ctf做题记录本
  • 亚马逊广告怎么优化,这8条准则要牢记
  • python实战应用讲解-【numpy数组篇】常用函数(三)(附python示例代码)
  • 实现一个登录功能方案设计2
  • 记 ==> 首次使用rabbitMQ优化项目
  • 万字长文介绍R package “vegan”——入门学习与重复文献数据
  • 奥威BI数据可视化大屏分享|多场景、多风格
  • 300元左右的蓝牙耳机哪个好?300左右音质最好的蓝牙耳机
  • 全面解析反欺诈(羊毛盾)API,助你识别各类欺诈风险
  • 尚融宝14-集成redis缓存
  • 【C语言】位运算 {位运算的应用 :关闭位,判断位,打开位,转置位;位域}
  • 服装标签二维码,要如何制作?含品牌案例
  • SQL Server 数据操控,视图和索引
  • copilot使用教程
  • X509证书以及相关java常用接口
  • 如何采药才最值当——记忆化搜索
  • 锁子甲 bulid+sim
  • 【SpringBoot】使用JWT验证
  • Redis 6.0的多线程是如何工作的
  • 决策树算法介绍
  • MySQL索引及SQL优化
  • SpringBoot中对Bean的处理方法以及第三方Bean处理的方式
  • 快问快答--时间序列常用的数据增强方法有哪些?python有集成库吗?