CMake 教程跟做与翻译 4
目录
添加一个option!
添加一个option!
option,正如其意,就是选项的意思。我们这里需要演示一下option的做法。
option对于大型的工程必然是非常常见的:一些模块会被要求编译,另一些客户不准备需要这些模块。option就是将这种需求组织起来,让脚本构建者有了清晰的逻辑组成的抓手。
举个最最简单的例子。我们打算写一个模块,这个模块其实就是根据用户静态的选择打印不同的话:
impl.c
void implA();
void implB();
void impl()
{
#ifdef USE_SPECIAL_IMPLimplB();
#elseimplA();
#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(CharliesDemoVERSION 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 Bwhich is surprised :)⏎
相关文章:
CMake 教程跟做与翻译 4
目录 添加一个option! 添加一个option! option,正如其意,就是选项的意思。我们这里需要演示一下option的做法。 option对于大型的工程必然是非常常见的:一些模块会被要求编译,另一些客户不准备需要这些模块。option就是将这种需…...
MySQL面试题分享
慢日志(了解) 慢日志开启的变量:slow_query_logON; 如果值为 OFF ,那就是没有开启慢日志 耗时: long_query_time,默认是10秒 redis 和 mysql 慢日志的区别 redis 慢日志默认是没有开启的 mysql 慢日志默认是开启的…...
vue路由缓存问题
什么是路由缓存问题 解决方案: 让组件实例不再复用,强制销毁重建监听路由变化,变化之后执行数据更新操作 方法一 给 routerv-view 添加key属性,强制不添加缓存,破坏缓存,所以这个方法性能会比较差 <Ro…...
RabbitMQ中如何解决消息堆积问题,如何保证消息有序性
RabbitMQ中如何解决消息堆积问题 如何保证消息有序性 只需要让一个消息队列只对应一个消费者即可...
python爬虫案例——selenium爬取淘宝商品信息,实现翻页抓取(14)
文章目录 1、任务目标2、网页分析3、代码编写3.1 代码分析3.2 完整代码1、任务目标 目标网站:淘宝(https://www.taobao.com/) 任务要求:通过selenium实现自动化抓取 淘宝美食 板块下的所有商品信息,并实现翻页抓取,最后以csv格式将数据保存至本地;如: 2、网页分析 首先…...
在VSCode中使用Excalidraw
概述 Excalidraw是一款非常不错的示意图绘制软件,没想到在VSCode中有其扩展,可以在VScode中直接使用。 安装扩展 使用 需要创建.excalidraw.svg、.excalidraw或.excalidraw.png等名称的文件。 搭配手写版使用 自由画笔工具可以配合手写板,…...
25中国投资中投笔试测评秋招校招SHL笔试题型分享
✅中投公司不必过多介绍,和建总都位于金融央企第一档,但是招人更少,竞争更为激烈,看公示录用名单都是清北的金融硕士,投资岗难度更大。 ✅中投公司的笔试往年都是shl系统,但考察范围非常广,包含…...
【LeetCode热题100】分治-快排
本篇博客记录分治快排的4道题目:颜色分类、排序数组、数组中的第K个最大元素、数组中最小的N个元素(库存管理)。 class Solution { public:void sortColors(vector<int>& nums) {int n nums.size();int left -1,right n;for(int…...
Docker 教程四 (Docker 镜像加速)
Docker 镜像加速 国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。 目前国内 Docker 镜像源出现了一些问题,基本不能用了,后期能用我再更新下。* Docker 官方和国内很多云服务商都提供了国内加速器服务,例如…...
各类排序详解
前言 本篇博客将为大家介绍各类排序算法,大家知道,在我们生活中,排序其实是一件很重要的事,我们在网上购物,需要根据不同的需求进行排序,异或是我们在高考完报志愿时,需要看看院校的排名&#…...
【c语言——指针详解(4)】
文章目录 一、回调函数是什么?二、qsort的使⽤1、使⽤qsort函数排序整型数据2、使⽤qsort排序结构数据 三、qsort函数的模拟实现 作者主页 一、回调函数是什么? 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针(地址…...
C# (.net6)实现Redis发布和订阅简单案例
概念: 在 .NET 6 中使用 Redis 的/订发布阅模式。发布/订阅(Pub/Sub)是 Redis 支持的一种消息传递模式,其中一个或多个发布者向一个或多个订阅者发送消息,Redis 客户端可以订阅任意数量的频道。 多个客户端可以订阅一个相同的频道…...
【golang】gorm 使用map实现in 条件查询用法
当 where 字典的值为数组时 gorm 会自动转换为条件 IN 查询 where : map[string]interface{}{} where["id"] [1,2,3] where["name"] "zhangsan"type userList struct {Id int "gorm:id"Name string "gorm:name" } Table.…...
理论篇| 移动端爬虫
移动应用的快速发展和广泛普及带来了海量的数据,这些数据对于市场分析、用户行为洞察和业务优化具有重要价值。然而,由于移动应用的特殊性和防护措施,传统的爬虫技术在采集移动应用数据方面面临许多挑战。因此,App爬虫采集与逆向在爬虫领域的重要性不可低估 然而,App采集…...
systemd实现seatunnel自动化启停
在 systemd 中,您可以通过配置服务单元文件来设置服务在失败或退出后自动重启。这对于确保关键服务在意外退出时能够自动恢复运行非常有用。下面是实现 systemd 自动重启服务的步骤: 通用操作 1. 创建或编辑服务单元文件 假设服务单元文件位于 /etc/systemd/system/my-ser…...
MySQL-08.DDL-表结构操作-创建-案例
一.MySQL创建表的方式 1.首先根据需求文档定义出原型字段,即从需求文档中可以直接设计出来的字段 2.再在原型字段的基础上加上一些基础字段,构成整个表结构的设计 我们采用基于图形化界面的方式来创建表结构 二.案例 原型字段 各字段设计如下&…...
完成Sentinel-Dashboard控制台数据的持久化-同步到Nacos
本次案例采用的是Sentinel1.8.8版本 一、Sentinel源码环境搭建 1、下载Sentinel源码工程 git clone https://github.com/alibaba/Sentinel.git 2、导入到idea 这里可以先运行DashboardApplication.java试一下是否运行成功,若成功,源码环境搭建完毕&a…...
RocketMq详解:三、RocketMq通用生产和消费方法改造
文章目录 1.背景2.通用方法改造2.1添加maven依赖2.2 RocketMq基础配置2.3 配置类2.5 消息传输的对象和结果2.4 消息生产者2.5 消息消费者2.6 功能测试 1.背景 在第二章:《RocketMq详解:二、SpringBoot集成RocketMq》中我们已经实现了消费基本生产和消费…...
基于SpringBoot+Vue+Uniapp的仓库点单小程序的详细设计和实现
2. 详细视频演示 文章底部名片,联系我获取更详细的演示视频 3. 论文参考 4. 项目运行截图 代码运行效果图 代码运行效果图 代码运行效果图 代码运行效果图代码运行效果图 代码运行效果图 5. 技术框架 5.1 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发…...
R语言从多波段tif数据中逐个提取单波段数据
在遥感和地理信息系统(GIS)领域,将多个波段存储在一个文件中可以更有效地进行数据压缩和管理,减少了存储空间的需求。 在R语言中,处理多波段栅格数据通常涉及以下步骤: 读取数据:使用raster包中…...
实战复盘-Redis连接数爆满引发的生产事故与优化策略
1. 事故背景:一场由促销活动引发的Redis雪崩 那天凌晨三点,我被一阵急促的电话铃声惊醒。电话那头是值班同事焦急的声音:"所有商品页面都打不开了,订单系统也瘫痪了!"我瞬间清醒,抓起电脑就开始…...
Dlib零基础避坑指南:Windows Python环境一键部署实战
Dlib零基础避坑指南:Windows Python环境一键部署实战 【免费下载链接】Dlib_Windows_Python3.x Dlib compiled binary (.whl) for Python 3.7-3.11 and Windows x64 项目地址: https://gitcode.com/gh_mirrors/dl/Dlib_Windows_Python3.x 副标题:…...
OFA模型微调实战:适配特定领域的小样本学习
OFA模型微调实战:适配特定领域的小样本学习 用最少的数据,让通用大模型听懂你的专业语言 1. 引言:当通用模型遇到专业领域 你有没有遇到过这样的情况:一个在通用场景下表现优秀的AI模型,一到你的专业领域就"水土…...
谈谈你对springAop动态代理的理解?
面试 你要调用目标方法,不直接调用,而是交给代理对象,代理对象会先做额外功能,再调用原方法,最后再收尾。 至于叫动态代理的原因,是因为这个代理不是你手动写死的,而是程序在运行期间动态生成…...
打破学术写作边界:NativeOverleaf离线工作流全解析
打破学术写作边界:NativeOverleaf离线工作流全解析 【免费下载链接】NativeOverleaf Next-level academia! Repository for the Native Overleaf project, attempting to integrate Overleaf with native OS features for macOS, Linux and Windows. 项目地址: ht…...
8255A工作方式0实战:手把手教你用汇编语言驱动八路抢答器LED与数码管
8255A工作方式0实战:从零构建八路抢答器驱动框架 记得第一次在实验室见到8255A芯片时,那块黑色的DIP封装器件看起来平平无奇,直到它让八颗LED随着我的汇编指令跳起"灯光芭蕾"。本文将带你深入这个经典可编程并行接口芯片的实战应用…...
Mermaid:文本驱动的可视化引擎深度指南
Mermaid:文本驱动的可视化引擎深度指南 【免费下载链接】mermaid mermaid-js/mermaid: 是一个用于生成图表和流程图的 Markdown 渲染器,支持多种图表类型和丰富的样式。适合对 Markdown、图表和流程图以及想要使用 Markdown 绘制图表和流程图的开发者。 …...
RWKV7-1.5B-g1a参数详解教程:max_new_tokens/temperature/top_p调优实操手册
RWKV7-1.5B-g1a参数详解教程:max_new_tokens/temperature/top_p调优实操手册 1. 模型简介 rwkv7-1.5B-g1a 是基于新一代 RWKV-7 架构的多语言文本生成模型,特别适合中文场景下的基础问答、文案创作和简短总结任务。作为轻量级模型,它在保持良…...
苹果内购订阅的“时间陷阱”:如何正确处理UTC与东八区的时间转换(附Java代码)
苹果订阅时间戳的时区陷阱:UTC与东八区转换的实战指南 1. 为什么时间戳处理如此重要? 在苹果应用内购(IAP)订阅系统中,时间戳处理看似简单,实则暗藏玄机。许多开发者都曾踩过这样的坑:用户明明购…...
用Docker三分钟搞定Hive伪分布式环境(附本地开发调试技巧)
用Docker三分钟搞定Hive伪分布式环境(附本地开发调试技巧) 在数据分析和处理领域,Hive作为基于Hadoop的数据仓库工具,因其能够处理海量数据并提供类SQL查询能力而广受欢迎。然而,传统的Hive环境搭建往往需要配置复杂的…...
