本节我们用CMake 构建我们的第一个helloword的项目,从更细的粒度上了解CMake在做什么,对编写CMakeLists.txt 进入初步引入
本专栏的实践代码全部放在 github 上,欢迎 star !!!
如有问题,欢迎留言、或加群【392784757】交流
准备
hello-cmake.cpp 代码内容
#include <cstdlib>
#include <iostream>
#include <string>
std::string say_hello() { return std::string("hello CMake world!"); }
int main()
{
std::cout << say_hello() << std::endl;
return EXIT_SUCCESS;
}
配套的CMakeLists.txt 内容如下
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
set(CMAKE_CXX_STANDARD 17)
project(01-hello-cmake LANGUAGES CXX)
message("hello cmake!")
add_executable(hello-world hello-world.cpp)
基础框架
cmake_minimum_required(VERSION 3.5 FATAL_ERROR) # cmake 版本要求
set(CMAKE_CXX_STANDARD 17)
project(project_name LANGUAGES CXX)
# 其他配置
# 路径配置 include路径 link路径
# 构建目标
# 目标属性设置
# ...
执行操作
配置过程
cmake -B build -S .
构建过程
cmake --build build
遇到报错,检查代码和CMakeLists.txt,有时候需删除缓存 即删除build 文件夹,重新执行
分步执行【更细粒度】
针对linux/windows nmake 来测试,windows vs 无法执行
cmake程序分步生成、指定项目和清理
cmake -B nmake -S . -G "NMake Makefiles" # 配置
cmake --build . --target help
cmake --build . --target 101first_cmake.i # 预处理
cmake --build . --target 101first_cmake.s # 编译 .s
cmake --build . --target 101first_cmake.o # 汇编 .o
cmake --build hello-world # 链接
# 运行 动态库加载路径
.\hello-cmake
# 或
.\hello-cmake.exe
cmake --build . --target clean # 清理
从上面的例子,也可以看到,cmake 是一个 构建系统 指导工具,通过 cmake 指令 来调用构建系统(编译器,链接器等等),完成项目的构建(包括预处理、编译、链接,甚至清理等),在这个过程中,基本看不到编译器等相关命令,但实际上cmake 调用了它们,因此也可以看出 cmake 是一个更高层面的工具,从而为其实现跨平台提供了可能