cmake学习(1)

cmake学习(1)

目录

简介

这里记录cmake的CMakeLists.txt编写的一些笔记,用于学习与记录,主要参考cmake官方文档

例程与解析

例程

这里我们以之前的的000-CreateNewProject(创建新项目工具)的CMakeLists.txt为例,进行解析。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# 设置最低 CMake 版本要求
cmake_minimum_required(VERSION 3.10)

# 创建排序算法项目
project(000-CreateNewProject)

# 复制模板文件
# add_custom_target(CopyTemplate ALL
# COMMAND ${CMAKE_COMMAND} -E copy_directory
# ${CMAKE_CURRENT_SOURCE_DIR}/template
# ${CMAKE_CURRENT_BINARY_DIR}/template
# COMMENT "Copying template files..."
# )

# 设置C++标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 设置exe输出格式为GBK 解决中文乱码问题
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -fexec-charset=GBK")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fexec-charset=GBK")

# 设置构建类型(Debug/Release)
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Debug)
# set(CMAKE_BUILD_TYPE Release)
endif()

# 添加包含目录
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}/include
)

# 收集所有源文件
file(GLOB SOURCES "src/*.cpp")

# 创建可执行文件
add_executable(${PROJECT_NAME} ${SOURCES})

# 使可执行文件依赖复制操作
# add_dependencies(${PROJECT_NAME} CopyTemplate)

# 设置目标属性
set_target_properties(${PROJECT_NAME} PROPERTIES
OUTPUT_NAME "${PROJECT_NAME}"
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${PROJECT_NAME}"
)

# 设置输出目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)

解析

1. 设置最低 CMake 版本要求

1
cmake_minimum_required(VERSION 3.10)
  • cmake_minimum_required用于设置最低的CMake版本要求,这里设置为3.10。

2. 创建排序算法项目

1
project(000-CreateNewProject)
  • project用于创建一个项目,这里创建了一个名为000-CreateNewProject的项目。

3. 复制模板文件

1
2
3
4
5
6
add_custom_target(CopyTemplate ALL
COMMAND ${CMAKE_COMMAND} -E copy_directory
${CMAKE_CURRENT_SOURCE_DIR}/template
${CMAKE_CURRENT_BINARY_DIR}/template
COMMENT "Copying template files..."
)
  • add_custom_target用于添加一个自定义目标,这里添加了一个名为CopyTemplate的自定义目标,用于复制模板文件。
  • COMMAND用于指定要执行的命令,这里指定了要执行的命令为:
    • ${CMAKE_COMMAND} -E copy_directory :复制目录命令
    • ${CMAKE_CURRENT_SOURCE_DIR}/template : 源目录,即${CMAKE_CURRENT_SOURCE_DIR}/template目录下的所有文件
      • CMAKE_CURRENT_SOURCE_DIR:表示当前CMakeLists.txt所在的目录。
    • ${CMAKE_CURRENT_BINARY_DIR}/template: 目标目录,即${CMAKE_CURRENT_BINARY_DIR}/template目录下的所有文件
      • CMAKE_CURRENT_BINARY_DIR表示当前构建目录。
  • COMMENT用于指定要显示的注释,这里指定了要显示的注释为Copying template files...

4. 设置C++标准

1
2
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
  • set用于设置变量,这里设置了两个变量:
    • CMAKE_CXX_STANDARD用于设置C++标准,这里设置为17。
    • CMAKE_CXX_STANDARD_REQUIRED用于设置是否需要C++标准,这里设置为ON。

5. 设置exe输出格式为GBK 解决中文乱码问题

1
2
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -fexec-charset=GBK")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fexec-charset=GBK")
  • set用于设置变量,这里设置了两个变量:
    • CMAKE_C_FLAGS用于设置C编译选项,这里设置了-Wall-fexec-charset=GBK
    • CMAKE_CXX_FLAGS用于设置C++编译选项,这里设置了-Wall-fexec-charset=GBK
    • -Wall用于显示所有警告信息。
    • -fexec-charset=GBK用于设置输出格式为GBK。

6. 设置构建类型(Debug/Release)

1
2
3
4
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Debug)
# set(CMAKE_BUILD_TYPE Release)
endif()
  • if用于判断条件,这里判断了CMAKE_BUILD_TYPE是否为空,如果为空,则设置CMAKE_BUILD_TYPE为Debug,否则不设置。
    • CMAKE_BUILD_TYPE用于设置构建类型,这里设置为Debug。

7. 添加包含目录

1
2
3
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}/include
)
  • include_directories用于添加包含目录,这里添加了${CMAKE_CURRENT_SOURCE_DIR}/include目录。
    • CMAKE_CURRENT_SOURCE_DIR表示当前CMakeLists.txt所在的目录。

8. 收集所有源文件

