CMake中add_definitions/add_compile_definitions的使用

news2024/9/21 14:29:40

      CMake中的add_definitions命令用于在源文件的编译中添加-D定义标志,其格式如下:

add_definitions(-DFOO -DBAR ...)

      将当前目录中的target的定义添加到编译器命令行(compiler command line)中,无论是在调用此命令之前还是之后添加的,还是之后添加的子目录中的target的定义。这个命令可以用来添加任何标志(flag),但它的目的是添加预处理器定义(preprocessor definitions)。
      注意:此命令已被其它命令所取代
      (1).使用add_compile_definitions命令添加预处理定义。
      (2).使用include_directories命令添加包含目录(include directories)。
      (3).使用add_compile_options命令添加其它选项。
      以-D或/D开头的看起来像预处理定义的标志会自动添加到当前目录的COMPILE_DEFINITIONS目录属性中。出于向后兼容性的原因,具有非平凡值(non-trivial values)的定义可以保留在标志集中,而不是转换。

add_definitions(-DSAMPLE_ADD)
add_definitions(-DSAMPLE_ADD_VALUE=10)

include_directories(include)
add_library(add STATIC source/add.cpp)
add_executable(main samples/sample_add.cpp)
target_link_libraries(main add)

      CMake中的add_compile_definitions命令用于将预处理器定义添加到源文件的编译中,其格式如下:

add_compile_definitions(<definition> ...)

      将预处理器定义添加到编译器命令行
      预处理程序定义将添加到当前CMakeLists文件的COMPILE_DEFINITIONS目录属性中。它们也被添加到当前CMakeLists文件中每个target的COMPILE_DEFINITIONS target属性中
      定义使用语法VAR或VAR=value指定。不支持函数样式定义(function-style definitions)。CMake将自动为本机构建系统正确地转义该值(注意,CMake语言语法可能需要转义以指定某些值)。
      add_compile_definitions命令的参数可以使用语法$<...>的"生成器表达式"。

add_compile_definitions(SAMPLE_ADD)
add_compile_definitions(SAMPLE_ADD_VALUE=10)

include_directories(include)
add_library(add STATIC source/add.cpp)
add_executable(main samples/sample_add.cpp)
target_link_libraries(main add)

      执行测试代码需要多个文件

      build.sh内容如下:

#! /bin/bash

# supported input parameters(cmake commands)
params=(function macro cmake_parse_arguments \
		find_library find_path find_file find_program find_package \
		cmake_policy cmake_minimum_required project include \
		string list set foreach message option if while return \
		math file configure_file \
		include_directories add_executable add_library target_link_libraries install \
		target_sources add_custom_command add_custom_target \
		add_subdirectory aux_source_directory \
		set_property set_target_properties define_property \
		add_definitions target_compile_definitions)

usage()
{
	echo "Error: $0 needs to have an input parameter"

	echo "supported input parameters:"
	for param in ${params[@]}; do
		echo "  $0 ${param}"
	done

	exit -1
}

