常用命令
1、cmake_minimum_required
用于指定构建当前项目所需的最低CMake版本。它告诉CMake解析器,必须至少使用指定版本的CMake才能正确地构建项目。基本语法:
cmake_minimum_required(VERSION version)
2、project
用于定义和配置项目的基本信息。基本语法:
project(project_name
[VERSION major[.minor[.patch[.tweak]]]]
[DESCRIPTION description]
[HOMEPAGE_URL url]
[LANGUAGES language1 [language2 ...]]
)
其中,各个参数的含义如下:
project_name
:指定项目的名称。VERSION
:可选参数,指定项目的版本号。DESCRIPTION
:可选参数,指定项目的描述信息。HOMEPAGE_URL
:可选参数,指定项目的主页URL。LANGUAGES
:可选参数,指定项目所使用的编程语言,如C、C++等。如果不指定,默认为C和C++。
示例:
project(MyProject VERSION 1.0 DESCRIPTION "my project demo" LANGUAGES C CXX)
3、set
用于设置变量的值。示例:
set(SOME_VAR "some value")
4、option
用于定义一个开关选项,允许用户在配置项目时选择是否启用某些功能或选项。这些选项通常以布尔值(ON
或OFF
)表示。基本语法如下:
option(<option_variable> "<option_description>" <default_value>)
其中,各个参数的含义如下:
<option_variable>
:定义的选项变量的名称。"<option_description>"
:选项的描述文本,将在配置过程中显示给用户。<default_value>
:选项的默认值,可以是ON
或OFF
。
示例:
option(FLAG "a flag" ON)
5、add_subdirectory
用于向CMake项目中添加子目录,并处理子目录中的CMakeLists.txt
文件。
示例:
add_subdirectory(source)
6、include_directories
用于向CMake项目添加包含目录,以便编译器能够找到所需的头文件。
示例:
include_directories(include)
7、target_include_directories
用于为特定目标(如可执行文件、库等)添加包含目录的命令。与全局性的 include_directories
不同,target_include_directories
允许针对具体目标设置包含路径,这样做有助于更好地控制项目的模块化和依赖关系。基本语法:
target_include_directories(target
[SYSTEM]
[BEFORE | AFTER]
[INTERFACE | PUBLIC | PRIVATE]
directory1
[directory2 ...]
)
各个参数的含义如下:
target
:指定要为其添加包含目录的目标(如可执行文件、库等)。SYSTEM
:可选参数,将目录添加到系统的包含路径中。这通常用于区分用户自定义的包含路径和系统提供的包含路径。BEFORE
/AFTER
:可选参数,用于控制添加的目录在已有包含路径中的位置。BEFORE
表示添加在已有包含路径的前面,AFTER
表示添加在已有包含路径的后面。INTERFACE
/PUBLIC
/PRIVATE
:可选参数,用于指定目录的可见性。INTERFACE
表示该目录将被导出到目标的接口中,对其依赖的目标可见;PUBLIC
表示该目录将被导出到目标的公共部分中,对该目标的依赖方和依赖该目标的其他目标可见;PRIVATE
表示该目录仅对目标自身可见,不会被导出到依赖方。
示例:
target_include_directories(${TARGET} PUBLIC ${INCLUDE_PATH})
8、list
用于处理列表。基本语法如下:
list(LENGTH <list> <output_variable>)
list(APPEND <list> <element1> [<element2> ...])
list(INSERT <list> <index> <element1> [<element2> ...])
list(REMOVE_ITEM <list> <value> [<value> ...])
list(REMOVE_AT <list> <index> [<index> ...])
list(REMOVE_DUPLICATES <list>)
list(REVERSE <list>)
list(SORT <list>)
list(GET <list> <index> <output_variable>)
list(JOIN <list> <glue> <output_variable>)
LENGTH
: 获取列表的长度,并将结果存储到指定的变量中。APPEND
: 向列表末尾添加一个或多个元素。INSERT
: 在列表的指定位置插入一个或多个元素。REMOVE_ITEM
: 从列表中移除指定的元素。REMOVE_AT
: 从列表中移除指定位置的元素。REMOVE_DUPLICATES
: 移除列表中的重复元素。REVERSE
: 反转列表中元素的顺序。SORT
: 对列表中的元素进行排序。GET
: 获取列表中指定位置的元素,并将结果存储到指定的变量中。JOIN
: 将列表中的元素使用指定的分隔符连接成一个字符串,并将结果存储到指定的变量中。
9、aux_source_directory
用于将指定目录下的所有源文件自动添加到一个变量中。基本语法:
aux_source_directory(dir variable)
如把当前目录下所有源文件添加到一个变量中:
aux_source_directory(. SOURCES)
10、file
命令用于执行各种文件系统操作,包括创建、复制、删除文件或目录,检查文件或目录的属性等。file(GLOB ...)
是CMake中用于查找文件的命令。它可以根据指定的模式匹配文件,并将匹配到的文件列表存储到变量中。如果有一个目录包含源文件,并且你想把所有的.cpp
文件添加到一个变量中,示例如下:
file(GLOB SOURCES "src/*.cpp")
11、source_group
用于将CMake项目中的文件组织到特定的组(也称为“文件夹”或“分组”),可以讲文件显示到不同的分组。如想将源文件显示到source目录下,头文件显示到include目录下,示例如下:
aux_source_directory(. SOURCES)
source_group("source" FILES ${SOURCES})
file(GLOB INCLUDE "./*.h")
source_group("include" FILES ${INCLUDE})
12、add_executable
用于创建可执行文件的命令。
示例:
# 定义源文件
set(SOURCES main.cpp hello.cpp)
# 创建可执行文件
add_executable(hello_world ${SOURCES})
13、add_library
用于创建库的命令。通过这个命令,你可以定义静态库(.lib
,.a
)或动态库(.dll
,.so
)的目标。基本语法:
add_library(<target_name> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
source1 [source2 ...])
<target_name>
:库的名称。[STATIC | SHARED | MODULE]
:可选项,指定库的类型,分别为静态库、动态库和模块库。默认为静态库。[EXCLUDE_FROM_ALL]
:可选项,指定是否将该库排除在make all
或build
过程之外。这在构建过程中的选择性构建中很有用。source1 [source2 ...]
:库的源文件列表
示例:
# 定义静态库
add_library(my_static_lib STATIC util.cpp)
# 定义动态库
add_library(my_shared_lib SHARED util.cpp)
14、set_target_properties
用于设置目标属性的命令。基本语法:
set_target_properties(target1 target2 ...
PROPERTIES prop1 value1
prop2 value2 ...)
target1 target2 ...
:目标的名称,可以是可执行文件、静态库、动态库等。PROPERTIES
:用于指定目标的属性。prop1 value1 prop2 value2 ...
:要设置的属性及其对应的值。
常见属性:
OUTPUT_NAME
:指定生成的可执行文件或库的名称。RUNTIME_OUTPUT_DIRECTORY
:指定可执行文件的输出目录。LIBRARY_OUTPUT_DIRECTORY
:指定库文件的输出目录。ARCHIVE_OUTPUT_DIRECTORY
:指定静态库文件的输出目录。CXX_STANDARD
:指定 C++ 标准(如CXX_STANDARD 11
、CXX_STANDARD 14
等)。COMPILE_OPTIONS
:指定编译选项。INCLUDE_DIRECTORIES
:指定包含目录。LINK_LIBRARIES
:指定链接的库。
示例:
# 设置可执行文件的输出名称和路径
set_target_properties(my_executable PROPERTIES
OUTPUT_NAME "my_app"
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
15、target_link_libraries
用于为目标(如可执行文件、静态库、动态库)设置链接依赖的命令。它的主要作用是将目标与其他库或目标进行链接,以便在构建过程中正确地解析符号并生成最终的可执行文件或库。
示例:
# 创建一个可执行文件
add_executable(my_executable main.cpp)
# 链接一个名为 "my_library" 的库到可执行文件
target_link_libraries(my_executable my_library)
target_link_libraries
还支持一些选项来控制链接的行为和作用域:
PUBLIC
:链接库时,PUBLIC
选项会将链接信息传递给依赖当前目标的其他目标。PRIVATE
:PRIVATE
选项表示链接信息仅在当前目标中使用,不会传递给依赖当前目标的其他目标。INTERFACE
:INTERFACE
选项表示目标不会链接这些库,但是会将链接信息传递给依赖当前目标的其他目标。
示例:
# 创建一个可执行文件
add_executable(my_executable main.cpp)
# 链接一个名为 "my_library" 的库,并将链接信息传递给依赖当前目标的其他目标
target_link_libraries(my_executable PUBLIC my_library)
在构建 CMake 项目时会遇到类似于 debug
和 optimized
的调试和优化相关的选项,这些选项通常与 CMake 的变量和属性一起使用。
一种常见的做法是使用 CMake 中的 CMAKE_BUILD_TYPE
变量来指定构建类型(例如 Debug、Release 或者其他自定义的类型)。然后,在根据构建类型来指定相应的链接选项。
示例:
# 设置构建类型,默认为 Release
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()
# 创建一个可执行文件
add_executable(my_executable main.cpp)
# 根据构建类型设置不同的链接选项
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
target_link_libraries(my_executable debug my_debug_library)
else()
target_link_libraries(my_executable optimized my_release_library)
endif()
我自己写了一点练练手。
创建总的工程目录cmake示例:
cmake_minimum_required(VERSION 1.0.0)
project(MyProject VERSION "1.0.0")
## set path
set(FW_INCLUDE_PATH "${PROJECT_SOURCE_DIR}/framework/include")
set(FW_SOURCE_PATH "${PROJECT_SOURCE_DIR}/framework/source")
## code file
option(BUILD_FRAMEWORK_FLAG "BUILD_FRAMEWORK_FLAG" ON)
if(BUILD_FRAMEWORK_FLAG)
add_subdirectory(framework)
endif(BUILD_FRAMEWORK_FLAG)
子目录cmakelists示例:
set(TARGET "component")
set(OUT_PUT_NAME "libComponent")
include_directories("${FW_INCLUDE_PATH}")
include_directories("${CMAKE_CURRENT_SOURCE_DIR}")
aux_source_directory(. SOURCES)
source_group("source" FILES ${SOURCES})
file(GLOB PUBLICS "${FW_INCLUDE_PATH}/component/*.h")
source_group("public" FILES ${PUBLICS})
file(GLOB INCLUDE "./*.h")
source_group("include" FILES ${INCLUDE})
set(ALL_SOURCES
${SOURCES}
${PUBLICS}
${INCLUDE}
"CmakeLists.txt")
add_library(${TARGET} SHARED ${ALL_SOURCES})
set_target_properties(${TARGET} PROPERTIES OUTPUT_NAME ${OUT_PUT_NAME})
set_target_properties(${TARGET} PROPERTIES FOLDER "component")