CMake入门教程【核心篇】函数(function)

发布时间:2024年01月03日

在这里插入图片描述

😈「CSDN主页」传送门
😈「Bilibil首页」传送门
😈「本文的内容」:CMake入门教程
😈「动动你的小手」点赞👍收藏??评论📝


在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_BUILD
            COMMAND ${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项目中有效利用函数来优化和简化构建过程。这种方法不仅提升了脚本的可维护性,还使得复杂构建逻辑的管理变得更为高效和清晰

文章来源:https://blog.csdn.net/hiwoshixiaoyu/article/details/135008513
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。