if [ $# != 1 ]; then
	usage
fi

flag=0
for param in ${params[@]}; do
	if [ $1 == ${param} ]; then
		flag=1
		break
	fi
done

if [ ${flag} == 0 ]; then
	echo "Error: parameter \"$1\" is not supported"
	usage
	exit -1
fi

if [[ ! -d "build" ]]; then
	mkdir build
	cd build
else
	cd build
fi

echo "==== test $1 ===="

# test_set.cmake: cmake -DTEST_CMAKE_FEATURE=$1 --log-level=verbose ..
# test_option.cmake: cmake -DTEST_CMAKE_FEATURE=$1 -DBUILD_PYTORCH=ON ..
cmake -DTEST_CMAKE_FEATURE=$1 ..
# It can be executed directly on the terminal, no need to execute build.sh, for example: cmake -P test_set.cmake
make
# make install # only used in cmake files with install command

      主CMakeLists.txt内容如下:

cmake_minimum_required(VERSION 3.22)
project(cmake_feature_usage)

message("#### current cmake version: ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}")
include(test_${TEST_CMAKE_FEATURE}.cmake)
message("==== test finish ====")

      test_add_definitions.cmake内容为上面的所有测试代码段

      另外还包括三个目录:include,source,samples,它们都是非常简单的实现,仅用于测试,如下:

      其中samples/sample_add.cpp内容如下:

#include <iostream>
#include <add.hpp>

int main()
{
#ifdef SAMPLE_ADD
    fprintf(stdout, "**** defined SAMPLE_ADD ****\n");
#endif
#if SAMPLE_ADD_VALUE == 10
    fprintf(stdout, "#### defined SAMPLE_ADD_VALUE 10 ####\n");
#endif

    int a = 2, b = 3;
    fprintf(stdout, "%d+%d=%d\n", a, b, add(a,b));
    return 0;
}

       可能的执行结果如下图所示:

      GitHub: https://github.com/fengbingchun/Linux_Code_Test

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

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

相关文章

C/C++入门004-C语言流程控制

文章目录流程控制顺序结构:选择结构if选择结构switch选择循环结构while循环do whilefor循环循环优化四大跳转break:continuegotoreturn案例参考&#xff1a;https://blog.csdn.net/weixin_44617968/article/details/117656810 流程控制 控制流程&#xff08;也称为流程控制&a…

HC-05蓝牙模块AT指令 ERROR问题

AT模式指令识别貌似有些问题,但不知道什么原因导致的&#xff0c;返回正常值后&#xff0c;一切通信正常。 查了一些资料&#xff0c;觉得下面两个最靠谱。 1.引脚电平问题 2.需要3.3v接EN引脚 等到故障再次发生&#xff0c;尝试EN接3.3V&#xff0c;数据收发一切正常。 结论&…

acwing基础课——bellman-ford

由数据范围反推算法复杂度以及算法内容 - AcWing 常用代码模板3——搜索与图论 - AcWing 基本思想&#xff1a; 逐遍的对图中每一个边去迭代计算起始点到其余各点的最短路径&#xff0c;执行n-1遍&#xff0c;最终得到起始点到其余各点的最短路径。&#xff08;n为连通图结点数…

CEF使用 libcef_dll_wrapper Debug版链接报错

编译后使用Release版编译链接运行正常&#xff0c;而Debug版报错如下&#xff1a; libcef_dll_wrapper.lib(cef_logging.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”(CefAppEx.obj 中)具体原因是Debug版使用了Release版的库&…

图形化跟踪个股RPS走势,挖掘出源源不断的牛股!股票量化分析工具QTYX-V2.5.7...

概述RPS选股策略威廉欧奈尔把投资理念集中于他自创的CANSLIM选股系统&#xff0c;凭借着这个系统驰骋股票市场数十年&#xff0c;无论在牛市还是熊市&#xff0c;这个系统都是最稳定、表现最好的系统之一。CANSLIM选股系统中有一个RPS指标&#xff08;Relative Price Strength …

华为eNSP模拟器配置VRRP网关冗余

作用&#xff1a; 提供网关冗余功能&#xff0c;保证出口网关的高可用型。当网关发生故障的时候&#xff0c;能让PC快速的切换。 概念&#xff1a; 通过VRRP协议创建出一个虚拟网关&#xff0c;主用路由器down之后备用路由器能马上接替其主的位置&#xff0c;继续提供出口网…

【C/C++】斐波那契数列数列系列问题详解

&#x1f34e; 博客主页&#xff1a;&#x1f319;披星戴月的贾维斯 &#x1f34e; 欢迎关注&#xff1a;&#x1f44d;点赞&#x1f343;收藏&#x1f525;留言 &#x1f347;系列专栏&#xff1a;&#x1f319; C初阶 &#x1f319;励志卓越可以成为你努力的动力&#xff0c;…

1.JavaScript简介

**JavaScript ** 是什么&#xff1f;&#xff08;重点&#xff09; Js是一种专门为网页交互设计的客户端&#xff08;浏览器端&#xff09;的脚本语言&#xff1b; Js与html和css有相似之处&#xff0c;都在浏览器端解析&#xff1b; Js和java,c#,php等一样&#xff0c;是一…

Spring 通过 @Lazy 注解解决构造方法循环依赖问题

什么是循环依赖? 先定义两个类 Apple、Orange&#xff0c;如下所示&#xff1a; Component public class Apple{Autowiredprivate Orange orange; }Component public class Orange {Autowiredprivate Apple apple; }像这种在 Apple 里面有一个属性 Orange、Orange 中有一个属…

k8s 驱逐eviction机制源码分析

原理部分 1. 驱逐概念介绍 kubelet会定期监控node的内存&#xff0c;磁盘&#xff0c;文件系统等资源&#xff0c;当达到指定的阈值后&#xff0c;就会先尝试回收node级别的资源&#xff0c;比如当磁盘资源不足时会删除不同的image&#xff0c;如果仍然在阈值之上就会开始驱逐…

森林图

森林图 以统计指标和统计分析方法为基础&#xff0c;用数值计算绘制出的图形&#xff0c;通常是在平面直角坐标系中&#xff0c;以一条垂直的无效 线&#xff08;0或者1&#xff09;为中心&#xff0c;用平衡于x轴的多条线段描述每个组指标的中值和可信区间&#xff0c;最后一…

星空华文通过聆讯:吃《中国好声音》老本 华人文化是股东

雷递网 雷建平 12月9日星空华文控股有限公司&#xff08;简称&#xff1a;“星空华文”&#xff09;今日通过聆讯&#xff0c;准备在香港上市。星空华文的前身是上海灿星文化传媒股份有限公司&#xff08;简称“灿星文化”&#xff09;。2018年2月&#xff0c;灿星文化向上海证…

Web端H5播放RTSP

Web端H5播放RTSP一、要实现二、基础介绍1.RTSP是什么&#xff1f;2.RTSP播放测试工具VLC3.主流设备常用的RTSP格式三、方案1. webrtc-streamer2. 安装和配置环境3. 运行demo.html4.存疑5.参考了好多~一、要实现 不用萤石云等类似的平台&#xff0c;实现Web端直接显示监控视频。…

LwIP——以太网描述符

目录 什么是以太网DMA描述符 TX DMA描述符成员变量简介 RX DMA描述符成员变量简介 以太网DMA描述符结构 如何追踪描述符 如何创建Tx/Rx描述符 以太网发送和接收数据流程 总结 在移植LwIP之前有必要了解一下以太网DMA描述符的相关知识&#xff0c;ST以太网模块中的接收/发…

【华为OD机试真题 python】箱子之字形摆放【2022 Q4 | 100分】

■ 题目描述 【箱子之字形摆放】 有一批箱子(形式为字符串,设为str), 要求将这批箱子按从上到下以之字形的顺序摆放在宽度为 n 的空地,请输出箱子的摆放位置。 例如:箱子ABCDEFG,空地宽度为3,摆放结果如图: 则输出结果为:AFGBECD 输入描述 输入一行字符串,通过空…

19. 丢弃法(Dropout)

1. 动机 一个好的模型需要对输入数据的扰动鲁棒&#xff08;不管一张图片加入多少噪音&#xff0c;也能看清这张图片&#xff09; 使用有噪音的数据等价于Tikhonov正则丢弃法&#xff1a;在层之间加入噪音 输入数据加入随机扰动可以防止过拟合&#xff0c;泛化性更好&#xf…

Python学习基础笔记四十四——模块

1、看一个例子&#xff1a; 创建一个demo.py文件&#xff1a; print(in demo.py)def hello():print(in hello function) 然后我们在另外一个文件中import这个demo文件&#xff1a; import demo# 调用demo.py文件中的hello()函数 demo.hello() 注意&#xff0c;demo后面没有…

Linux系统网络编程——第二十节 多路复用之epoll 模型

目录 epoll相关系统调用 1、epoll_create&#xff1a; 2、epoll_ctl() 3、epoll_wait epoll模型原理 epoll的使用场景 各位好&#xff0c;博主新建了个公众号《自学编程村》&#xff0c;拉到底部即可看到&#xff0c;有情趣可以关注看看哈哈&#xff0c;关注后还可以加博主…

Redis原理篇

目录Redis数据结构动态字符串SDS整数集合Intset键值型Dict压缩链表 ZipList快速链表QuickList跳表SkipList对象RedisObjectRedis网络模型Redis通信协议-RESP协议Redis内存回收过期key处理内存淘汰策略Redis数据结构 动态字符串SDS Redis构建了一种新的字符串结构&#xff0c;…

从C#5.0说起:再次总结C#异步调用方法发展史

本篇继续介绍WaitHandler类及其子类 Mutex&#xff0c;ManualResetEvent&#xff0c;AutoResetEvent的用法。 .NET中线程同步的方式多的让人看了眼花缭乱&#xff0c;究竟该怎么去理解呢&#xff1f; 其实&#xff0c;我们抛开.NET环境看线程同步&#xff0c;无非是执行两种操…