1
file(GLOB SOURCES "src/*.cpp")
  • file用于执行文件操作,这里使用了GLOB命令,用于收集所有源文件,这里收集了src目录下的所有.cpp文件,并将结果保存在SOURCES变量中。
    • GLOB命令用于收集文件,这里收集了src目录下的所有.cpp文件。
    • SOURCES变量用于保存收集到的文件列表。

9. 创建可执行文件

1
add_executable(${PROJECT_NAME} ${SOURCES})
  • add_executable用于创建可执行文件,这里创建了一个名为${PROJECT_NAME}的可执行文件,并将${SOURCES}变量中的所有源文件添加到可执行文件中。
    • ${PROJECT_NAME}表示当前项目名。
    • ${SOURCES}表示所有源文件。

10. 使可执行文件依赖复制操作,保证程序运行前文件已复制

1
add_dependencies(${PROJECT_NAME} CopyTemplate)
  • add_dependencies用于添加依赖关系,这里将CopyTemplate添加为${PROJECT_NAME}的依赖关系,即${PROJECT_NAME}依赖于CopyTemplate
    • CopyTemplate表示自定义目标,即复制模板文件的目标。
    • ${PROJECT_NAME}表示当前项目名。

11. 设置目标属性

1
2
3
4
set_target_properties(${PROJECT_NAME} PROPERTIES
OUTPUT_NAME "${PROJECT_NAME}"
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${PROJECT_NAME}"
)
  • set_target_properties用于设置目标属性,这里设置了两个属性:
    • OUTPUT_NAME用于设置输出文件名,这里设置为${PROJECT_NAME}
    • RUNTIME_OUTPUT_DIRECTORY用于设置输出目录,这里设置为${CMAKE_BINARY_DIR}/${PROJECT_NAME}
    • PROPERTIES用于指定要设置的属性。
    • ${PROJECT_NAME}表示当前项目名。
    • ${CMAKE_BINARY_DIR}表示当前构建目录。

12. 设置输出目录

1
2
3
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
  • set用于设置变量,这里设置了三个变量:
    • CMAKE_RUNTIME_OUTPUT_DIRECTORY用于设置可执行文件的输出目录,这里设置为${CMAKE_BINARY_DIR}/bin
    • CMAKE_ARCHIVE_OUTPUT_DIRECTORY用于设置静态库的输出目录,这里设置为${CMAKE_BINARY_DIR}/lib
    • CMAKE_LIBRARY_OUTPUT_DIRECTORY用于设置动态库的输出目录,这里设置为${CMAKE_BINARY_DIR}/lib
    • CMAKE_BINARY_DIR表示当前构建目录。

总结

  • cmake_minimum_required用于设置最低的CMake版本要求。
  • project用于创建一个项目。
  • add_custom_target用于添加一个自定义目标。
  • set用于设置变量。
  • include_directories用于添加包含目录。
  • file用于执行文件操作。
  • add_executable用于创建可执行文件。
  • add_dependencies用于添加依赖关系。
  • set_target_properties用于设置目标属性。
  • set用于设置输出目录。
  • CMAKE_CURRENT_SOURCE_DIR表示当前CMakeLists.txt所在的目录。
  • CMAKE_CURRENT_BINARY_DIR表示当前构建目录。
  • CMAKE_BINARY_DIR表示当前构建目录。
  • ${PROJECT_NAME}表示当前项目名。
  • ${SOURCES}表示所有源文件。
  • ${CMAKE_COMMAND} -E copy_directory用于复制目录命令。
  • -Wall用于显示所有警告信息。
  • -fexec-charset=GBK用于设置输出格式为GBK。
  • CMAKE_BUILD_TYPE用于设置构建类型。
  • CMAKE_RUNTIME_OUTPUT_DIRECTORY用于设置可执行文件的输出目录。
  • CMAKE_ARCHIVE_OUTPUT_DIRECTORY用于设置静态库的输出目录。
  • CMAKE_LIBRARY_OUTPUT_DIRECTORY用于设置动态库的输出目录。
  • OUTPUT_NAME用于设置输出文件名。
  • RUNTIME_OUTPUT_DIRECTORY用于设置输出目录。
  • COMMAND用于指定要执行的命令。
  • COMMENT用于指定要显示的注释。
  • CMAKE_CXX_STANDARD用于设置C++标准。
  • CMAKE_CXX_STANDARD_REQUIRED用于设置是否需要C++标准。
  • GLOB用于收集所有源文件。
  • CMAKE_C_FLAGS用于设置C编译选项。
  • CMAKE_CXX_FLAGS用于设置C++编译选项。
  • Debug表示调试模式。
  • Release表示发布模式。

cmake学习(1)
http://ankali-aylina.github.io/2025/07/22/cmake学习-1/
作者
Ankali-Aylina
发布于
2025年7月22日
更新于
2025年7月24日
许可协议