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表示发布模式。