cmake中的configure() 和option()命令的宏定义作用域问题

option() 命令:

option(USE_MYMATH "Use provided math implementation" ON)
  • 用于在 CMakeLists.txt 中定义一个 CMake 变量 USE_MYMATH,并且默认值为ON。这个变量的值可以在 CMake 配置时通过 -D 选项来修改。例如:cmake -DUSE_MYMATH=OFF /path/to/source
  • option() 通常用于控制 CMakeLists.txt 中的条件编译逻辑,影响生成的构建系统和代码。比如:
    if (USE_MYMATH)include_directories ("${PROJECT_SOURCE_DIR}/math")add_subdirectory (math)  set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
    endif (USE_MYMATH)
    

configure_file() 命令:

configure_file ("${PROJECT_SOURCE_DIR}/config.h.in"	// 自己写的"${PROJECT_BINARY_DIR}/config.h"		// 由cmake生成,让用户在源代码中使用的)
  • configure_file() 用于在 CMake 配置时,将 config.h.in 中的占位符替换为具体的值,生成最终的 config.h 文件。
  • config.h.in 中的占位符可以使用 @ 符号包裹,例如 #define USE_MYMATH @USE_MYMATH@ .这个占位符的具体值也可以通过 -D 选项在命令行中传递。例如:cmake -DUSE_MYMATH=OFF /path/to/source,则生成的config.h中,该宏被注释掉:/*#define USE_MYMATH*/
  • config.h 通常用于在源代码中使用,例如条件编译,控制预处理器宏的定义。

虽然这两者都涉及 USE_MYMATH 的设置,但它们的作用域用途是不同的:

  • option() 的作用域是 CMakeLists.txt,用于控制 CMake 构建时的条件逻辑。
  • config.h 的作用域是 源代码,用于在编译时通过预处理器宏来影响源代码的编译行为。

这两者的目的是为了提供不同的灵活性:option() 用于配置 CMake 的构建逻辑,而 config.h 用于在源代码中灵活地控制编译选项。


顺带说一句,标识宏和常量宏定义方法不太一样

标识宏(Identity Macro):

  • 这类宏通常被用作开关或标志,用于条件编译。在 config.h 文件中使用,通过预处理器宏的定义或注释来控制代码的编译。

  • 例如,在 config.h.in 中定义:

    // config.h.in
    #define USE_FEATURE_XYZ
    
    • 通过-D命令设为ON 或 OFF
    • 用户可以通过 CMake 的 configure_file() 来生成 config.h,然后在代码中使用它来控制条件编译。

常量宏(Constant Macro):

  • 这类宏通常用于定义常数或配置值,例如定义某个固定的最大值。可以使用 add_compile_definitionstarget_compile_definitionsCMakeLists.txt 文件中定义。
  • 例如,在 CMakeLists.txt 中定义:
    add_compile_definitions(MAX=65536)
    

这将在编译时将 MAX 定义为 65536,在代码中使用它作为一个常量值。

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

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

相关文章

探讨低代码——一种快速开发软件应用程序并且手动编码最少的方法

一、低代码、零代码、纯代码定义 低代码开发平台使企业在不编写大量代码的情况下快速创建复杂应用程序。与传统的纯代码开发相比,低代码开发能够大大减少开发周期,并降低技术门槛,使得开发过程更加高效。而零代码开发更进一步简化了开发过程&…

[多线程]一篇文章带你看懂Java中的synchronized关键字(线程安全)锁的深入理解

目录 1.前言 2.synchronized的特性 2.1synchronized前言 2.2乐观锁和悲观锁 2.3重量级锁和轻量级锁 重量级锁 : 轻量级锁: 2.4自旋锁和挂起等待锁 2.5 公平锁和非公平锁 公平锁: 非公平锁: 2.6可重入锁和不可重入锁 可…

Mac安装Adobe AE/pr/LR/ai/ps/au/dw/id 2024/2023报错问题解决(常见错误:已损坏/2700/146/130/127)

1.打开允许“允许任何来源” 如何打开允许任何来源?在 Finder 菜单栏选择 【前往】 – 【实用工具 】,找到【终端】程序,双击打开,在终端窗口中输入:sudo spctl --master-disable 输入代码后,按【return …

2024年创建有效SaaS PRD的终极指南

您目前是否正在开发SaaS产品?您是否想要确保您的产品满足目标用户的要求并符合您的业务目标?如果是这样,创建全面的“SaaS产品需求文档(PRD)”至关重要。 在了解SaaS PRD的具体组成部分之前,必须认识到内容…

powershell执行策略不受限制

powershell执行策略不受限制 powershell nodemon 1.以管理员身份运行powershell。 2.运行以下命令 Set-ExecutionPolicy Unrestricted AllSigned 脚本可以运行。 要求所有脚本和配置文件都由受信任的发布者签名,包括在本地计算机上编写的脚本。 在从尚未分类为受信…

前端必备-http知识

在掘金查看该文章 计算机网络五层模型 1.物理层 (Physical Layer) 关键词 光纤,电缆,双绞线,连接 物理层要解决的主要问题: (1)物理层要尽可能地屏蔽掉物理设备和传输媒体,通信手段的不同,使数据链路层感觉不到这些…

IT 人员与加密程序:如何战胜病毒

🔐 加密程序是攻击者在成功攻击组织时使用最多的恶意软件类型。它们通常会发送到一个庞大的电子邮件地址数据库,看起来像 Word 或 Excel 文档或 PDF 文件。 想象一下,你是会计部门的一名员工。这种格式的文件在电子文档管理系统中被广泛使用…

Linux服务器开发太麻烦? 试试IntelliJ IDEA公网远程访问开发极大提升开发效率

文章目录 1. 检查Linux SSH服务2. 本地连接测试3. Linux 安装Cpolar4. 创建远程连接公网地址5. 公网远程连接测试6. 固定连接公网地址7. 固定地址连接测试 本文主要介绍如何在IDEA中设置远程连接服务器开发环境,并结合Cpolar内网穿透工具实现无公网远程连接&#xf…

树摇是什么

前言 树摇(Tree Shaking)是一种用于优化 JavaScript 或 TypeScript 代码的技术,它的主要目标是删除未使用的代码(即未引用的模块、变量、函数等),以减小最终生成的代码的体积 原理 树摇是一种通过静态分析代…

音视频处理相关软件

一、FFmpeg FFmpeg 是一个开源的多媒体处理框架,包含了音频和视频编解码器、格式转换器、流协议处理器等功能。它被广泛用于处理和编辑音视频文件,以及在多媒体应用程序和流媒体服务中进行音视频处理。知名的OBS软件就是基于FFmpeg 二、GStreamer GSt…

PySpark大数据处理详细教程

欢迎各位数据爱好者!今天,我很高兴与您分享我的最新博客,专注于探索 PySpark DataFrame 的强大功能。无论您是刚入门的数据分析师,还是寻求深入了解大数据技术的专业人士,这里都有丰富的知识和实用的技巧等着您。让我们…

IDEA快捷键注释代码设置不从行开头开始

我们平时在用IDEA开发项目时会发现,快捷键注释的//总是在代码的行开头上面,如下图所示: 这样就显得代码很不美观,那如何才能使注释//贴紧代码呢?需要在IDEA中进行如下配置: 点击Apply之后就可以了&#xff…

Win11 TensorRT环境部署

一、CUDA和CUDNN安装 cuda和cudnn网上有很多安装教程,这里列举了一些,就不详细说了,具体链接如下: csdn.net - CUDA安装教程(超详细) 原创 zhihu.com - 深度学习之CUDACUDNN详细安装教程 tencent.com - C…

第7章-使用统计方法进行变量有效性测试-7.5.5-因果推断模型

目录 背景 相关性与因果推断 营销人群四象限 Uplift Model Uplift建模方法 双模型

numpy.memmap 用法与注意事项

当处理大数组时,内存可能不够用。numpy 提供了一个函数 np.memmap() 让我们可以处理大数组。memmap memory mapped np.memmap() 可以读取大磁盘文件中的一小段到内存,所以它占内存较小 参数说明: import numpy as np from tempfile impo…

Gateway和spring-boot-starter-web的恩怨情仇

为什么取这个题目,其实与我踩到的坑有关,说起来这个坑非常神奇,这里面就涉及到Gateway和spring-boot-starter-web底层所依赖的技术不兼容的问题。 一、背景 SpringCloud 版本 ---- Finchley.SR2 SpringBoot 版本 ---- 2.0.6.RELEASE 如果同…

【安卓12源码】adb 的dumpsys和cmd实现原理

主要分析下列 2 个流程: // dump activity 的一些信息 adb shell dumpsys activity > D:\dumpsys\activity2.txt // a11 打开 ActivityManagerDebugConfig 的开关 adb shell cmd activity log_switch enable DEBUG_ALL 1. 分析 adb shell dumpsys 实现过程 还可…

Bootstrap在弹框Povoper中显示图片

项目开发需要实现这个效果&#xff0c;当鼠标划过这个按钮的时候&#xff0c;会显示出指定的图片出来 HTML代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"…

Crow:黑魔法 调用Rule绑定的handler_

Crow:基于req.rul查找路由Rule对象及匹配参数-CSDN博客 介绍了当接收到http请求后如何查找到Rule对象 Connection::do_read -> HTTPParser::feed -> 而feed实际上会依此调用定义于http_parser_settings中的所有函数,并完成http信息的解析 const static http_parser_se…

高德地图+Vue中使用出现的问题

最近在做高德地图的逆向地理编码API出现了问题 按着官方的方式写代码运行时出现了问题&#xff0c;随后问了技术人员。 添加之后成功运行