😈「CSDN主页」:传送门
😈「Bilibil首页」:传送门
😈「本文的内容」:CMake入门教程
😈「动动你的小手」:点赞👍收藏⭐️评论📝
文章目录
- 1. 函数的定义与基本语法
- 基本语法
- 示例
- 2. 调用函数
- 调用语法
- 示例
- 3. 函数参数与变量作用域
- 参数传递
- 作用域
- 4. 函数与宏的区别
- 5. 高级应用
- 5.1 封装复杂逻辑
- 5.2 设置变量
- 6.示例
- 6.1示例 :编译器选项设置函数
- 6.2示例 :创建并链接库的函数
- 6.3示例:添加预处理器定义的函数
- 6.4示例:复制资源文件到输出目录
- 6.5示例:添加源代码分组
- 7. 结论
在CMake中,function
是一个非常重要的特性,它允许开发者封装和重用代码逻辑,从而使CMake脚本更加模块化和高效。本教程将深入探讨如何在CMake中定义和使用函数。
1. 函数的定义与基本语法
CMake中的函数使用function
关键字定义。函数可以接收一系列参数,并包含一组CMake指令。
基本语法
function(<function_name> [arg1 [arg2 ...]])# 函数的具体指令
endfunction()
示例
定义一个名为print_message
的函数,用于输出消息:
function(print_message message)message(STATUS "Message: ${message}")
endfunction()
2. 调用函数
函数通过其名称来调用,并且可以传递参数。
调用语法
<function_name>([arg1 [arg2 ...]])
示例
调用print_message
函数,打印一条信息:
print_message("Hello from CMake function!")
3. 函数参数与变量作用域
CMake函数支持参数传递,同时拥有自己的局部作用域。
参数传递
在函数定义时指定参数名称,在调用时提供具体值。
作用域
函数内部定义的变量是局部的,不会影响外部作用域。通过PARENT_SCOPE
选项,可以影响父作用域中的变量。
4. 函数与宏的区别
函数和宏在CMake中有不同的作用域和参数传递机制。
- 函数:有独立的局部作用域,参数按值传递。
- 宏:没有独立作用域,参数按引用传递。
5. 高级应用
5.1 封装复杂逻辑
函数可用于封装复杂的构建逻辑,增强代码的可读性和重用性。
5.2 设置变量
通过结合set
命令和PARENT_SCOPE
选项,函数可以在父作用域设置变量,从而影响外部环境。
6.示例
6.1示例 :编译器选项设置函数
此函数用于为特定目标设置编译器选项。它接收目标名称和一组编译器标志作为参数。
function(set_compiler_flags target)foreach(flag IN LISTS ARGN)target_compile_options(${target} PRIVATE ${flag})endforeach()
endfunction()# 使用示例
add_executable(my_app main.cpp)
set_compiler_flags(my_app -Wall -Wextra -pedantic)
6.2示例 :创建并链接库的函数
这个函数用于创建一个库并将其链接到一个指定的目标。它接收库名称、源文件和目标名称作为参数。
function(create_and_link_lib lib_name lib_sources target_to_link)add_library(${lib_name} ${lib_sources})target_link_libraries(${target_to_link} ${lib_name})
endfunction()# 使用示例
add_executable(my_app main.cpp)
create_and_link_lib(my_lib lib.cpp my_app)
6.3示例:添加预处理器定义的函数
这个函数用于为指定的目标添加一组预处理器定义。它可以方便地管理和添加项目中的预定义宏。
function(add_preprocessor_definitions target)foreach(definition IN LISTS ARGN)target_compile_definitions(${target} PRIVATE ${definition})endforeach()
endfunction()# 使用示例
add_executable(my_app main.cpp)
add_preprocessor_definitions(my_app DEBUG=1 VERSION="1.0")
6.4示例:复制资源文件到输出目录
这个函数用于将指定的资源文件或目录复制到构建输出目录。这在需要将配置文件、图像等非编译资源与可执行文件一起打包时非常有用。
function(copy_resources_to_output target)foreach(resource IN LISTS ARGN)add_custom_command(TARGET ${target} POST_BUILDCOMMAND ${CMAKE_COMMAND} -E copy ${resource} $<TARGET_FILE_DIR:${target}>COMMENT "Copying ${resource} to output directory")endforeach()
endfunction()# 使用示例
add_executable(my_app main.cpp)
copy_resources_to_output(my_app "${CMAKE_SOURCE_DIR}/config/config.txt" "${CMAKE_SOURCE_DIR}/images/logo.png")
6.5示例:添加源代码分组
这个函数用于在IDE中为项目源文件创建分组(例如,在Visual Studio中的文件夹)。这有助于在大型项目中组织文件,使项目结构在IDE中更加清晰。
function(group_sources target)foreach(source IN LISTS ARGN)get_filename_component(folder "${source}" PATH)string(REPLACE "/" "\\" folder "${folder}")source_group("${folder}" FILES "${source}")endforeach()
endfunction()# 使用示例
add_executable(my_app src/main.cpp src/utils/helper.cpp include/utils/helper.h)
group_sources(my_app src/main.cpp src/utils/helper.cpp include/utils/helper.h)
7. 结论
CMake中的函数提供了一种强大的方式来改善脚本的结构和重用代码。通过本教程,开发者应能够在自己的CMake项目中有效利用函数来优化和简化构建过程。这种方法不仅提升了脚本的可维护性,还使得复杂构建逻辑的管理变得更为高效和清晰