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

cmake教程一

1. Start

1.1 构建简单工程

cmake_minimum_required(VERSION 3.0)
project(Step1)
add_executable(Step1 main.cpp)
  • 设置cmake最低版本要求
  • 设置工程名字
  • 设置工程生成可执行程序

2. 声明 C++ Standard

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
  • 如果我们用到了c++11新特性,就需要在CMakeLists.txt中增加CXX标准的声明,注意需要在add_executable()之前。

3. 声明版本和配置头文件

有时候我们需要一个变量定义在CMakeLists.txt中,而在源文件中又想使用这个变量。其中一种实现方式是通过可配置的头文件。config.h.in 是一个用于生成配置头文件的模板文件,通常用来定义一些编译时配置的宏。具体步骤如下:

3.1 创建 config.h.in 文件

首先,创建一个 config.h.in 文件,它通常包含一些占位符,将来会被 CMake 用于生成实际的 config.h 文件。例如:

/* config.h.in.  Generated from configure.ac by autoheader.  *//* Define to 1 if you have the <unistd.h> header file. */
#cmakedefine HAVE_UNISTD_H/* Define the version number */
#define VERSION "@PACKAGE_VERSION@"

3.2 在 CMakeLists.txt 中配置 CMake

CMakeLists.txt 文件中,配置 CMake 以使用 config.h.in 文件生成实际的 config.h 文件。这通常涉及以下几个步骤:

3.2.1 添加 config.h.in 文件

configure_file(config.h.in config.h)

configure_file 命令会将 config.h.in 文件处理成 config.h 文件。占位符(如 @PACKAGE_VERSION@)会被相应的值替换。

3.2.2 设置 CMake 变量

你可以使用 set 命令在 CMake 中定义一些变量,这些变量会被替换到 config.h 文件中。例如:

set(PACKAGE_VERSION "1.0.0")

3.2.3 配置 CMakeLists.txt

一个完整的例子可能如下所示:

cmake_minimum_required(VERSION 3.10)
project(MyProject)# 设置一些变量
set(PACKAGE_VERSION "1.0.0")# 配置生成 config.h 文件
configure_file(config.h.in config.h)# 添加源文件和可执行文件
add_executable(my_executable main.cpp)# 包含生成的 config.h 文件的路径
target_include_directories(my_executable PRIVATE ${CMAKE_CURRENT_BINARY_DIR})

3.3 使用 config.h 文件

在你的源代码中,包含 config.h 文件,以便使用在 config.h.in 中定义的宏:

#include "config.h"#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endifint main() {// 使用 VERSION 宏std::cout << "Version: " << VERSION << std::endl;return 0;
}

3.4 生成和构建项目

运行 CMake 以生成构建系统,并编译你的项目。你可以在构建目录中执行以下命令:

cmake ..
make

总结

  1. 创建 config.h.in:定义你想要的宏和占位符。
  2. 配置 CMake:在 CMakeLists.txt 中使用 configure_file 命令生成 config.h 文件。
  3. 设置变量:在 CMake 中设置你希望在 config.h 中定义的宏的值。
  4. 使用 config.h:在源代码中包含并使用这些宏。

这样,你可以灵活地控制代码中不同的配置选项,并使得你的项目能够根据不同的构建配置进行调整。

相关文章:

cmake教程一

1. Start 1.1 构建简单工程 cmake_minimum_required(VERSION 3.0) project(Step1) add_executable(Step1 main.cpp)设置cmake最低版本要求设置工程名字设置工程生成可执行程序 2. 声明 C Standard set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED True)如果我…...

3D场景标注标签信息,three.js CSS 2D渲染器CSS2DRenderer、CSS 3D渲染器CSS3DRenderer(结合react)

如果你想用HTML元素作为标签标注三维场景中模型信息&#xff0c;需要考虑定位的问题。比如一个模型&#xff0c;在代码中你可以知道它的局部坐标或世界坐标xyz&#xff0c;但是你并不知道渲染后在canvas画布上位置&#xff0c;距离web页面顶部top和左侧的像素px值。自己写代码把…...

C++参悟-单例模式

单例模式 一、概述1. 特点2. 实现方式3. 应用场景 二、实现代码1. 静态局部变量的懒汉单例2. 加锁的懒汉式单例3. 使用 C11 中的 std::call_one 的懒汉单例4. 饿汉式单例 一、概述 这里记录一下单例模式的最常用使用&#xff0c;单例模式&#xff08;Single Pattern&#xff0…...

【题解】—— LeetCode一周小结32

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结31 5.不含连续1的非负整数 题目链接&#xff1a;600. 不含连续…...

详解线索分层的目的、维度与创新实践

线索分层是一个系统性的过程&#xff0c;旨在更有效地管理、跟踪和利用线索资源。这一过程可以借鉴多种策略和方法&#xff0c;特别是在用户运营和市场营销中。 1、线索分层的目的 线索分层的主要目的是根据线索的不同特征或成熟度&#xff0c;将其分类管理&#xff0c;以便更…...

于8月21号的回顾

