CMake 学习笔记(生成头文件)

CMake 学习笔记(生成头文件)

经常,我们需要检测系统环境,然后来生成一些对应的头文件,这个头文件通常叫做“configured header file”。一般命名为 config.h。 CMake 有个 configure_file() 命令专门用来做这个事情。

下面我们给出一个简单的例子。这个例子来自与 cmake 官网上的 cmake tutorial 。网址如下:

https://cmake.org/cmake/help/latest/guide/tutorial/A%20Basic%20Starting%20Point.html

这个 cmake tutorial 篇幅不大,建议从这个教程入门。

这个例子是将软件的版本号传入了 TutorialConfig.h 。

代码如下:

// A simple program that computes the square root of a number
#include <cmath>
#include <cstdlib> // TODO 5: Remove this line
#include <iostream>
#include <string>// TODO 11: Include TutorialConfig.h
#include "TutorialConfig.h"
int main(int argc, char* argv[])
{if (argc < 2) {// TODO 12: Create a print statement using Tutorial_VERSION_MAJOR//          and Tutorial_VERSION_MINORstd::cout << argv[0] << " Version " << Tutorial_VERSION_MAJOR << "."<< Tutorial_VERSION_MINOR << std::endl;std::cout << "Usage: " << argv[0] << " number" << std::endl;return 1;}
std::cout << CXX_COMPILER_ID << std::endl;// convert input to double// TODO 4: Replace atof(argv[1]) with std::stod(argv[1])//const double inputValue = atof(argv[1]);const double inputValue = std::stod(argv[1]);// calculate square rootconst double outputValue = sqrt(inputValue);std::cout << "The square root of " << inputValue << " is " << outputValue<< std::endl;return 0;
}

可以看到 上面的源代码里使用到了 TutorialConfig.h。这个文件是 CMake 生成的。生成这个文件我们需要一个模板文件 TutorialConfig.h.in 。这个文件的内容如下:

// the configured options and settings for Tutorial
// TODO 10: Define Tutorial_VERSION_MAJOR and Tutorial_VERSION_MINOR
// the configured options and settings for Tutorial
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@
#define CXX_COMPILER_ID "@CMAKE_CXX_COMPILER_ID@"

可以看到这个文件里有些 @…@ 。这些在生成 TutorialConfig.h 时会替换为真实的值。

CMakeLists.txt 文件如下:

# TODO 1: Set the minimum required version of CMake to be 3.10
cmake_minimum_required(VERSION 3.10)# TODO 2: Create a project named Tutorial
project(Tutorial VERSION 1.0 LANGUAGES CXX)# TODO 7: Set the project version number as 1.0 in the above project command# TODO 6: Set the variable CMAKE_CXX_STANDARD to 11
#         and the variable CMAKE_CXX_STANDARD_REQUIRED to True
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)# TODO 8: Use configure_file to configure and copy TutorialConfig.h.in to
#         TutorialConfig.h
configure_file(TutorialConfig.h.in TutorialConfig.h)# TODO 3: Add an executable called Tutorial to the project
# Hint: Be sure to specify the source file as tutorial.cxx
add_executable(Tutorial tutorial.cxx)# TODO 9: Use target_include_directories to include ${PROJECT_BINARY_DIR}
target_include_directories(Tutorial PUBLIC"${PROJECT_BINARY_DIR}")

里面 project(Tutorial VERSION 1.0 LANGUAGES CXX) 这句制定了软件的版本号。1.0 会被拆分成1 和 0 。 1 就是 MAJOR,CMake 会自动生成一个变量 Tutorial_VERSION_MAJOR 存放这个值,0 是MINOR,同理放在 Tutorial_VERSION_MINOR。

configure_file(TutorialConfig.h.in TutorialConfig.h)

这句告诉 cmake, 我们要根据 TutorialConfig.h.in 来生成 TutorialConfig.h。 注意这里的 TutorialConfig.h 会生成在 ${PROJECT_BINARY_DIR} 目录下。因此我们需要把这个目录添加到头文件搜索目录中。

