简介
CMake 是一个跨平台的编译工具,可以用来构建 C/C++ 程序。
CMake 实际并不直接构建项目,而是使用平台无关的配置,生成适用于不同编译器和操作系统的构建脚本,如 Makefile、Visual Studio、XCode 等。这使得开发者可以轻松地在不同平台上构建他们的项目。
安装
在终端中输入以下命令:
# Mac
> brew install cmake
# CentOS
> yum install cmake
# Ubuntu
> apt-get install cmake
安装完成后,验证 cmake 是否安装成功:
> cmake --version
cmake version 3.26.1
基本概念
- CMakeLists.txt:该文件包含项目的配置信息和构建规则,定义了项目的源文件、目标文件(可执行文件、库文件)、编译选项等。
- 构建目录:CMake 的构建目录是一个独立的目录,可以和源代码分开,通常会建一个 build 的目录用于存放 CMake 构建生成的文件。
- 生成器:CMake 是跨平台的,意味着它可以生成不同平台的构建文件,如 Makefile、Visual Studio、XCode 等。
配置
目录结构
有一个用于计算的类,提供简单的算数加法,存放在 func 目录下,由一个头文件 calc.h 和一个源文件 calc.cpp 组成,我们的目标是把它编译成动态库,供 main.cpp 调用。另外还有两个 CMakeLists.txt,分别用于构建动态库和可执行文件。
├── func
│ ├── calc.cpp
│ ├── calc.h
│ └── CMakeLists.txt
└── main.cpp
└── CMakeLists.txt
calc.h
#ifndef __CALC_H__
#define __CALC_H__
template <typename T>
class Calc
{
public:
T Add(const T& a, const T& b);
};
#endif // __CALC_H__
calc.cpp
#include "calc.h"
template <typename T>
T Calc<T>::Add(const T& a, const T& b)
{
return a + b;
}
template class Calc<int>;
main.cpp
#include "calc.h"
#include <iostream>
int main()
{
Calc<int> c;
int result = c.Add(1, 2);
std::cout << "result: " << result << std::endl;
}
CMakeLists.txt
CMake 版本要求
# 指定 CMake 最小版本为 3.0
cmake_minimum_required(VERSION 3.0)
C++ 版本要求
# 指定 C++ 版本为 17
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)
项目名称
project(Calc)
设置变量
set(target_name calc)
文件处理
# 生成一个包含当前目录下所有源文件的文件列表,并存储到变量"header_files"中
file(GLOB header_files *.h *.hpp)
# 生成一个包含当前目录下所有源文件的文件列表,并存储到变量"src_files"中
file(GLOB src_files *.cpp)
引用头文件
# 搜索路径
include_directories(./func)
链接动态库
# 搜索路径
link_directories(./func)
# 链接
target_link_libraries({{target_name} {{library_name})
构建动态库
add_library({{target_name} SHARED {{src_files})
构建可执行文件
add_executable({{target_name} {{src_files})
添加并构建子目录
add_subdirectory(./func)
动态库
完整的动态库 CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)
project(Calc)
set(target_name calc)
file(GLOB header_files *.h *.hpp)
file(GLOB src_files *.cpp)
add_library({{target_name} SHARED {{src_files})
可执行文件
完整的可执行文件 CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)
project(Demo)
set(target_name demo)
set(library_name calc)
file(GLOB header_files *.h *.hpp)
file(GLOB src_files *.cpp)
include_directories(./func)
link_directories(./func)
add_executable({{target_name} {{src_files})
target_link_libraries({{target_name} {{library_name})
add_subdirectory(./func)
构建
在程序目录下新建一个 build 目录,用于存放生成的构建文件
> mkdir build
进入 build 目录,执行 cmake
> cd build
> cmake ..
cmake 会生成用于构建程序的脚本,比如 Makefile,执行 make 进行真正的构建
> make
构建完成,运行可执行文件,输出结果
> ./demo
result: 3
总结
有了 CMake 之后,我们就可以从繁琐的 Makefile 中解脱出来,使用 CMake 可以很方便地构建我们的 C/C++ 程序。