当前位置: 首页 > news >正文

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&#xff0c;正如其意&#xff0c;就是选项的意思。我们这里需要演示一下option的做法。 option对于大型的工程必然是非常常见的&#xff1a;一些模块会被要求编译&#xff0c;另一些客户不准备需要这些模块。option就是将这种需…...

MySQL面试题分享

慢日志&#xff08;了解&#xff09; 慢日志开启的变量&#xff1a;slow_query_logON; 如果值为 OFF ,那就是没有开启慢日志 耗时&#xff1a; long_query_time&#xff0c;默认是10秒 redis 和 mysql 慢日志的区别 redis 慢日志默认是没有开启的 mysql 慢日志默认是开启的…...

vue路由缓存问题

什么是路由缓存问题 解决方案&#xff1a; 让组件实例不再复用&#xff0c;强制销毁重建监听路由变化&#xff0c;变化之后执行数据更新操作 方法一 给 routerv-view 添加key属性&#xff0c;强制不添加缓存&#xff0c;破坏缓存&#xff0c;所以这个方法性能会比较差 <Ro…...

RabbitMQ中如何解决消息堆积问题,如何保证消息有序性

RabbitMQ中如何解决消息堆积问题 如何保证消息有序性 只需要让一个消息队列只对应一个消费者即可...

python爬虫案例——selenium爬取淘宝商品信息,实现翻页抓取(14)

