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

在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/593658.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

labview 与三菱FX 小型PLC通信(OPC)

NI OPC服务器与三菱FX3U PLC通讯方法 一、新建通道名称为&#xff1a;MIT 二、选择三菱FX系列 三、确认端口号相关的参数&#xff08;COM端&#xff1a;7.波特率&#xff1a;9600&#xff0c;数据位&#xff1a;7&#xff0c;校验&#xff1a;奇校验&#xff0c;停止位&#xf…

海外住宅IP代理的工作原理和应用场景分析,新手必看

海外住宅IP代理作为一种技术解决方案&#xff0c;为用户提供了访问全球网络资源和维护隐私安全的方法。本文将介绍海外住宅IP代理的工作原理和应用场景&#xff0c;帮助读者更好地理解和利用这一技术。 一、工作原理 海外住宅IP代理的工作原理基于代理服务器和IP地址的转发。它…

ITSS服务工程师vs ITSS服务经理:哪个职位更适合你?

✨在信息技术服务领域&#xff0c;ITSS服务工程师和ITSS服务经理是两个极具吸引力的职位。但它们各自的特点和要求是什么&#xff1f;哪个更适合你的职业规划和个人兴趣&#xff1f;接下来&#xff0c;我们将为你详细解读这两个职位的区别&#xff0c;帮助你做出明智的选择&…

Win32 基本程序设计原理总结

目录 1. Windows系统 基本原理 2. 需要什么函数库&#xff08;.LIB&#xff09; 2.1 C Runtimes&#xff1a; 2.2 Windows API 3. 需要什么头文件&#xff08;.H&#xff09; 4. Windows 程序运行的本质 5. 窗口类的注册与窗口的诞生 6.消息 6.1 消息分类&#xff1a;…

咖啡茶饮营销不止「9 块 9」,门店「VACS」需要全面提升

每一座城市 CBD 的写字楼下和热门商圈的街边&#xff0c;都是咖啡茶饮的战场。作为餐饮行业的热门赛道&#xff0c;咖啡茶饮近年来一直保持高速增长。据统计&#xff0c;截至今年 10 月 31 日&#xff0c;陆陆续续又有约 15 万家店铺开门营业…… 白热化竞争下&#xff0c;茶饮…

2023到2024年:前端发展趋势展望

本文探讨了2023年至2024年之间前端领域的发展趋势。我们将关注以下几个方面的变化&#xff1a;无代码/低代码开发的兴起、WebAssembly的广泛应用、跨平台技术的发展、人工智能在前端的应用以及用户体验的不断优化。 随着技术的飞速发展&#xff0c;前端开发在推动互联网与移动应…

Google Gemini接口调用(node版)

一、打开Google AI Studio https://makersuite.google.com/app/apikey 二、在国外服务器上部署一个接口用于真正的请求 const sdAxiosOnAzure async (req, res) > {let {config {url: https://sinkin.ai/api/inference,method: post,data: {},timeout: 30 * 60 * 1000,}…

Python爬虫中的协程

协程 基本概念 协程&#xff1a;当程序执行的某一个任务遇到了IO操作时&#xff08;处于阻塞状态&#xff09;&#xff0c;不让CPU切换走&#xff08;就是不让CPU去执行其他程序&#xff09;&#xff0c;而是选择性的切换到其他任务上&#xff0c;让CPU执行新的任务&#xff…

网络安全—认证技术

文章目录 加密认证对称密钥体制公钥密码体制公钥的加密公钥身份认证和加密 鉴别码认证MAC鉴别码 报文摘要认证认证 加密只认证数字签名 通过了解以前前辈们使用的消息认证慢慢渐进到现代的完整的认证体系。所以在学习的时候也很蒙圈&#xff0c;因为前期的很多技术都是有很严重…

这次,数据泄露的目标受害者指向了---救护车服务公司

