cmake 函数功能介绍

本文详细介绍了CMake中的关键函数,如project()用于设置项目信息,add_executable()添加可执行目标,find_package()查找外部库,以及一系列管理和配置项目的函数。这些函数共同构成了CMake的基本构建流程。
摘要由CSDN通过智能技术生成

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.cppmylib.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 上)的动态库文件。

  • 20
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值