文章目录 1、任务目标2、网页分析3、代码编写3.1 代码分析3.2 完整代码1、任务目标 目标网站:淘宝(https://www.taobao.com/) 任务要求:通过selenium实现自动化抓取 淘宝美食 板块下的所有商品信息,并实现翻页抓取,最后以csv格式将数据保存至本地;如: 2、网页分析 首先…...

在VSCode中使用Excalidraw

概述 Excalidraw是一款非常不错的示意图绘制软件&#xff0c;没想到在VSCode中有其扩展&#xff0c;可以在VScode中直接使用。 安装扩展 使用 需要创建.excalidraw.svg、.excalidraw或.excalidraw.png等名称的文件。 搭配手写版使用 自由画笔工具可以配合手写板&#xff0c…...

25中国投资中投笔试测评秋招校招SHL笔试题型分享

✅中投公司不必过多介绍&#xff0c;和建总都位于金融央企第一档&#xff0c;但是招人更少&#xff0c;竞争更为激烈&#xff0c;看公示录用名单都是清北的金融硕士&#xff0c;投资岗难度更大。 ✅中投公司的笔试往年都是shl系统&#xff0c;但考察范围非常广&#xff0c;包含…...

【LeetCode热题100】分治-快排

本篇博客记录分治快排的4道题目&#xff1a;颜色分类、排序数组、数组中的第K个最大元素、数组中最小的N个元素&#xff08;库存管理&#xff09;。 class Solution { public:void sortColors(vector<int>& nums) {int n nums.size();int left -1,right n;for(int…...

Docker 教程四 (Docker 镜像加速)

Docker 镜像加速 国内从 DockerHub 拉取镜像有时会遇到困难&#xff0c;此时可以配置镜像加速器。 目前国内 Docker 镜像源出现了一些问题&#xff0c;基本不能用了&#xff0c;后期能用我再更新下。* Docker 官方和国内很多云服务商都提供了国内加速器服务&#xff0c;例如…...

各类排序详解

前言 本篇博客将为大家介绍各类排序算法&#xff0c;大家知道&#xff0c;在我们生活中&#xff0c;排序其实是一件很重要的事&#xff0c;我们在网上购物&#xff0c;需要根据不同的需求进行排序&#xff0c;异或是我们在高考完报志愿时&#xff0c;需要看看院校的排名&#…...

【c语言——指针详解(4)】

文章目录 一、回调函数是什么&#xff1f;二、qsort的使⽤1、使⽤qsort函数排序整型数据2、使⽤qsort排序结构数据 三、qsort函数的模拟实现 作者主页 一、回调函数是什么&#xff1f; 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针&#xff08;地址&#xf…...

C# (.net6)实现Redis发布和订阅简单案例

概念&#xff1a; 在 .NET 6 中使用 Redis 的/订发布阅模式。发布/订阅&#xff08;Pub/Sub&#xff09;是 Redis 支持的一种消息传递模式&#xff0c;其中一个或多个发布者向一个或多个订阅者发送消息,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.首先根据需求文档定义出原型字段&#xff0c;即从需求文档中可以直接设计出来的字段 2.再在原型字段的基础上加上一些基础字段&#xff0c;构成整个表结构的设计 我们采用基于图形化界面的方式来创建表结构 二.案例 原型字段 各字段设计如下&…...

完成Sentinel-Dashboard控制台数据的持久化-同步到Nacos

本次案例采用的是Sentinel1.8.8版本 一、Sentinel源码环境搭建 1、下载Sentinel源码工程 git clone https://github.com/alibaba/Sentinel.git 2、导入到idea 这里可以先运行DashboardApplication.java试一下是否运行成功&#xff0c;若成功&#xff0c;源码环境搭建完毕&a…...

RocketMq详解:三、RocketMq通用生产和消费方法改造

文章目录 1.背景2.通用方法改造2.1添加maven依赖2.2 RocketMq基础配置2.3 配置类2.5 消息传输的对象和结果2.4 消息生产者2.5 消息消费者2.6 功能测试 1.背景 在第二章&#xff1a;《RocketMq详解&#xff1a;二、SpringBoot集成RocketMq》中我们已经实现了消费基本生产和消费…...

基于SpringBoot+Vue+Uniapp的仓库点单小程序的详细设计和实现

2. 详细视频演示 文章底部名片&#xff0c;联系我获取更详细的演示视频 3. 论文参考 4. 项目运行截图 代码运行效果图 代码运行效果图 代码运行效果图 代码运行效果图代码运行效果图 代码运行效果图 5. 技术框架 5.1 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发…...

R语言从多波段tif数据中逐个提取单波段数据

在遥感和地理信息系统&#xff08;GIS&#xff09;领域&#xff0c;将多个波段存储在一个文件中可以更有效地进行数据压缩和管理&#xff0c;减少了存储空间的需求。 在R语言中&#xff0c;处理多波段栅格数据通常涉及以下步骤&#xff1a; 读取数据&#xff1a;使用raster包中…...

OpenClaw 落地企业微信:AI 驱动办公,效率提升看得见

前言 在企业数字化办公场景下&#xff0c;将智能对话功能与企业微信集成可有效提升内部沟通效率和业务响应速度。本文系统阐述了OpenClaw与企业微信的对接方案&#xff0c;该方案采用可视化操作界面实现智能机器人的快速部署&#xff0c;助力企业便捷构建专属AI助手&#xff0…...

如何快速优化EVE Online舰船配置:免费专业工具指南

如何快速优化EVE Online舰船配置&#xff1a;免费专业工具指南 【免费下载链接】Pyfa Python fitting assistant, cross-platform fitting tool for EVE Online 项目地址: https://gitcode.com/gh_mirrors/py/Pyfa Pyfa&#xff08;Python Fitting Assistant&#xff09…...

UI-TARS桌面版终极指南:用自然语言控制电脑的免费AI助手

UI-TARS桌面版终极指南&#xff1a;用自然语言控制电脑的免费AI助手 【免费下载链接】UI-TARS-desktop The Open-Source Multimodal AI Agent Stack: Connecting Cutting-Edge AI Models and Agent Infra 项目地址: https://gitcode.com/GitHub_Trending/ui/UI-TARS-desktop …...

明日方舟MAA助手:如何用5分钟自动化你的每日游戏任务

明日方舟MAA助手&#xff1a;如何用5分钟自动化你的每日游戏任务 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手&#xff0c;全日常一键长草&#xff01;| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https://gitc…...

我的技术博客从0到月入过万,用了这五个变现路径

很多测试同行问我&#xff1a;“每天写测试用例、提Bug、做自动化&#xff0c;这些重复性的工作内容&#xff0c;真能写成文章还有人看&#xff1f;”我的答案是&#xff1a;不仅能&#xff0c;而且测试人做技术博客&#xff0c;有着其他岗位难以复制的独特优势。因为我们每天都…...

告别日志硬编码:BizLog组件在SpringBoot中的实战应用指南

1. 为什么我们需要BizLog组件 记得去年接手一个电商项目时&#xff0c;遇到一个典型问题&#xff1a;产品经理要求在用户下单、修改订单、取消订单等关键操作时&#xff0c;都要记录详细的操作日志。刚开始我直接在业务代码里写日志记录逻辑&#xff0c;结果不到一个月就发现代…...

阵列信号处理笔记(2):波数域解析、阵列流形可视化与频率响应设计

1. 波数域解析&#xff1a;空域频率的物理意义 波数域是理解阵列信号处理的关键视角。简单来说&#xff0c;波数&#xff08;k&#xff09;相当于空域中的"频率"&#xff0c;就像时域中的角频率&#xff08;ω&#xff09;描述信号随时间变化的快慢一样&#xff0c;波…...

如何用Python自动化脚本轻松抢到大麦网演唱会门票

如何用Python自动化脚本轻松抢到大麦网演唱会门票 【免费下载链接】DamaiHelper 大麦网演唱会演出抢票脚本。 项目地址: https://gitcode.com/gh_mirrors/dama/DamaiHelper 还在为抢不到心仪演唱会门票而烦恼吗&#xff1f;面对秒光的票源和昂贵的黄牛票&#xff0c;手动…...

NotebookLM心理学研究辅助:为什么92%的心理学博士生漏用了“语义锚定”功能?

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;NotebookLM心理学研究辅助 NotebookLM 是 Google 推出的基于用户上传文档进行深度语义理解的 AI 助手&#xff0c;其“以你的资料为中心”的设计范式特别契合心理学研究中对原始文献、访谈转录稿、实验…...

企业级AI智能体评测平台AgentLab:构建、评估与部署实战指南

1. 项目概述&#xff1a;当AI遇上企业级自动化最近在折腾企业级自动化流程时&#xff0c;发现了一个非常有意思的开源项目&#xff0c;叫AgentLab。它来自大名鼎鼎的ServiceNow&#xff0c;没错&#xff0c;就是那个做IT服务管理&#xff08;ITSM&#xff09;和企业工作流平台的…...