CMake 中 add_definitions() 使用的注意事项及替代方案

CMake 中 add_definitions() 使用的注意事项及替代方案

在 CMake 中使用 add_definitions() 函数时,虽然其作用范围是全局的,但在实际应用中可能会遇到一些问题,导致其对子目录的影响不如预期。理解和避免这些问题可以帮助更高效地使用 CMake 管理项目构建。以下是一些可能影响 add_definitions() 效果的因素,以及如何解决这些问题的建议。

1. 子目录的处理顺序

确保在调用 add_subdirectory() 包含子目录之前使用 add_definitions()。这样可以确保定义传递给所有子目录中的目标。

正确的示例:

add_definitions(-DLINUX)
add_subdirectory(subdir)

错误的示例:

add_subdirectory(subdir)
add_definitions(-DLINUX)

在错误的示例中,subdir 目录中的目标不会接收到 -DLINUX 定义,因为它们已经在定义添加之前被处理。

2. 子目录中的重写

子目录中的 CMakeLists.txt 文件可能使用 remove_definitions() 或其他方法显式地修改或取消从父目录继承的定义。这可能导致预期之外的构建行为。

3. 缓存和变量作用域

如果使用变量来设置定义,并且这些变量在父目录中没有正确地传递到子目录(如未使用 CACHEPARENT_SCOPE),那么子目录中的目标将不会受到这些定义的影响。

4. 命令调用位置

add_definitions() 必须在定义相关目标之前调用。如果在目标已经定义后才调用 add_definitions(),那么这些目标将不会包含新增的预处理器定义。

5. 使用建议的替代方案

为了精确控制定义的作用范围并避免潜在的全局污染,推荐使用 target_compile_definitions() 而非 add_definitions()。这样可以为特定目标直接设置编译定义。

add_executable(MyExecutable source.cpp)
target_compile_definitions(MyExecutable PRIVATE LINUX)

这种方法确保只有指定的目标受到定义的影响,提高了构建过程的清晰度和可控性。

通过上述措施,可以更有效地管理 CMake 项目中的编译定义,确保构建过程符合预期,同时提高项目的可维护性和可扩展性。

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

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

相关文章

python中序列化和反序列化

在 Python 编程中,序列化 是指将一个 Python 对象转换为一种可以存储或传输的格式的过程。通过序列化,可以将对象的数据结构转化为诸如 JSON、XML、YAML 等格式,以便将其存储到文件、数据库,或者通过网络进行传输。与之对应的过程…

lvm管理磁盘过程记录