# TODO 9: Use target_include_directories to include ${PROJECT_BINARY_DIR}
target_include_directories(Tutorial PUBLIC"${PROJECT_BINARY_DIR}")

加上上面这句就可以编译执行了。

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

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

相关文章

每日一练 | 华为认证真题练习Day80

1、在Telnet中应用如下ACL&#xff1a;下列说法正确的是&#xff1f; acl number 2000 rule 5 deny source 172.16.105.30 rule 10 deny source 172.16.105.40rule 15 deny source 172.16.105.50rule 20 permit # A. IP地址为172.16.105.6的设备可以使用Telnet服务 B. IP…

SpringBoot中进行elasticSearch查询,使用QueryBuilders构建各类条件查询

查询所有 //搜索全部文档 QueryBuilder queryBuilder QueryBuilders.matchAllQuery();查询单个,等于/eq //单个匹配&#xff0c;搜索name为li的文档 QueryBuilder queryBuilder QueryBuilders.matchQuery("name", "li");查询多个字段匹配某一个值 //搜索…

【数据结构与算法】哈夫曼编码(最优二叉树)实现

哈夫曼编码 等长编码&#xff1a;占的位置一样 变长编码&#xff08;不等长编码&#xff09;&#xff1a;经常使用的编码比较短&#xff0c;不常用的比较短 最优&#xff1a;总长度最短 最优的要求&#xff1a;占用空间尽可能短&#xff0c;不占用多余空间&#xff0c;且不…

C\C++ 使用ping判断ip是否能连通

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan 简介&#xff1a; ping是一种用于测试网络连接的工具&#xff0c;它通过发送数据包到目标设备并等待其响应来工作&#xff0c;以检查网络是否连通。下面是例子. 效果&#xff1a; 代码…

JavaScript的WebAPI

这里写目录标题 DOM 基本概念获取元素事件概念事件的三要素操作元素获取/修改表单元素属性行内样式操作类名样式操作操作节点 DOM 基本概念 DOM 全称为 Document Object Model. W3C 标准给我们提供了一系列的函数, 让我们可以操作: 网页内容 ,网页结构, 网页样式 DOM数的结构如…

基于SpringBoot和Freemarker的用户管理系统

环境准备 JDK 1.8 及以上SpringBoot 2.5.5 及以上MySQL 5.7 及以上MavenIntelliJ IDEA &#xff08;可选&#xff09; 创建项目 我们使用 IntelliJ IDEA 创建一个 Spring Boot Web 项目。 打开 IntelliJ IDEA&#xff0c;点击菜单栏的 “File”&#xff0c;选择 “New”&…

vue2 element ui 的表格使用 sortablejs 拖拽列遇到的问题和解决方案

项目使用 element ui 的表格实现拖动表头可改变列的宽度&#xff0c;又使用sortablejs实现表格的列可拖拽到其他列的位置&#xff0c;导致出现如下的一些问题&#xff1a; 1、某一列宽变大或变小后&#xff0c;只有当前列可拖拽&#xff0c;其他列无法拖拽。 解决方案&#x…

软通动力与华秋达成生态共创合作,共同推动物联网硬件创新

7月11日&#xff0c;在2023慕尼黑上海电子展现场&#xff0c;软通动力信息技术(集团)股份有限公司(以下简称“软通动力”)与深圳华秋电子有限公司(以下简称“华秋”)签署了生态共创战略合作协议&#xff0c;共同推动物联网硬件生态繁荣发展。当前双方主要基于软通动力的产品及解…

【Python基础函数笔记】获取当前时间并写入日志

1.获取当前时间 import os from datetime import datetime import pytzdef get_cur_time():# 获取当前时间return datetime.strftime(datetime.now(pytz.timezone(Asia/Singapore)), %Y-%m-%d_%H-%M-%S)# 基础目录 basedir a logdir os.path.join(basedir, logs, str(args.n…

docker push镜像到自己的hub仓库

