马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
1. CMake概述
- CMake 是一个项目构建工具,而且是跨平台的。关于项目构建我们所熟知的尚有 Makefile(通过 make 下令举行项目标构建),大多是 IDE软件都集成了 make,好比:VS的 nmake、linux下的 GNU make、Qt 的 qmake 等,假如本身动手写 makefile,会发现,makefile 通常依赖于当前的编译平台,而且编写 makefile 的工作量比力大,办理依赖关系时也轻易堕落。
- 而 CMake 恰恰能办理上述题目, 其答应开辟者指定整个工程的编译流程,在根据编译平台, 主动生本钱地化的Makefile和工程文件,末了用户只需 make 编译即可,以是可以把 CMake 当作一款主动天生 Makefile 的工具,其编译流程如下图:
2. 编写一个简单的CMakeLists.txt
体系情况:
检察Cmake是否安装:
CMake长处:
- 跨平台
- 可以大概管理大型项目
- 简化编译构建和编译过程
- 可扩展:可以为cmake编写特定功能的模块,扩充cmake功能
2.1表明
2.1.1 表明行
CMake使用#举行行表明,可以放在任何位置
- # 这是一个CMakeLists.txt文件
- cmake_minimum_required(VERSION 3.0.0)
复制代码 2.1.2 块表明
CMake使用#[[]]举行块表明
- #[[这是一个CMakeLists.txt文件
- 这是一个CMakeLists.txt文件
- 这是一个CMakeLists.txt文件
- ]]
- cmake_minimum_required(VERSION 3.0.0)
复制代码 2.1 只有源文件
add.cpp:
- #include <stdio.h>
- #include "head.h"
- const char* libVersion = "Library Version 1.0";
- int add(int a, int b){
- return a+b;
- }
复制代码 div.cpp:
- #include <stdio.h>
- #include "head.h"
- double divide(int a, int b){
- return a/b;
- }
复制代码 mult.cpp:
- #include <stdio.h>
- #include "head.h"
- int multiply(int a, int b){
- return a*b;
- }
复制代码 sub.cpp:
- #include <stdio.h>
- #include "head.h"
- int substract(int a, int b){
- return a-b;
- }
复制代码 head.h
- #include <stdio.h>
- #include "head.h"
- int substract(int a, int b){
- return a-b;
- }
复制代码 main.cpp
- #include <stdio.h>
- #include "head.h"
- int main(){
- int a = 20;
- int b = 12;
- printf("a = %d, b= %d \n",a,b);
- printf("a+b = %d \n", add(a,b));
- printf("a-b = %d \n", substract(a,b));
- printf("a*b = %d \n", multiply(a,b));
- printf("a/b = %f \n", divide(a,b));
- }
复制代码 添加CMakeLists.txt文件:
- cmake_minimum_required(VERSION 3.0.0)
- project(CALC)
- add_executable(app add.cpp div.cpp main.cpp mult.cpp sub.cpp)
复制代码
- cmake_minimum_required: 指定cmake的最低版本,可选,非必须,假如不加大概会有告诫
- project:界说工程名称,并可指定工程的版本、工程形貌、web 主页地点、支持的语言(默认情况支持全部语言),假如不必要这些都是可以忽略的,只必要指定出工程名字即可。
- #PROJECT 指令的语法是:
- project(<PROJECT-NAME>[<language-name>...])
- project(<PROJECT-NAME>
- [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
- [DESCRIPTI0N <project-description-string>]
- [HOMEPAGE URL <url-string>]
- [LANGUAGES <language-name>...]) # 指定语言,即cmake支持的语言
复制代码
- add_executable : 界说工程会天生一个可实行步调
- add_executable(可执行程序名 源文件名称)
复制代码 这里的可实行步调名和project中的项目名称没有任何关系
源文件名可以是一个也可以是多个,假如有多个可以用空格大概;隔断
- # 样式1
- add_executable(app add.c div.c main.c mult.c sub.c)
- # 样式2
- add_executable(app add.c;div.c;main.c;mult.c;sub.c)
复制代码 4. 实行CMake下令
将CMakeLists.txt文件编译好之后,就可以实行cmake下令了
- # cmake 命令原型
- cmake CMakeLists.txt文件所在路径
复制代码 实行CMakeLists.txt会天生一些文件,可以在CMakeLists.txt目次下新建build文件,进入build文件,然后实行下令cmake ..这时间天生的文件就会在build目次下了,之后使用make对天生的Makefile文件举行编译,得到可实行文件app
3. CMake中set使用
set 根本使用
在上面的例子中一共提供了5个源文件,假设这五个源文件必要反复被使用,每次都直接将它们的名字写出来确实是很贫苦,此时我们就必要界说一个变量,将文件名对应的字符串存储起来,在cmake 里界说变量必要使用 set。
- # SET 指令的语法是:
- #[]中的参数为可选项,如不需要可以不写
- SET(VAR [VALUE][CACHE TYPE DOCSTRING [FORCE]])
复制代码 此中:
VAR:变量名称
VALUE:变量值
- # 方式1:各个源文件之间使用空格间隔
- # set(SRC_LIST add.c div.cmain.c mult.csub.c)
- # 方式2:各个源文件之间使用分号;间隔
- set(SRC_LIST add.c;div.c;main.c;mult.c;sub.c)
- add_executable(app${SRC_LIST})
复制代码 set中变量的值都是字符串范例
set指定使用C++标准
在编写 C++步调的时间,大概会用到C++11、C++14、C++17、C++20 等新特性,那么就必要在编译的时间在编译下令中指定出要使用哪个标准:
假如不指定则默认使用C++98标准
- g++ *.cpp -std=c+=11 -o app
复制代码 上面的例子中通过参数 -std=c++11 指定出要使用 C++11 标准编译步调,C++标准对应有一宏叫做DCMAKE_CXX_STANDARD。在CMake 中想要指定C++标准有种方式:
1. 在CMakeLists.txt中通过set下令指定
- # 增加 -std=c++11
- set(CMAKE_CXX_STANDARD 11)
- # 增加 -std=c++14
- set(CMAKE_CXX_STANDARD 14)
- # 增加 -std=c++17
- set(CMAKE_CXX_STANDARD 17)
复制代码 2.在实行cmake下令的时间指定出这个宏的值
- # 增加-std=c++11
- cmake CMakeLists.txt文件路径 -DCMAKE_CXX_STANDARD=11
- # 增加-std=c++14
- cmake CMakeLists.txt文件路径 -DCMAKE_CXX_STANDARD=14
- # 增加-std=c++17
- cmake CMakeLists.txt文件路径 -DCMAKE_CXX_STANDARD=17
复制代码 set指定输出路径
在 CMake 中指定可实行步调输出的路径,也对应一个宏,叫做EXECUTABLE_OUTPUT_PATH,它的值照旧通过 set
- set(HOME /home/robin/Linux/Sort)
- set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin)
复制代码
- 第一行:界说一个变量用于存储一个绝对路径
- 第二行:将拼接好的路径值设置给EXECUTABLE_OUTPUT_PATH 宏,假如这个路径中的子目次不存在会主动天生,无需本身手动创建,路径发起用绝对路径
修改之前的CMakeLists.txt文件:
- cmake_minimum_required(VERSION 3.0.0)
- project(test)
- # 指定使用C++标准
- set(CMAKE_CXX_STANDARD 11)
- set(SRC add.cpp div.cpp main.cpp mult.cpp sub.cpp)
- # 指定可执行文件生成路径
- set(EXECUTABLE_OUTPUT_PATH /home/dabing/aa/bb/cc)
- add_executable(app ${SRC})
复制代码 4. 搜刮文件
假如一个项目里边的源文件许多,在编写 CMakeLists.txt 文件的时间不大概将项目目次的各个文件逐一摆列出来,如许太贫苦也不实际。以是,在CMake 中为我们提供了搜刮文件的下令,可以使用aux_source_directory下令大概 file下令。
方式1:aux_source_directory
- aux_source_directory(<dir> <variable>)
复制代码
- dir: 要搜刮的目次
- variable:将dir目次下搜刮到的源文件列表存储到该变量中
- cmake_minimum_required(VERSION 3.0.0)
- project(test)
- # 指定使用C++标准
- set(CMAKE_CXX_STANDARD 11)
- # aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} SRC_LIST)
- aux_source_directory(${PROJECT_SOURCE_DIR} SRC_LIST)
- add_executable(app ${SRC_LIST})
复制代码 方式2:file
- fiLe(GLOB/GLOB_RECURSE 变量名 要搜索的文件路径和文件类型)
复制代码 GLOB:将指定目次下搜刮到的满足条件的全部文件名天生一个列表,并将其存储到变量中。
GLOB_RECURSE:递归搜刮指定目次,将搜刮到的满足条件的文件名天生一个列表,并将其存储到变量中。
搜刮当前目次的src目次下全部源文件,并存储到变量中:
- file(GLOB MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
复制代码- file(GLOB MAIN_HEAD ${CMAKE_CURRENT_SOURCE _DIR}/include/*.h)
复制代码 CMAKE_CURRENT_SOURCE_DIR:表现当前访问的CMakeLists.txt文件地点的路径
关于要搜刮的文件路径和范例可以加双引号雨可以不加:
PROJECT_SOURCE_DIR: 是在实行cmake下令时背面跟着的路径
- file(GLOB MAIN_HEAD "${CMAKE_CURRENT_SOURCE _DIR}/include/*.h")
复制代码 使用示例:
- cmake_minimum_required(VERSION 3.0.0)
- project(test)
- # 指定使用C++标准
- set(CMAKE_CXX_STANDARD 11)
- file(GLOB SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
- add_executable(app ${SRC_LIST})
复制代码 留意:在实际使用中aux_source_directory使用更方便,由于file不光要指定路径,还要指定文件后缀
本文参考:https://www.bilibili.com/video/BV14s4y1g7Zj/?spm_id_from=333.999.0.0
|