lvm管理磁盘过程记录.md 0.参考文章一、使用lvm在Linux系统上进行磁盘管理1.安装 LVM 工具2.创建物理卷(PV)3.创建卷组(VG)4.创建逻辑卷(LV)5.格式化逻辑卷6.挂载使用7.开机自动挂载(可选&#…

Unity 的Event的Use()方法

对于Event的Use方法,其在调用后将不会再判断同类型的事件 这种情况下,第二个MosueDown不会进入,因为已经Use 如果把Use注释掉 依旧能进入第二个MosueDown 也就是说当使用了Use方法,相同的事件类型不会进第二遍

【反素数】

题目 思路 首先分析 的性质 一定是 中约数最大的一定是约数同是最大的数字中值中最小的进一步挖掘性质,紧贴枚举的做法 约数最大值最小(也决定了层数、其它约束),是枚举的比较条件实现上述目的,枚举的质数种类在大小…

Tensorflow 2.0 cnn训练cifar10 准确率只有0.1 [已解决]

cifar10 准确率只有0.1 问题描述踩坑解决办法 问题描述 如果你看的是北京大学曹健老师的tensorflow2.0,你在class5的部分可能会遇见这个问题 import matplotlib.pyplot as plt import tensorflow as tf from tensorflow.keras.layers import Dense, Dropout,MaxPooling2D,Fla…

VS Code breadcrumbs view 是什么

VS Code breadcrumbs view 是什么 正文 正文 breadcrumbs view:中文翻译,面包屑视图,乍听起来感觉十分抽象。这里我们来解释一下这个视图的含义? 如下图所示,红色框标记的部分就是 这个视图可以显示出当前打卡文件所…

新手答疑 | 零基础该怎么学习嵌入式?嵌入式Linux学习路线是什么?嵌入式开发板推荐?

很多初学者想要涉足嵌入式Linux开发领域,但往往在刚入门阶段,会因为初次接触到大量复杂的概念术语和深奥的技术文档感到压力重重,面对这些内容不知从何下手,感到十分迷茫,网上的内容也纷繁复杂,没有清晰的学…

从 Kafka 到 WarpStream: 用 MinIO 简化数据流

虽然 Apache Kafka 长期以来一直是流数据的行业标准,但新的创新替代方案正在重塑生态系统。其中之一是 WarpStream,它最近在 Confluent 的所有权下进入了新的篇章。此次收购进一步增强了 WarpStream 提供高性能、云原生数据流的能力,巩固了其…

SAP Message - self-explanatory 自身说明

SAP Message 解释、创建和应用可见如下文章:SAP Abap】SE91 - SAP MESSAGE 消息类创建与应用-CSDN博客 SE91 SAP消息类型 - tongxiaohu - 博客园 这里主要想聊一下常用的SE91 中不常用的功能 - 自身说明 选项的作用。 以 VF - 004 为例: 我们都知道自…

2024双十一买啥最划算?2024双十一五款值得入手的好物入手

2024双十一购物狂欢节将至,还在为买什么而纠结吗?这里为你入手五款值得入手的好物。从生活必备到时尚单品,涵盖多个领域,让你在双十一以划算的价格买到心仪之物,开启品质生活新旅程。 一、西圣find可视挖耳勺 入手理…

毕业设计选题:基于ssm+vue+uniapp的校园订餐小程序

开发语言:Java框架:ssmuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:M…

【补充】倒易点阵定义

晶体点阵:晶体内部结构在三维空间周期平移的客观存在的数学抽象,反映晶体实际原子排列。 倒易点阵:通过对晶体的正点阵进行傅里叶变换得到的,其中正点阵中每个阵点的位置矢量方向代表晶面族的法向,位置矢量的长度是晶…

CSS04-Chrome调试工具

Chrome 浏览器提供了一个非常好用的调试工具,可以用来调试我们的 HTML结构和 CSS 样式。

wpf如何进行数据绑定与动态数据操作?

前面两篇博文,我们比较清楚的介绍了开启wpf项目已经如何生成和使用事件来操作控件,这一篇到了我们把数据放进来的时候了,没有数据实际上任何软件都是没有灵魂的,下面我们详细介绍。 文章原出处:https://blog.csdn.net…

工作笔记20240927——vscode + jlink调试

launch.json的配置,可以用的 {"name": "Debug","type": "cppdbg","request": "launch","miDebuggerPath": "./arm-gnu-toolchain-12.2.rel1-x86_64-arm-none-eabi/bin/arm-none-eabi-g…

Java 入门指南:并发设计模式 —— Copy-on-Write 模式

文章目录 Copy-On-Write工作原理Copy-On-Write 的应用场景Java 中的 CopyOnWriteArrayListCopyOnWriteArrayList 的特点 示例代码Copy-On-Write 的优缺点 Copy-On-Write CopyOnWrite(写时复制,简称COW)是一种在计算机领域中广泛应用的优化策…

Go函数式编程与闭包

1. 什么是函数式编程 函数式编程(Functional Programming)是一种编程范式,它将计算视为数学函数的求值,强调使用高阶函数和不可变数据。在函数式编程中,函数是第一类公民,意味着函数可以像其他数据类型一样…

自动化办公-Python-os模块的使用

os.path 模块的使用 在指定文件路径时,由于操作系统的差异,直接使用硬编码的路径可能会导致程序在不同平台上无法正常运行。为了解决这个问题,Python 提供了 os.path 模块,它包含了一系列用于路径操作的函数,可以帮助您…

Python:lambda 函数详解 以及使用

一、lambda 语法 lambda 函数的语法只包含一个语句,表现形式如下: lambda [arg1 [,arg2,.....argn]]:expression 其中,lambda 是 Python 预留的关键字,[arg…] 和 expression 由用户自定义。 具体如下: [arg…] 是参数列表&#…

Java2 实用教程(第6版)习题2 第五题

五、编程题 1、编写一个应用程序,给出汉字“你”“我”“他”在Unicode表中的位置。 public class F2_1 {public static void main(String args[]){char ch1你,ch2我,ch3他;System.out.println("\""ch1"\"的位置"(int)ch1);System.…