1. project()
函数名:project()
函数功能介绍:设置项目的名称和版本,这是每个 CMakeLists.txt
文件的首个命令。
语法说明:project(PROJECT_NAME [VERSION major.minor.patch [LANGUAGES]])
PROJECT_NAME
:项目的名称。VERSION
:项目的版本号(可选)。LANGUAGES
:项目支持的语言列表(可选,默认为C和C++)。
代码用例:
cmake_minimum_required(VERSION 3.10)
project(MyProject VERSION 1.0.0 LANGUAGES CXX)
2. add_executable()
注意:实际上 CMake
使用的是 add_executable()
的别名 add_executable()
,但在某些版本的 CMake
中也可能存在名为 add_library()
或 add_custom_target()
的函数。这里我们以 add_executable()
为例。
函数名:add_executable()
函数功能介绍:添加一个可执行目标以及它的源文件。
语法说明:add_executable(TARGET_NAME source1 [source2 ...])
TARGET_NAME
:生成的可执行文件的名称。source1 [source2 ...]
:生成该可执行文件所需的源文件列表。
代码用例:
add_executable(my_program main.cpp utility.cpp)
3. add_subdirectory()
函数名:add_subdirectory()
函数功能介绍:将子目录添加到构建过程中,使子目录中的 CMakeLists.txt
也被处理。
语法说明:add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
source_dir
:要处理的子目录的路径。binary_dir
:输出文件的目录(可选)。EXCLUDE_FROM_ALL
:如果指定,则该子目录的构建规则不会默认包含在父目录中(可选)。
代码用例:
add_subdirectory(src)
4. find_package()
函数名:find_package()
函数功能介绍:查找并加载外部库或工具的 CMake
模块。
语法说明:find_package(PackageName [VERSION] [EXACT] [QUIET] [NO_MODULE] [[REQUIRED|COMPONENTS] [comp1 ...]])
PackageName
:要查找的库的名称。VERSION
:库的版本号(可选)。EXACT
:要求版本号完全匹配(可选)。QUIET
:如果未找到库,则不输出任何信息(可选)。NO_MODULE
:仅搜索库,不加载CMake
模块(可选)。REQUIRED
:如果库未找到,则停止处理并输出错误(可选)。COMPONENTS
:指定要查找的库的组件列表(可选)。
代码用例:
find_package(Boost 1.70.0 REQUIRED COMPONENTS system filesystem)
5. target_link_libraries()
函数名:target_link_libraries()
函数功能介绍:为指定的目标添加链接库。
语法说明:target_link_libraries(target library1 [library2 ...])
target
:要链接库的目标名称。library1 [library2 ...]
:要链接的库列表。
代码用例:
add_executable(my_program main.cpp)
target_link_libraries(my_program libmylib.a)
6. include_directories()
函数名:include_directories()
函数功能介绍:向编译单元添加包含目录的路径。这允许源文件包含来自指定目录的头文件。
语法说明:include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])
AFTER|BEFORE
:指定添加目录的顺序(可选)。SYSTEM
:将目录视为系统目录(可选)。dir1 [dir2 ...]
:要添加的目录列表。
代码用例:
include_directories(${PROJECT_SOURCE_DIR}/include)
7. set_target_properties()
函数名:set_target_properties()
函数功能介绍:设置指定目标的属性。这可以包括编译选项、链接选项、输出名称等。
语法说明:set_target_properties(target1 [target2 ...] PROPERTIES prop1 value1 [prop2 value2 ...])
target1 [target2 ...]
:要设置属性的目标列表。PROPERTIES
:指定要设置的属性列表。prop1 value1 [prop2 value2 ...]
:属性的名称和值。
代码用例:
set_target_properties(my_library PROPERTIES OUTPUT_NAME "mylib")
8. install()
函数名:install()
函数功能介绍:指定在构建过程中要安装的文件、目录或目标。这通常用于安装编译后的库、可执行文件或头文件。
语法说明:install([TARGETS] [RUNTIME_DESTINATION] [LIBRARY_DESTINATION] [ARCHIVE_DESTINATION] [INCLUDES_DESTINATION] [FILES ...] [PROGRAMS ...] [DIRECTORIES ...] [OPTIONS ...])
TARGETS
:指定要安装的目标列表(可选)。RUNTIME_DESTINATION
:运行时文件的安装目录(可选)。LIBRARY_DESTINATION
:库文件的安装目录(可选)。ARCHIVE_DESTINATION
:归档文件的安装目录(可选)。INCLUDES_DESTINATION
:头文件的安装目录(可选)。FILES ...
:要安装的文件列表(可选)。PROGRAMS ...
:要安装的程序列表(可选)。DIRECTORIES ...
:要安装的目录列表(可选)。
代码用例:
install(TARGETS my_program DESTINATION bin)
install(FILES my_header.h DESTINATION include)
9. if()
函数名:if()
函数功能介绍:根据条件执行不同的代码块。这允许你在CMakeLists.txt文件中进行条件编译。
语法说明:if(condition) ... elseif(condition) ... else() ... endif()
condition
:要评估的条件表达式。...
:在条件为真时执行的代码块。elseif(condition)
:可选的附加条件块(可重复)。else()
:在所有条件都为假时执行的代码块(可选)。endif()
:结束if语句。
代码用例:
if(UNIX)
message(STATUS "Building for Unix")
add_definitions(-DUNIX)
elseif(WIN32)
message(STATUS "Building for Windows")
add_definitions(-DWIN32)
else()
message(STATUS "Building for an unknown platform")
endif()
10. add_custom_command()
函数名:add_custom_command()
函数功能介绍:添加自定义构建规则。这可以用于在构建过程中执行特定的命令或脚本。
语法说明:add_custom_command(OUTPUT output1 [output2 ...] COMMAND command1 [args1...] [COMMAND command2 [args2...]...] [MAIN_DEPENDENCY depend] [DEPENDS depend1 [depend2...]] [IMPLICIT_DEPENDS <lang> depend1 ...] [WORKING_DIRECTORY dir] [COMMENT comment] [VERBATIM] [APPEND] [USES_TERMINAL])
OUTPUT
:自定义命令生成的输出文件。COMMAND
:要执行的命令及其参数。可以指定多个命令。MAIN_DEPENDENCY
:主依赖项(可选)。DEPENDS
:其他依赖项(可选)。IMPLICIT_DEPENDS
:隐式依赖项(可选)。WORKING_DIRECTORY
:执行命令的工作目录(可选)。COMMENT
:注释(可选)。VERBATIM
:如果指定,则命令和参数将按原样传递给shell(可选)。APPEND
:如果指定,则将此命令添加到目标的现有自定义命令列表中(可选)。USES_TERMINAL
:如果指定,则此命令需要一个终端(可选)。
代码用例:
add_custom_command(
OUTPUT custom_output.txt
COMMAND ${CMAKE_COMMAND} -E echo "Hello, CMake!" > custom_output.txt
COMMENT "Generating custom output file"
)
11. add_custom_target()
函数名:add_custom_target()
函数功能介绍:添加一个自定义目标,这可以用于执行一组命令,但不像可执行文件或库那样生成文件。
语法说明:add_custom_target(NAME target [ALL] [COMMAND command1 [args1...]...] [DEPENDS depend1...] [WORKING_DIRECTORY dir] [COMMENT comment] [VERBATIM] [SOURCES src1...])
NAME
:自定义目标的名称。ALL
:如果指定,则该目标将是默认构建目标(可选)。COMMAND
:要执行的命令及其参数(可选)。DEPENDS
:依赖项(可选)。WORKING_DIRECTORY
:执行命令的工作目录(可选)。COMMENT
:注释(可选)。VERBATIM
:如果指定,则命令和参数将按原样传递给shell(可选)。SOURCES
:与自定义目标关联的源文件(可选)。
代码用例:
add_custom_target(my_custom_target
COMMAND ${CMAKE_COMMAND} -E echo "Running custom target..."
COMMENT "This is a custom target"
)
12. function()
和 endfunction()
函数名:function()
和 endfunction()
函数功能介绍:在CMake中定义自定义函数。这允许你创建可重用的代码块,并在CMakeLists.txt文件中多次调用它们。
语法说明:
function(FUNCTION_NAME)
:开始定义名为FUNCTION_NAME
的自定义函数。- 函数体:包含要执行的CMake命令。
endfunction()
:结束自定义函数的定义。
代码用例:
function(my_custom_function)
message(STATUS "Running my custom function...")
# 其他CMake命令...
endfunction()
# 调用自定义函数
my_custom_function()
13. aux_source_directory()
函数名:aux_source_directory()
函数功能介绍:用于将指定目录下的所有源文件列表赋值给一个变量
注意:aux_source_directory()
并不是CMake的内建命令,而是一个常用于CMake的宏(macro)。它用于收集给定目录下的所有源文件,并将它们存储在一个变量中。这个宏通常在CMakeLists.txt
文件中通过include(CMakeFindSourceDir)
来引入。
代码用例(假设aux_source_directory()
宏已经被包含):
aux_source_directory(. SRC_LIST)
add_executable(my_program ${SRC_LIST})
14. find_library()
函数名:find_library()
函数功能介绍:函数用于在指定的搜索路径中查找指定的库文件,并设置相应的变量以便在构建过程中使用
注意:find_library 并不是一个内置的函数
代码用例:
# 包含定义 find_library 函数的自定义模块
include(FindCustomLibs) # 假设 FindCustomLibs.cmake 包含了 find_library 的定义
# 使用 find_library 函数查找名为 MyLib 的库
find_library(MyLib "/usr/lib" "/usr/local/lib")
# 检查库是否找到
if(MyLib_FOUND)
message(STATUS "Found MyLib at ${MyLib_LIBRARY_PATH}")
# 可以在这里添加库到目标链接库等操作
# ...
else()
message(FATAL_ERROR "MyLib not found")
endif()
15. add_library()
函数名:add_library()
函数功能介绍:添加库目标的命令,这个命令指定了库的名称、类型(静态库或动态库)以及构成库的源文件
语法说明:
add_library(target_name [SHARED|STATIC|MODULE]
[EXCLUDE_FROM_ALL]
[source1] [source2] ...
[OPTIONS ...]
[CONFIG_VAR var])
参数说明
target_name
:指定库的名称。SHARED|STATIC|MODULE
:指定库的类型。SHARED
:创建动态库(在 Unix 上为.so
文件,在 Windows 上为.dll
文件)。STATIC
:创建静态库(在 Unix 上为.a
文件,在 Windows 上为.lib
文件)。MODULE
:创建模块库(在 Windows 上类似于.dll
,但在 Unix 上与SHARED
相同)。
EXCLUDE_FROM_ALL
:如果指定,那么这个目标将不会被默认构建。你必须显式地指定它作为构建目标。source1 ... sourceN
:构成库的源文件列表。OPTIONS ...
:传递给编译器的额外选项。CONFIG_VAR var
:这个选项很少使用,它允许你指定一个变量,该变量将包含用于编译库的额外编译器和链接器标志。
代码用例
假设你有一个简单的库,它由 mylib.cpp
和 mylib.h
组成,并且你想要创建一个动态库,你可以这样写你的 CMakeLists.txt
文件:
cmake_minimum_required(VERSION 3.10)
project(MyLibrary)
# 添加一个动态库目标
add_library(MyLibrary SHARED mylib.cpp)
# 如果你有头文件,并且想要安装它们到系统目录,你可以添加以下指令
install(FILES mylib.h DESTINATION include/MyLibrary)
# 如果你想要安装你的库到系统目录,你可以添加以下指令
install(TARGETS MyLibrary DESTINATION lib)
在这个例子中,MyLibrary
是库的名称,SHARED
指定了库的类型为动态库,mylib.cpp
是构成库的源文件。如果你运行 CMake 并随后构建项目,它将生成一个名为 libMyLibrary.so
(在 Unix 上)或 MyLibrary.dll
(在 Windows 上)的动态库文件。