注册docker hub的账户 https://hub.docker.com/建立自己的仓库在终端执行 docker login给想要推送的镜像打标签 docker tag localimage:tag iamajdocker(账号名)/myrepository(仓库名):tag(dockerhub上显示的镜像名)例如&#xff1a; hub用户名为xx,在hub建立的仓库名为evmos…

Spring Cloud—GateWay之限流

RequestRateLimiter RequestRateLimiter GatewayFilter 工厂使用 RateLimiter 实现来确定是否允许当前请求继续进行。如果不允许&#xff0c;就会返回 HTTP 429 - Too Many Requests&#xff08;默认&#xff09;的状态。 这个过滤器需要一个可选的 keyResolver 参数和特定于…

pyqt 简单案例

一、空白的widget窗口 import sys from PyQt5 import QtWidgets,QtCoreapp QtWidgets.QApplication(sys.argv) widget QtWidgets.QWidget() widget.resize(360,360) widget.setWindowTitle("helloword") widget.show() sys.exit(app.exec_()) 需要引入sys模块&…

docker - 将tar包加载成镜像

这部分, 先从这篇开始吧, 然后根据相关工作顺序再慢慢介绍~ 介绍: 一般构建我们自己的镜像有很多方式, 这里介绍根据tar包进行构建镜像images. 用法: 加载镜像的tar包, 在服务器生成对应的镜像images: sudo docker load -i /home/xxx/tar_name.tar参数介绍: /home/xxx/ta…

STL源码刨析_stack _queue

目录 一. 介绍 1. stack 介绍 2. queue 介绍 二. 模拟实现 1. stack 模拟实现 2. queue 模拟实现 三. deque 1. deque 接口 2. 底层 一. 介绍 1. stack 介绍 stack&#xff08;栈&#xff09;是一种容器适配器&#xff0c;它提供了一种后进先出&#xff08;LIFO&#xff0…

VMware安装Ubuntu(VMware版本17-Ubuntu版本16.0)

VMware安装Ubuntu&#xff08;VMware版本17-Ubuntu版本16.0&#xff09; 一&#xff0c;VMware虚拟机下载官网点击https://customerconnect.vmware.com/cn/downloads/info/slug/desktop_end_user_computing/vmware_workstation_pro/17_0 二&#xff0c;Ubuntu乌班图下载官网点…

VB旅游资源及线路管理系统的设计与实现

旅游作为一个新兴的产业近年来取得了迅速的发展,旅行社如雨后春笋遍布全国各省市、目前旅游行业普遍存在着企业规模小,管理不规范等弱点。因为旅游涉及吃、住、行、游、购、娱等诸多要素,而且这些要素又分散在不同的地域中,一个人不可能全面掌握所有的信息。一旦掌握某方面…

会议OA项目之会议发布(多功能下拉框的详解)

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于OA项目的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.主要功能点介绍 二.效果展示 三.前…

[极客大挑战 2019]PHP(反序列化)

介绍说明&#xff0c;有备份的习惯&#xff0c;找常见的备份文件后缀名 使用dirsearch进行扫描 dirsearch -u http://f64378a5-a3e0-4dbb-83a3-990bb9e19901.node4.buuoj.cn:81/ -e php-e 指定网站语言 扫描出现&#xff0c;www.zip文件 查看index.php <?php include c…

ES(3)映射关系

文章目录 创建映射关系更具映射关系创建数据查询有什么区别呢&#xff1f; 创建映射关系 创建mapping映射类似于我们创建表结构&#xff0c;规定字段什么类型&#xff0c;多长等基本信息。 先创建 索引 PUT http://127.0.0.1:9200/user 然后创建映射关系 PUT http://127.0.…

[运维] 生成nginx 自签名ssl证书

系统说明 Ubuntu 22.04 STL 服务器版 生成证书 要生成 Nginx SSL 证书&#xff0c;你可以使用 OpenSSL 工具。按照以下步骤操作&#xff1a; 安装 OpenSSL&#xff1a; 如果你的系统上还没有安装 OpenSSL&#xff0c;请使用以下命令安装它&#xff1a; sudo apt update su…