傍晚的日落和逐渐深邃的夜&#xff0c;驱散了白天的极致闷热。倦怠和疲惫充斥着大脑&#xff0c;喧嚣的浮沉又在耳边轰鸣。 我不曾想到&#xff0c;再次打开博客已经是两年后的今天了。手指轻轻滑过鼠标&#xff0c;博客的页面缓缓加载&#xff0c;那些被时间尘封的记忆瞬间涌…...

Abstract Class抽象类

抽象类&#xff08;Abstract Class&#xff09;在面向对象编程中是一种特殊的类&#xff0c;它不能被实例化&#xff0c;即不能创建该类的对象。抽象类主要用于定义一组接口&#xff08;即方法&#xff09;&#xff0c;这些方法的具体实现由子类来完成。抽象类通常用于表示一种…...

webrtc ns 降噪之粉红噪声参数推导

webrtc中降噪中&#xff0c;前50帧需要进行简单噪声估计&#xff0c;使用白噪声和粉红噪声模型估算。 首先我们 复习 有色噪声&#xff08;包含白噪声&#xff09;的一般模型&#xff1a; S(f) 是频率 f 处的功率谱密度。f是频率。α 是一个频谱指数&#xff0c;通常在1左右。…...

IO进程线程8月21日

1&#xff0c;思维导图 2&#xff0c;登录 #ifndef __LOG_H__ #define __LOG_H__ #include<myhead.h> typedef struct {char name[20];char pwd[20]; }str;int regist();int login(); #endif#include"log.h" int login() {char a[20]"\n";str p,s;…...

Web安全:SqlMap工具

一、简介 sqlmap 是一款开源的渗透测试工具&#xff0c;可以自动化进行SQL注入的检测、利用&#xff0c;并能接管数据库服务器。它具有功能强大的检测引擎,为渗透测试人员提供了许多专业的功能并且可以进行组合&#xff0c;其中包括数据库指纹识别、数据读取和访问底层文件系统…...

用手机写一本电子书

第1步、进入Andi.cn网站 第2步、点击登录&#xff0c;注册用户 第3步、点击去创作&#xff0c;进入创作页面 第4步、点击右下角的小笔&#xff0c;写一篇文章 第5步、下翻&#xff0c;点击提交按钮 第6步、再写一篇文章 第7步、点击栏目设计 第8步、进入栏目设计&#xff0c;点…...

【网络编程】基于UDP的TFTP文件传输

1&#xff09;tftp协议概述 简单文件传输协议&#xff0c;适用于在网络上进行文件传输的一套标准协议&#xff0c;使用UDP传输 特点&#xff1a; 是应用层协议 基于UDP协议实现 数据传输模式 octet&#xff1a;二进制模式&#xff08;常用&#xff09; mail&#xff1a;已经不再…...

Vue 3 + Pinia 实现网页刷新功能

概述 在现代 Web 开发中&#xff0c;保持用户界面的动态性和响应性至关重要。当用户触发某些操作时&#xff0c;例如点击按钮或者完成表单提交&#xff0c;我们往往需要刷新页面的一部分来展示最新的数据。本文将介绍如何使用 Vue 3 和 Pinia 来实现这一功能。 技术栈 Vue 3…...

DVWA综合靶场漏洞讲解

目录 综合靶场漏洞讲解 Brute Force Low Medium High Command Injection Low Medium High File Inclusion Low,Medium,High File Upload Low Medium High SQL Injection Low Medium High SQL Injection (Blind) Low Medium High XSS&#xff08;DOM&am…...

实现Bezier样条曲线