已停业的救护车服务遭到勒索软件攻击导致近百万人受到威胁&#xff01; 此次数据泄露的目标受害者是法伦救护车服务公司&#xff0c;该公司是Transformative Healthcare的子公司。ALPHV勒索软件团伙声称对2023年4月下旬对Transformative Healthcare的攻击负责&#xff0c;并导…

SpringBoot 集成支付宝支付

网页操作步骤 1.进入支付宝开发平台—沙箱环境 使用开发者账号登录开放平台控制平台 2.点击沙箱进入沙箱环境 说明&#xff1a;沙箱环境支持的产品&#xff0c;可以在沙箱控制台 沙箱应用 > 产品列表 中查看。 3.进入沙箱&#xff0c;配置接口加签方式 在沙箱进行调试前…

rime中州韵小狼毫 inputShow lua Translator 输入字符透传翻译器

在 rime中州韵小狼毫 help lua Translator 中我们分享了如何使用 lua 脚本定义一个 translator&#xff0c;并以 五笔・拼音 为例引用了该 translator&#xff0c;并且达到了预期的效果。 今天&#xff0c;我们继续通过 lua 脚本为 rime中州韵/小狼毫 输入法打造一个 translat…

实验3 vTPM相关

可以代做实验手册等私聊 一、实验目的 1.了解vTPM原理和相关知识&#xff1b;2.创建具备vTPM的虚拟机&#xff1b;3.加深对可信计算技术的理解。 二、实验内容 安装seabios&#xff0c;libtpms&#xff0c;swtpm&#xff0c;qemu‐tpm&#xff1b;启动vTPM&#xff1b;安装…

守正出奇,穿越周期 - Bytebase 的 2023

前情提要&#xff1a;Bytebase 的 2022&#xff5c;埋头苦干&#xff0c;孕育希望 产品迭代 2023 年共发布了 25 个版本。这个数字和 2022 年一样&#xff0c;除开春节和一次全员疫情&#xff0c;做到了两周一次的更新。 版本号从 1.11.0 升级到了 2.13.0。其中在 5 月份&…

MySQL常见面试题总结

1.MySQL基础 1.1什么是关系型数据库&#xff1f; 顾名思义&#xff0c;关系型数据库&#xff08;RDB&#xff0c;Relational Database&#xff09;就是一种建立在关系模型的基础上的数据库。关系模型表明了数据库中所存储的数据之间的联系&#xff08;一对一、一对多、多对多…

图像分割-漫水填充法 floodFill

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 本文的C#版本请访问&#xff1a;图像分割-漫水填充法 floodFill (C#&#xff09;-CSDN博客 FloodFill方法是一种图像处理算法&#…

C++上位软件通过Snap7开源库访问西门子S7-200/合信M226ES数据块的方法

前言 上一篇文章中介绍了Snap7访问西门子S7-1200/S7-1500 DB块的方法&#xff0c;对于S7-200PLC是没有数据块访问的。S7-200PLC中Snap7只能通过访问MB块&#xff0c;VB块的方法进行和PLC之间的Snap7通信和数据交换。手头没有S7-200PLC故通过合信CTMC M226ES运动控制器进行测试&…

SSM的校园二手交易平台----计算机毕业设计

项目介绍 本次设计的是一个校园二手交易平台&#xff08;C2C&#xff09;&#xff0c;C2C指个人与个人之间的电子商务&#xff0c;买家可以查看所有卖家发布的商品&#xff0c;并且根据分类进行商品过滤&#xff0c;也可以根据站内搜索引擎进行商品的查询&#xff0c;并且与卖…

如何用js动态修改字体大小

在项目中&#xff0c;我们常常会遇到使用v-html渲染文本的情况。 如果需要点击大中小三个字号按钮&#xff0c;需要修改字体的大小。那我们应该怎么做呢 function fontSize(element, type) {let size {big: 22,middle: 16,small: 12};var result element.innerHTML.replac…

hAdmin漂亮的后台html模板免费下载

hAdmin漂亮的后台html模板免费下载-遇见你与你分享