CMake 教程跟做与翻译 4

news2024/11/24 23:30:45

目录

添加一个option!


添加一个option!

option,正如其意,就是选项的意思。我们这里需要演示一下option的做法。

option对于大型的工程必然是非常常见的:一些模块会被要求编译,另一些客户不准备需要这些模块。option就是将这种需求组织起来,让脚本构建者有了清晰的逻辑组成的抓手。

举个最最简单的例子。我们打算写一个模块,这个模块其实就是根据用户静态的选择打印不同的话:

impl.c

void implA();
void implB();
​
​
void impl()
{
#ifdef USE_SPECIAL_IMPL
    implB();
#else
    implA();
#endif
}

impl(A/B).c

// implA.c
#include <stdio.h>
​
void implA()
{
    printf("The Implement function is using Implements A");
}
​
// implB.c
#include <stdio.h>
​
void implB()
{
    printf("The Implement function is using Implements B");
    printf("\n which is surprised :)");
}

他们都在optional_implements文件夹中:

➜  tree -L 2
.
├── build
|   ├─ ... # Ommited
├── CMakeLists.txt
├── Config.h.in
├── main.c
├── MathLibs
│   ├── CMakeLists.txt
│   ├── mathLibs.c
│   └── mathLibs.h
└── optional_implements
    ├── implA.c
    ├── implB.c
    └── impl.c

下面就是在cmake中体现出来了,我们使用的就是option这个命令:

option(USE_SPECIAL_IMPL "the special implements of impl function" ON)

option这个命令的格式非常简单:就是目标控制变量 + 描述 + 默认定义。这里的ON表达是开启的意思。OFF就是关闭:

cmake .. -DUSE_SPECIAL_IMPL=OFF

cmake当中就是就是采用D + 控制变量名称=ON/OFF来决定的。

更好的办法是使用cmake-gui来进行可视化的构建:

我们继续实现这个根据option来决定编译行为不一致的实现。很简单,我们只需要控制:

if (USE_SPECIAL_IMPL)
    set(CharliesDemoSrc ${CharliesDemoSrc} optional_implements/implB.c)
else()
    set(CharliesDemoSrc ${CharliesDemoSrc} optional_implements/implA.c)
endif()
​
​
add_executable(CharliesDemo ${CharliesDemoSrc})
​
if (USE_SPECIAL_IMPL)
    target_compile_definitions(CharliesDemo PRIVATE "USE_SPECIAL_IMPL")
endif()

下面给出现在CMakeLists.txt脚本的全貌:

cmake_minimum_required(VERSION 3.30)
​
project(CharliesDemo
        VERSION 1.0)
​
set(CharlieConstVar 1)
set(CharlieConstDouble 1.1)
​
configure_file(Config.h.in Config.h)
add_subdirectory(MathLibs)
set(CharliesDemoSrc main.c optional_implements/impl.c)
​
option(USE_SPECIAL_IMPL "the special implements of impl function" ON)
​
if (USE_SPECIAL_IMPL)
    set(CharliesDemoSrc ${CharliesDemoSrc} optional_implements/implB.c)
else()
    set(CharliesDemoSrc ${CharliesDemoSrc} optional_implements/implA.c)
endif()
​
​
add_executable(CharliesDemo ${CharliesDemoSrc})
​
if (USE_SPECIAL_IMPL)
    target_compile_definitions(CharliesDemo PRIVATE "USE_SPECIAL_IMPL")
endif()
​
target_include_directories( CharliesDemo PUBLIC 
                            "${PROJECT_BINARY_DIR}"
                            "${PROJECT_SOURCE_DIR}/MathLibs")
target_link_libraries(CharliesDemo PUBLIC MathLib)

看官自行尝试cmake的使用

➜  cd build && cmake .. -DUSE_SPECIAL_IMPL=OFF && make
-- Configuring done (0.0s)
-- Generating done (0.0s)
-- Build files have been written to: /home/Charliechen/Works/cmake_learning/build
[ 16%] Building C object MathLibs/CMakeFiles/MathLib.dir/mathLibs.c.o
[ 33%] Linking C static library libMathLib.a
[ 33%] Built target MathLib
[ 50%] Building C object CMakeFiles/CharliesDemo.dir/main.c.o
[ 66%] Building C object CMakeFiles/CharliesDemo.dir/optional_implements/impl.c.o
[ 83%] Building C object CMakeFiles/CharliesDemo.dir/optional_implements/implA.c.o
[100%] Linking C executable CharliesDemo
[100%] Built target CharliesDemo
➜  ./CharliesDemo
VERISON_MAJOR: 11 + 2 = 3The Implement function is using Implements A⏎     

