CMake 入门

2024-03-07 15:25 杨晓琪 336

简介

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++ 程序。