1.给出n1 个控制点pk(xk,yk,zk),这里k可取值0-n,多项式函数公式如下 获取的单个点的代码 void zmBezier::getPoint(float u, double p[3]) {int n m_count - 1;double x 0, y 0, z 0;for(int k 0; k < n; k){x m_ctrlPoints[k][0] * BEZ_k_n(n, k, u);y m_ctrlPoin…...

MySQL中的EXPLAIN的详解

一、介绍 官网介绍&#xff1a; https://dev.mysql.com/doc/refman/5.7/en/explain-output.htmlhttps://dev.mysql.com/doc/refman/8.0/en/explain-output.htmlexplain&#xff08;执行计划&#xff09;&#xff0c;使用explain关键字可以模拟优化器执行sql查询语句&#xff…...

LearnOpenGL——SSAO学习笔记

LearnOpenGL——SSAO学习笔记 SSAO一、基本概念二、样本缓冲三、法向半球四、随机核心转动五、SSAO着色器六、环境遮蔽模糊七、应用SSAO遮蔽因子 SSAO 一、基本概念 环境光照是我们加入场景总体光照中的一个固定光照常量&#xff0c;它被用来模拟光的散射(Scattering)。散射应…...

[C语言]-基础知识点梳理-文件管理

前言 各位师傅们好&#xff0c;我是qmx_07&#xff0c;今天给大家讲解文件管理的相关知识&#xff0c;也就是常见的 读取&#xff0c;删除一类的操作 文件 为什么要使用文件&#xff1f; 程序的数据是存储在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&…...

pcdn闲置带宽被动收入必看教程。第五讲:光猫更换和基础设置

PCDN闲置带宽被动收入必看教程 —— 第五讲&#xff1a;光猫更换和基础设置 为了从闲置带宽中获得被动收入&#xff0c;高效的网络设备至关重要。运营商提供的光猫通常能满足日常家用需求&#xff0c;但对于PCDN应用来说&#xff0c;它们可能不足以提供所需的高性能和稳定性。…...

工业数据采集网关简介-天拓四方

随着工业4.0和物联网&#xff08;IoT&#xff09;技术的深入发展&#xff0c;工业数据采集网关作为连接现场设备与上层管理系统的关键节点&#xff0c;其在智能工厂中的作用愈发凸显。本文将深入探讨工业数据采集网关的功能、特点、应用场景及其实操性&#xff0c;以期为读者提…...

终极指南:使用XNBCLI高效解包打包星露谷物语XNB游戏资源文件

终极指南&#xff1a;使用XNBCLI高效解包打包星露谷物语XNB游戏资源文件 【免费下载链接】xnbcli A CLI tool for XNB packing/unpacking purpose built for Stardew Valley. 项目地址: https://gitcode.com/gh_mirrors/xn/xnbcli XNB文件是星露谷物语等XNA游戏引擎使用…...

React极简表单库veyra-forms:轻量级、类型安全的表单状态管理方案

1. 项目概述&#xff1a;一个被低估的轻量级表单解决方案在Web开发的世界里&#xff0c;表单处理是个既基础又麻烦的活儿。从简单的联系表单到复杂的多步骤数据收集&#xff0c;开发者们总是在寻找一个平衡点&#xff1a;既要功能强大、易于集成&#xff0c;又要足够轻量、不拖…...

Docker 部署 SpringBoot 项目超详细教程

Docker 部署 SpringBoot 项目超详细教程一篇适合新手的 Docker 部署 SpringBoot 实战教程&#xff0c;包含&#xff1a; Docker 安装镜像加速SpringBoot 打包Dockerfile 编写构建镜像容器部署日志查看防火墙开放常见问题解决 图文并茂&#xff0c;保姆级教学。本文假设你已拥有…...

基于CircuitPython与BLE的无线手势鼠标:从传感器到HID设备的实践

1. 项目概述与核心思路想没想过&#xff0c;你手里的那块开发板&#xff0c;除了点灯、读传感器&#xff0c;还能直接变成你电脑的鼠标&#xff1f;不是通过USB线&#xff0c;而是像你的蓝牙耳机一样&#xff0c;无线连接&#xff0c;靠手腕的晃动来控制光标。这个想法听起来有…...

开源智能体框架xbrain:模块化设计与工程实践指南

1. 项目概述&#xff1a;一个面向开发者的开源智能体框架最近在开源社区里&#xff0c;一个名为xbrain的项目引起了我的注意。它由开发者yuruotong1发起&#xff0c;定位是一个“开源智能体框架”。简单来说&#xff0c;它试图为开发者提供一个工具箱&#xff0c;让构建、管理和…...

ARM ETMv4跟踪寄存器架构与调试实践

1. ARM ETMv4 跟踪寄存器架构概述ARM嵌入式跟踪宏单元(ETM)是处理器调试架构中的关键组件&#xff0c;ETMv4作为其第四代架构&#xff0c;提供了更强大的指令和数据跟踪能力。与传统的断点调试不同&#xff0c;ETM采用实时跟踪技术&#xff0c;能够在不中断处理器运行的情况下&…...

ARM Cortex-A72/A720架构解析与调试优化实践

1. ARM Cortex-A72/A720架构深度解析作为ARMv8-A架构的典型代表&#xff0c;Cortex-A72和A720处理器广泛应用于移动设备和嵌入式系统。我曾参与多个基于这两款核心的SoC开发项目&#xff0c;今天将结合官方文档和实战经验&#xff0c;深入剖析其关键特性和调试技巧。1.1 指令集…...

Go语言外部服务调用可靠性实践:Icepick库的重试、熔断与并发控制

1. 项目概述与核心价值 最近在折腾一个需要深度集成多个外部API的后端服务&#xff0c;遇到了一个老生常谈但又极其棘手的问题&#xff1a;如何优雅、可靠地处理那些可能失败的外部调用&#xff1f;重试、熔断、降级、超时控制……这些概念听起来都懂&#xff0c;但真要把它们组…...

fastmod vs codemod:为什么你应该选择这个更快的代码替换工具

fastmod vs codemod&#xff1a;为什么你应该选择这个更快的代码替换工具 【免费下载链接】fastmod A fast partial replacement for the codemod tool. Assists with large-scale codebase refactors via regex-based find and replace with human oversight and occasional i…...

终极raylib游戏开发指南:如何在3天内从零到一创建跨平台游戏

终极raylib游戏开发指南&#xff1a;如何在3天内从零到一创建跨平台游戏 【免费下载链接】raylib A simple and easy-to-use library to enjoy videogames programming 项目地址: https://gitcode.com/GitHub_Trending/ra/raylib raylib是一个简单易用的轻量级游戏编程库…...