➜  cd build &&  cmake .. -DUSE_SPECIAL_IMPL=ON && make
-- Configuring done (0.0s)
-- Generating done (0.0s)
-- Build files have been written to: /home/Charliechen/Works/cmake_learning/build
[ 33%] Built target MathLib
[ 50%] Building C object CMakeFiles/CharliesDemo.dir/main.c.o
[ 66%] Building C object CMakeFiles/CharliesDemo.dir/optional_implements/impl.c.o
[ 83%] Building C object CMakeFiles/CharliesDemo.dir/optional_implements/implB.c.o
[100%] Linking C executable CharliesDemo
[100%] Built target CharliesDemo
VERISON_MAJOR: 11 + 2 = 3The Implement function is using Implements B
 which is surprised :)⏎  

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

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

相关文章

【LLM KG】浅尝基于LLM的三阶段自动知识图谱构建方法

文章指出&#xff0c;在以前的方法中&#xff0c;使用LLM生成三元组时&#xff0c;必须预定义好schema&#xff0c;假如schema数量很多/复杂&#xff0c;很容易超过LLM的上下文窗口长度。并且&#xff0c;在某些情况下&#xff0c;没有可用的固定预定义schema。 方法 一、EDC…

计算机网络:数据链路层 —— 网络适配器与 MAC 地址

文章目录 网络适配器使用网络适配器网络适配器类型 MAC 地址MAC 地址格式MAC 地址类型MAC 地址发送顺序数据接收MAC 地址泄露问题 网络适配器 要将计算机连接到以太网&#xff0c;需要使用相应的网络适配器&#xff08;Adapter)&#xff0c;网络适配器一般简称为“网卡”。在计…

通信工程学习:什么是SRAM静态随机存取存储器

SRAM&#xff1a;静态随机存取存储器 SRAM&#xff0c;全称为Static Random-Access Memory&#xff0c;即静态随机存取存储器&#xff0c;是一种重要的随机存取存储器类型。以下是对SRAM的详细介绍&#xff1a; 一、定义与特点 定义&#xff1a; SRAM是一种只要保持通电&#…

CSS @规则(At-rules)系列详解___@import规则使用方法

CSS 规则(At-rules)系列详解 ___import规则使用方法 本文目录&#xff1a; 零、时光宝盒 一、import规则定义和用法 二、CSS import语法 2.1、语法格式 2.2、常见形式 2.3、语法说明 三、import使用方法例子 3.1、导入 CSS 规则 3.2、根据媒体查询条件导入 CSS 规则 …

结构体字节对齐的一些记录

‌结构体字节对齐的原因‌ 结构体字节对齐的主要原因是为了满足硬件平台的内存访问要求。某些硬件平台对特定类型的数据只能从特定的内存地址开始存取&#xff0c;如果数据没有进行对齐&#xff0c;可能会导致访问错误或效率低下。例如&#xff0c;某些架构的CPU在访问未对齐的…

原来CDC数据同步可以这么简单,零代码可视化一键数据同步

当前企业实时同步与分析场景中面临的挑战&#xff1a; 随着业务发展需要&#xff0c;实时分析成为企业目前的强需求&#xff0c;成为支撑企业业务发展的必须项。 一般来说&#xff0c;要满足数据实时分析的诉求&#xff0c;通常有两种方案&#xff1a; 第一种是直接使用源端…

多线程——解决线程安全问题

目录 前言 一、 synchronized 关键字 1. synchronized 的作用 1. synchronized 的特性 &#xff08;1&#xff09;互斥性 &#xff08;2&#xff09;可重入 2. synchronized 使用示例 &#xff08;1&#xff09;修饰代码块 &#xff08;2&#xff09;直接修饰普通方法…

Linux的GDB学习与入门

GDB GDB&#xff08;GNU Debugger&#xff09;是一个功能强大的调试工具&#xff0c;广泛用于调试 C、C 和其他编程语言编写的程序。它是 GNU 项目的一部分&#xff0c;专为帮助开发者在程序执行时检测和修复错误设计。GDB 能够控制程序的执行&#xff0c;查看程序内部的状态&…

2024诺奖引发思考,AI究竟是泡沫还是未来?

你好&#xff0c;我是三桥君 现在的AI技术发展得非常快&#xff0c;特别是深度学习和大模型这些技术&#xff0c;感觉和以前那些最后没搞成的技术泡沫不一样。 现在AI有超级强大的计算能力&#xff0c;还有大量的数据可以用来训练&#xff0c;算法也越来越厉害&#xff0c;能搞…

