CMakeLists.txt
是 CMake 使用的构建脚本文件,它定义了构建项目的指令和选项。通过编写和配置 CMakeLists.txt
文件,可以控制项目的构建过程,包括配置编译器选项、设置头文件路径、链接库等。
下面是详细讲解每个常见命令和配置项的示例和其用途。
基本结构
cmake_minimum_required(VERSION 3.10)
project(MyProject)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
include_directories(include)
add_executable(MyProject src/main.cpp)
1. cmake_minimum_required
指定最低版本的 CMake 版本。如果 CMake 版本低于此值,项目将无法构建。
cmake_minimum_required(VERSION 3.10)
2. project
定义项目的名称和语言。它的一个基本形式是 project(<项目名称>)
。
project(MyProject LANGUAGES CXX) # C++ 项目
3. set
设置变量的值。最常见的用途是设置编译器选项。
set(CMAKE_CXX_STANDARD 11) # 使用 C++11 标准
set(CMAKE_CXX_STANDARD_REQUIRED True) # C++ 标准是强制要求的
4. include_directories
添加头文件搜索路径。可以有一个或多个参数,每个参数是一个目录。
include_directories(include)
include_directories(${CMAKE_SOURCE_DIR}/other_include)
5. add_executable
添加一个要编译的可执行文件。该命令的第一个参数是可执行文件的名称,后面的参数是源文件列表。
add_executable(MyProject src/main.cpp)
进阶结构示例
1. 处理多个源文件
如果项目有多个源文件,可以通过 add_executable
命令一次性添加所有源文件。
项目结构:
MyProject
├── src
│ ├── main.cpp
│ ├── file1.cpp
│ └── file2.cpp
├── include
│ ├── main.h
│ ├── file1.h
│ └── file2.h
└── CMakeLists.txt
CMakeLists.txt 文件:
cmake_minimum_required(VERSION 3.10)
project(MyProject LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
include_directories(include)
add_executable(MyProject
src/main.cpp
src/file1.cpp
src/file2.cpp
)
2. 定义多个可执行文件和库文件
如果项目需要生成多个可执行文件或者多个库文件,可以分别调用 add_executable
和 add_library
命令。
项目结构:
MyProject
├── src
│ ├── app.cpp
│ ├── lib.cpp
├── include
│ └── lib.h
├── CMakeLists.txt
CMakeLists.txt 文件:
cmake_minimum_required(VERSION 3.10)
project(MyProject LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
include_directories(include)
# 添加库文件
add_library(myLib src/lib.cpp)
# 添加可执行文件,并链接库
add_executable(app src/app.cpp)
target_link_libraries(app PRIVATE myLib)
3. 添加子目录
在一个复杂的项目中,你可能有多个子目录,每个子目录包含自己的源文件和 CMakeLists.txt 文件。可以使用 add_subdirectory
将其包含到主项目中。
项目结构:
MyProject
├── app
│ ├── src
│ │ └── main.cpp
│ └── CMakeLists.txt
├── lib
│ ├── src
│ │ └── lib.cpp
│ ├── include
│ │ └── lib.h
│ └── CMakeLists.txt
└── CMakeLists.txt
顶级目录的 CMakeLists.txt:
cmake_minimum_required(VERSION 3.10)
project(MyProject LANGUAGES CXX)
add_subdirectory(app)
add_subdirectory(lib)
app 子目录中的 CMakeLists.txt:
project(App LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
add_executable(app src/main.cpp)
target_link_libraries(app PRIVATE myLib)
lib 子目录中的 CMakeLists.txt:
project(Lib LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
include_directories(include)
add_library(myLib src/lib.cpp)
4. 导入外部库
可以使用 find_package
命令导入外部库。例如,导入 Boost 库:
cmake_minimum_required(VERSION 3.10)
project(MyProject LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
find_package(Boost 1.70 REQUIRED COMPONENTS filesystem system)
include_directories(${Boost_INCLUDE_DIRS})
add_executable(MyProject src/main.cpp)
target_link_libraries(MyProject PRIVATE ${Boost_LIBRARIES})
CMake 常用命令总结
add_library
定义一个库文件,可以是静态库(STATIC)或动态库(SHARED)。
add_library(MyLib STATIC src/lib.cpp)
target_link_libraries
将目标(可执行文件或库)与库文件绑定。
target_link_libraries(MyProject PRIVATE MyLib)
file(GLOB ...)
使用模式匹配(glob pattern)将文件添加到变量中:
file(GLOB SRCS "src/*.cpp")
add_executable(MyProject ${SRCS})
install
设置安装目标和安装路径:
install(TARGETS MyProject DESTINATION bin)
install(FILES include/main.h DESTINATION include)
option
创建开关型变量,通常用于配置选项:
option(USE_MYLIB "Use MyLib library" ON)
if(USE_MYLIB)
add_subdirectory(mylib)
target_link_libraries(MyProject PRIVATE MyLib)
endif()
进阶主题
条件编译
根据条件选择不同的构建选项和配置。
if(UNIX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
elseif(WIN32)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3")
endif()
配置文件生成
通过配置文件提供不同环境下的构建选项:
configure_file(config.h.in config.h)
config.h.in 文件内容示例:
#define PROJECT_NAME "@PROJECT_NAME@"
#define PROJECT_VERSION "@PROJECT_VERSION@"
CMakeLists.txt 配置示例:
set(PROJECT_NAME "MyProject")
set(PROJECT_VERSION "1.0")
configure_file(config.h.in config.h)
include_directories(${CMAKE_BINARY_DIR})
这样,CMake 会在构建目录中生成一个配置文件 config.h,填充相应的宏定义。
总结
CMake 是一个非常强大的构建系统生成工具,通过编写和配置 CMakeLists.txt
文件,你可以高度自定义项目的构建过程。无论是简单的单文件项目,还是复杂的多模块项目,CMake 都能提供灵活性和扩展性。通过理解和使用 CMake 的基本命令和高级特性,你可以高效地管理项目的构建流程。