0.准备工作
- add.c
#include <stdio.h> #include "head.h" int add(int a, int b) { return a+b; }
- sub.c
#include <stdio.h> #include "head.h" int subtract(int a, int b) { return a-b; }
- mult.c
#include <stdio.h> #include "head.h" int multiply(int a, int b) { return a*b; }
- div.c
#include <stdio.h> #include "head.h" double divide(int a, int b) { return (double)a/b; }
- head.h
// head.h #ifndef _HEAD_H #define _HEAD_H int add(int a, int b); int subtract(int a, int b); int multiply(int a, int b); double divide(int a, int b); #endif
- main.c
#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", subtract(a, b)); printf("a * b = %d\n", multiply(a, b)); printf("a / b = %f\n", divide(a, b)); return 0; }
1.添加CMakeLists.txt文件
- 在上述源文件所在目录下添加一个新文件
CMakeLists.txt
cmake_minimum_required(VERSION 3.0) project(CALC) add_executable(app add.c div.c main.c mult.c sub.c)
cmake_minimum_require
:指定使用的CMake最低版本- 可选,非必须,如果不加可能会有警告
project
:定义工程名称- 并可指定工程的版本、工程描述、web主页地址、支持的语言(默认情况支持所有语言)
- 如果不需要这些都是可以忽略的,只需要指定出工程名字即可
# PROJECT 指令的语法是: project(<PROJECT-NAME> [<language-name>...]) project(<PROJECT-NAME> [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]] [DESCRIPTION <project-description-string>] [HOMEPAGE_URL <url-string>] [LANGUAGES <language-name>...])
add_excutable
:定义工程会生成一个可执行程序- 这里的可执行程序名和
project
中的项目名没有任何关系add_executable(可执行程序名 源文件名称)
- 源文件名可以是一个,也可以是多个,如有多个可以用空格或
;
分隔# 样式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)
- 这里的可执行程序名和
2.执行cmake命令
- 将
CMakeLists.txt
文件编辑好之后,就可以执行cmake
命令了 - 语法:
cmake CMakeLists.txt文件所在路径
- 在执行
cmake
命令之后,CMakeLists.txt
中的命令就会被执行,所以一定要注意给cmake
命令指定路径的时候一定不能出错 - 此时,对应目录下会生成一个
makefile
文件,此时再执行make
命令,就可以对项目进行构建得到所需要的程序了. ├── CMakeCache.txt ├── CMakeFiles ├── Makefile └── cmake_install.cmake
- 在执行
- 注意:
- 如果在
CMakeLists.txt
文件所在目录执行了cmake
命令之后就会生成一些目录和文件(包括makefile文件) - 如果再基于
makefile
执行make
命令,程序在编译过程中还会生成一些中间文件和一个可执行文件,这样会导致整个项目目录看起来很混乱,不太容易管理和维护 - 此时可以把生成的这些与项目源码无关的文件统一放到一个对应的目录里边
- 比如:将这个目录命名为
build
- 比如:将这个目录命名为
- 如果在
3.变量定义
- 在上面的例子中一共提供了5个源文件,假设这五个源文件需要反复被使用,每次都直接将它们的名字写出来确实是很麻烦,此时就需要定义一个变量,将文件名对应的字符串存储起来
- 在CMake里定义变量需要使用
set
- 语法:
[]
中的参数为可选项,如不需要可以不写SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]]) # 方式1: 各个源文件之间使用空格间隔 set(SRC_LIST add.c div.c main.c mult.c sub.c) # 方式2: 各个源文件之间使用;间隔 set(SRC_LIST add.c;div.c;main.c;mult.c;sub.c) add_executable(app ${SRC_LIST})
4.指定使用的C++标准
- 在编写C++程序的时候,可能会用到C++11、C++14、C++17、C++20等新特性,那么就需要在编译的时候在编译命令中制定出要使用哪个标准
g++ *.cpp -std=c++11 -o app
- 在CMake中想要指定C++标准有两种方式
- 在
CMakeLists.txt
中通过set
命令指定set(CMAKE_CXX_STANDARD 11)
- 在执行
cmake
命令的时候指定出这个宏的值cmake CMakeLists.txt文件路径 -DCMAKE_CXX_STANDARD=11
- 在
5.指定输出路径
- 在CMake中指定可执行程序输出的路径,也对应一个宏,叫做
EXECUTABLE_OUTPUT_PATH
,它的值还是通过set
命令进行设置set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
- 如果指定的目录不存在,会自动生成,无需自己手动创建
- 注意:
- 由于可执行程序是基于
cmake
命令生成的makefile
文件然后再执行make
命令得到的 - 如果此处指定可执行程序生成路径的时候使用的是相对路径
./xxx/xxx
,那么此处的./
对应的就是makefile文件所在的那个目录
- 由于可执行程序是基于
PROJECT_SOURCE_DIR
宏对应的值是在使用cmake命令时,后面紧跟的目录,一般是工程的根目录