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_minimum_required(VERSION 3.10)
project(000-CreateNewProject)
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -fexec-charset=GBK") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fexec-charset=GBK")
if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Debug) endif()
include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/include )
file(GLOB SOURCES "src/*.cpp")
add_executable(${PROJECT_NAME} ${SOURCES})
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) 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
表示发布模式。