【单机游戏】【烛火地牢2:猫咪的诅咒】烛火地牢2:猫咪的诅咒介绍

《烛火地牢2&#xff1a;猫咪的诅咒》是一款将Roguelike与2D横版动作融为一体的独立游戏&#xff0c;由新西兰制作人Chris McFarland耗费3年时间精心制作。玩家将闯入不同的关卡接受挑战&#xff0c;通关要求是寻找每个关卡中的钥匙。在闯关时玩家能获得武器&#xff0c;防具&a…

关于int*的*号归属权问题

再根据函数指针定义&#xff1a;int (*int) (int a)。我们发现*和后面的标识符才是一体的 所以int *a,b;的写法更好&#xff0c;说明a是指针类型&#xff0c;b是int类型

让Kimi像人类思考的“Kimi探索版“已开启灰度内测!GPT-o1贡献者之一宣布离职|AI日报

文章推荐 “AI教父”辛顿与物理学家霍普菲尔德荣获诺贝尔物理学奖&#xff01;“AI教母”李飞飞选择谷歌云作为主要计算提供商&#xff5c;AI日报 今日热点 o1推理模型贡献者Luke Metz官宣从OpenAI离职 就在昨日&#xff0c;o1推理模型贡献者之一Luke Metz发文称自己经过两…

Ofcms-(java代码审计学习)

1、背景 根据《java代码审计实战》学习进行记录&#xff0c;java代码审计CMS实战。 2、Ofcms下载 可搜索Ofcms1.1.2版本进行下载。下载连接&#xff1a;ofcms: java 版CMS系统、基于java技术研发的内容管理系统、功能&#xff1a;栏目模板自定义、内容模型自定义、多个站点管…

五、UI弹窗提示

一、制作弹窗UI 二、创建脚本 1、继承WindowRoot&#xff08;UI基类&#xff09; 获取UI上面的组件 2、初始化 将这个文本失活 3、写一个提示出现的方法 这个派生类中&#xff0c;继承了基类的两个方法&#xff0c;设置显示和设置文本 对应基类的这两个方法 将动画赋值给动…

DDPM - Denoising Diffusion Probabilistic Models 扩散模型

DDPM - Denoising Diffusion Probabilistic Models 扩散模型 扩散模型概述 扩散模型是在模拟图像加噪的逆向过程。也就是在实现一个去噪的过程。简单的来说就包括两个过程组成 前向的扩散过程 Forward Diffusion Process反向扩散过程 Reverse Diffusion Process 下面我们对整个…

流域生态系统服务评价、水文水生态分析、碳收支、气候变化影响、制图等领域中的应用

流域生态系统服务评价、水文水生态分析、碳收支、气候变化影响、制图等领域中的应用 专题一、生态系统服务评价技术框架 1.1 生态系统服务概述 1.2 流域生态系统服务的分类与作用 1.3 生态系统服务评估方法 专题二、AI大模型与生态系统服务评价 2.1 目前常用大模型介绍 2…

Java并发 - AQS之ReentrantLock

文章目录 ReentrantLockAQS 队列AbstractOwnableSynchronizerAbstractQueuedSynchronizerNodewaitStatusSHARED/EXCLUSIVE 模式 加锁流程尝试加锁 tryAcquire加锁失败入队addWaiterenq 阻塞等待 acquireQueuedparkAndCheckInterrupt 放弃加锁 cancelAcquire唤醒阻塞线程 unpark…

大语言模型训练

大语言模型训练 1.两大问题2.并行训练2.1数据并行2.2模型并行2.3张量并行2.4混合并行 3.权重计算3.1浮点数3.2混合精度训练3.3deepspeed&#xff08;微软&#xff09;3.3.1 ZeRO3.3.2ZeRO-offload 3.3总结 4.PEFT4.1Prompt TuningPrefix-tuning4.2P-tuning & P-tuning v2 5…

arcpy总结

arcpy 一、是什么二、为什么三、怎么用1、在哪里打开2、基础术语3、代码组织4、案例&#xff08;1&#xff09;裁剪&#xff08;2&#xff09;土地变化特征分析&#xff08;4&#xff09;文件访问与检测&#xff08;5&#xff09;空间数据的查询、插入与更新&#xff08;6&…

伯努利分布(Bernoulli distribution)的两次成功之间间隔次数的分布

伯努利分布&#xff08;Bernoulli distribution&#xff09;是一种特殊的二项式分布&#xff0c;即0-1分布。百科上已经说明了这种分布&#xff0c;即&#xff0c;其中。其数学期望为&#xff0c;方差为。详细说明见0—1分布_百度百科 本文进一步说明对于这类分布的事件&#…