CMake之CMakeList.txt文件介绍

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_executableadd_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 的基本命令和高级特性,你可以高效地管理项目的构建流程。

  • 24
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值