2. CMake 的简单使用
2. CMake 的简单使用
我们创建一个工程目录,在里面定义一些简单的加减乘除运算,然后定义一个 main.cpp 的文件:
结构如下:
tree /f .\
D:\SOURCE\CMAKE_PROJ
└─proj1
add.cpp
CMakeLists.txt
div.cpp
head.h
main.cpp
mul.cpp
sub.cpp
其中 header.h
里面放了相关数学运算的定义,这里的代码都不难,主要做演示使用。
如下是 main.cpp
的内容:
#include <iostream>
#include "head.h" // 注释掉这行,就要取消 extern 部分的注释
// extern 提示到别的模块去找函数的具体实现
// extern double mul(const double x1, const double x2);
// extern double add(const double x1, const double x2);
// extern double sub(const double x1, const double x2);
// extern double div(const double x1, const double x2);
int main(int argc, char **argv) {
double x1 = 3.14, x2 = 6.18;
double add_res = add(x1, x2);
double mul_res = mul(x1, x2);
double sub_res = sub(x1, x2);
double div_res = div(x1, x2);
std::cout << add_res << " " << mul_res << " " << sub_res << " " << div_res
<< '\n';
return 0;
}
如果要构建一个可执行文件,我们最开始学的就是使用 g++ 或者 clang++ 直接编译:
g++ -Wall -g main.cpp add.cpp mul.cpp -o main.exe
运行:
.\main.exe
9.32 19.4052 -3.04 0.508091
添加 CMakeLists.txt:在当前工程目录下添加一个文件,CMakeLists.txt
2.1 只有源文件
2.1.1 注释
使用 #
进行行注释,使用 #[[]]
进行块注释
# 这是一个行注释
#[[
这是
一个
块注释]]
cmake_minimum_required(VERSION 3.17)
project(CALC)
add_executable(app add.c div.c main.c mult.c sub.c)
2.1.2 最低版本要求
cmake_minimum_required(VERSION 3.xx)
: 指定了本地的 CMake 的最低版本(非必须,但建议添加)
cmake_minimum_required(VERSION 3.17)
2.1.3 指定工程信息
project
:定义工程名称,并可指定工程的版本、工程描述、web主页地址、支持的语言(默认情况支持所有语言),如果不需要这些都是可以忽略的,只需要指定出工程名字即可。
project(<PROJECT_NAME> [<language-name>...])
project(<PROJECT-NAME>
[VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
[DESCRIPTION <project-description-string>]
[HOMEPAGE_URL <url-string>]
[LANGUAGES <language-name>...])
这里的 [<language-name>]
就是支持构建的语言类型,如 C,C++ 等。
2.1.4 生成可执行程序
add_executable
:被定义的工程会生成一个可执行程序
add_executable(可执行程序名 源文件名)
# 可执行程序名:不需要添加后缀,和 project 中的名称没有关系
# 源文件名:所有需要的源文件,可以是一个,也可以是多个
例如本程序中的:
cmake_minimum_required(VERSION 7.17)
project(CALC)
add_executable(calc main.cpp div.cpp sub,cpp mul.cpp add.cpp)
也可以写成如下样式:
add_executable(calc main.cpp;div.cpp;sub,cpp;mul.cpp;add.cpp)
然后我们就可以生成可执行程序了,在这里我们创建一个文件夹:build
,将生成的文件全部放入 build 中,就不会让目录看起来乱糟糟的:
mkdir build
cd build
cmake .. # 对 CMakeList.txt 所在的目录进行访问执行
在 Windows 系统生成的文件上是这样的:
cmake ..
-- Building for: Visual Studio 17 2022
-- Selecting Windows SDK version 10.0.22621.0 to target Windows 10.0.22631.
-- The C compiler identification is MSVC 19.38.33130.0
-- The CXX compiler identification is MSVC 19.38.33130.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: D:/Program Files/Visual Studio/Community/2022/VC/Tools/MSVC/14.38.33130/bin/Hostx64/x64/cl.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: D:/Program Files/Visual Studio/Community/2022/VC/Tools/MSVC/14.38.33130/bin/Hostx64/x64/cl.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done (3.2s)
-- Generating done (0.0s)
-- Build files have been written to: D:/Source/cmake_proj/proj1/build
\tree /f .\build
D:\SOURCE\CMAKE_PROJ\PROJ1\BUILD
│ ALL_BUILD.vcxproj
│ ALL_BUILD.vcxproj.filters
│ CALC.sln
│ calc.vcxproj
│ calc.vcxproj.filters
│ CMakeCache.txt
│ cmake_install.cmake
│ ZERO_CHECK.vcxproj
│ ZERO_CHECK.vcxproj.filters
│
└─CMakeFiles
可以看到,在 Windows 系统下,默认情况下它生成了一个 Visual Studio 可以打开的工程。当然也可以使用 CLion 或者 Qt Creator 打开当前工程
而在 Linux 下是这样的:
cmake ..
-- The C compiler identification is GNU 11.4.0
-- The CXX compiler identification is GNU 11.4.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/yuzu/cmake_proj/proj1/build
tree ./ -L 1
├── CMakeCache.txt
├── CMakeFiles
├── Makefile
└── cmake_install.cmake
1 directory, 3 files
在Linux 系统下,生成了一个 makefile
文件,还没有生成 calc
的可执行文件,只需要输入如下命令且运行:
make
[ 16%] Building CXX object CMakeFiles/calc.dir/main.cpp.o
[ 33%] Building CXX object CMakeFiles/calc.dir/div.cpp.o
[ 50%] Building CXX object CMakeFiles/calc.dir/sub.cpp.o
[ 66%] Building CXX object CMakeFiles/calc.dir/mul.cpp.o
[ 83%] Building CXX object CMakeFiles/calc.dir/add.cpp.o
[100%] Linking CXX executable calc
[100%] Built target calc
此时查看生成的文件,:
ls
CMakeCache.txt CMakeFiles Makefile calc cmake_install.cmake
执行该二进制文件
./calc
9.32 19.4052 -3.04 0.508091
所以通过这种方式构建工程是没有问题的。
当然,这种 CMakeLists 文件是最简单的,但是具体工程中我们很难将所有的文件都写出来,而要采用一些其他的方式。
更新:
现代 CMake 提供了更方便的
-B
和--build
指令,不同平台,使用统一的命令:cmake -B build # 在源码目录中用 -B 直接创建 build 目录并生成 build/Makefile cmake -build build -j4 # 自动调用本地的构建系统在 build 里构建,即:make -C build -j4 sudo cmake --build build --target install # 调用本地的构建系统执行 install 这个目标,即安装
cmake -B build
免去了创建 build 再切换进去指定源代码的麻烦
cmake --build build
统一了不同平台(Linux 上会调用 make,Windows 上调用 devenv.exe)