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

cmake系列-怎么构建不同的C++程序目标文件(可执行程序、动态库、静态库)

目录

  • 生成可执行程序
  • 生成动态库
  • 生成静态库

我们编写的C++代码不仅仅只是为了生成可执行程序,有的时候可能是为了生成动态库或者静态库,那么如果用cmake来构建的话,应该怎么做呢,怎么指定是生成可执行程序,还是生成动态库或者静态库呢,这篇文章我们用简单的demo聊一下这些内容。

示例使用安装了vs2022的Windows系统,使用vscode编辑器。

生成可执行程序

先看一下demo的结构
在这里插入图片描述

结构很简单,只有一个用来生成可执行程序的源文件main.cpp和一个指定构建规则的CMakeLists.txt文件。

其中main.cpp的内容如下

// main.cpp#include <iostream>int main()
{std::cout << "demo" << std::endl;return 0;
}

这个main.cpp就不解释了。

然后看下CMakeLists.txt的内容

cmake_minimum_required(VERSION 3.26)project(demo)add_executable(${PROJECT_NAME} main.cpp)

这几条指令的作用:

  • cmake_minimum_required(VERSION 3.26):指定cmake最低版本,如果构建时使用的cmake低于这个版本就会报错,主要是为了避免出现兼容问题。
  • project(demo):设置项目名称为demo,这条指令还可以设置版本以及程序语言等信息,但是一般不需要,设置项目名称就可以了。
  • add_executable(${PROJECT_NAME} main.cpp):这条指令的作用是指定项目目标为生成可执行程序,同时指定可执行程序的文件名为PROJECT_NAME变量的值(这个文件名是不带后缀名的文件名,具体后缀名会根据所处系统环境自动生成,PROJECT_NAME变量的值是最近的一次使用project()设置的项目名称),以及指定生成可执行程序使用的源文件为main.cpp。

编写好这几个文件之后,我们在demo目录下先执行命令cmake -B build生成构建系统,然后执行命令cmake --build build --config Debug就可以构建出可执行程序了。

在这里插入图片描述

生成动态库

同样先看一下demo结构
在这里插入图片描述

结构也很简单,包括用来生成动态库的源文件demo.cpp,头文件demo.h和demo_config.h,以及一个指定构建规则的CMakeLists.txt文件。

先看一下C++代码

// demo_config.h#ifndef DEMO_CONFIG_H
#define DEMO_CONFIG_H#ifdef DEMO_EXPORT#define DEMO_API __declspec(dllexport)
#else#define DEMO_API __declspec(dllimport)
#endif#endif
// demo.h#ifndef DEMO_H
#define DEMO_H#include "demo_config.h"class Demo
{
public:Demo() = default;~Demo() noexcept = default;DEMO_API void Func();
};#endif
// demo.cpp#include "demo.h"#include <iostream>void Demo::Func()
{std::cout << "demo" << std::endl;
}

代码很简单就不解释了,重点是要解释CMakeLists.txt文件的内容。

看一下这个CMakeLists.txt文件的内容,这个会比上面生成可执行程序的那个demo稍微复杂一些。

cmake_minimum_required(VERSION 3.26)project(demo)include_directories(include)add_definitions(-DDEMO_EXPORT)aux_source_directory(src srcfiles)message(STATUS "srcfiles:${srcfiles}")add_library(${PROJECT_NAME} SHARED ${srcfiles})

解释一下这几条指令的作用:

  • cmake_minimum_required(VERSION 3.26)和project(demo)前面已经说过了。
  • include_directories(include):设置包含目录,即头文件位置
  • add_definitions(-DDEMO_EXPORT):设置预定义宏DEMO_EXPORT,前面的-D是写法规则要求带上的,这个宏在C++代码里用到了,用来指定是否需要导出符号。
  • aux_source_directory(src srcfiles):表示收集src目录下的源文件,并且保存为变量srcfiles
  • message(STATUS “srcfiles:${srcfiles}”):打印变量srcfiles的值,不打印也可以,这里只是为了讲的清楚一些,STATUS表示是状态信息。
  • add_library(${PROJECT_NAME} SHARED ${srcfiles}):这条指令的作用是指定生成库文件,并且指定库文件的文件名是变量PROJECT_NAME的值,使用的源文件就是前面aux_source_directory(src srcfiles)指令收集的源文件,即变量srcfiles的值,这俩参数和前面的指令add_executable()中对应的参数是一样的含义,另一个参数SHARED表示要生成的是动态库(共享库)文件。

这几个文件写好了之后,和前面构建可执行程序一样,我们在demo目录下先执行命令cmake -B build生成构建系统(执行这条命令的时候可以看到CMakeLists.txt中那条message指令打印的信息),然后执行命令cmake --build build --config Debug就可以构建出动态库了。
在这里插入图片描述

生成静态库

还是先看一下demo结构
在这里插入图片描述

这个也很简单,包括用来生成动态库的源文件demo.cpp和头文件demo.h,以及一个指定构建规则的CMakeLists.txt文件。

还是先看一下C++代码,但是很简单所以不解释。

// demo.h#ifndef DEMO_H
#define DEMO_Hclass Demo
{
public:Demo() = default;~Demo() noexcept = default;void Func();
};#endif
// demo.cpp#include "demo.h"#include <iostream>void Demo::Func()
{std::cout << "demo" << std::endl;
}

重点是这个CMakeLists.txt文件的内容,但是这个CMakeLists.txt和前面生成动态库的那个CMakeLists.txt基本上一样,我们来看一下。

cmake_minimum_required(VERSION 3.26)project(demo)include_directories(include)aux_source_directory(src srcfiles)message(STATUS "srcfiles:${srcfiles}")add_library(${PROJECT_NAME} STATIC ${srcfiles})

这个CMakeLists.txt和前面生成动态库的那个CMakeLists.txt的一个区别是不用设置预定义宏了,因为不需要,但是这个区别不是重点,重点是add_library()这条指令的区别,这条指令前面讲了可以使用参数SHARED指定生成动态库,相对应的使用参数STATIC就是表示要指定生成静态库。

同样的,这几个文件写好了之后,我们在demo目录下先执行命令cmake -B build生成构建系统,然后执行命令cmake --build build --config Debug就可以构建出静态库了。
在这里插入图片描述

相关文章:

cmake系列-怎么构建不同的C++程序目标文件(可执行程序、动态库、静态库)

目录 生成可执行程序生成动态库生成静态库 我们编写的C代码不仅仅只是为了生成可执行程序&#xff0c;有的时候可能是为了生成动态库或者静态库&#xff0c;那么如果用cmake来构建的话&#xff0c;应该怎么做呢&#xff0c;怎么指定是生成可执行程序&#xff0c;还是生成动态库…...

使用ffmpeg和mediamtx模拟多通道rtsp相机

首先下载ffmpeg&#xff0c;在windows系统上直接下载可执行文件&#xff0c;并配置环境变量即可在命令行当中调用执行。 下载地址&#xff1a; https://ffmpeg.org/再在github上下载mediamtx搭建rtsp服务器&#xff0c;使用ffmpeg将码流推流到rtsp服务器。 下载地址&#xff1…...

windows系统类似于linux的nohup命令后台启动jar服务

一、首先新建一个后缀名为.bat文件 二、将jar包放在与jar包同一个路径下 三、编写.bat文件 echo off start javaw -Xms512m -Xmx1024m -XX:PermSize256m -XX:MaxPermSize512m -XX:MaxNewSize512m -jar xxxxx-22900.jar >> StartupLog.log 2>&1 & exit 四…...

2024 Rust现代实用教程 流程控制与函数

文章目录 一、if流程控制与match模式匹配1.流程控制2. IF流程控制3.match 表达式 二、循环与break continue以及与迭代的区别1.Rust中的循环Loops2.break && continue3.迭代4.循环与迭代的不同 三、函数基础与Copy值参数传递1.函数的基础知识2.Copy by value 四、函数值…...

stm32入门教程--USART外设 超详细!!!

目录 简介 什么是UART&#xff1f; 什么是USART&#xff1f; 简介 USART&#xff08;Universal Synchron /Asynchronous Receiver /Transmitter&#xff09;通用同步/异步收发器 1、USART是STM32内部集成的硬件外设&#xff0c;可根据数据寄存器的一个字节数据自动生成数据帧…...

再探“构造函数”(2)友元and内部类

文章目录 一. 友元‘全局函数’作友元‘成员函数’作友元‘类‘作友元 内部类 一. 友元 何时会用到友元呢&#xff1f; 当想让&#xff08;类外面的某个函数/其它的类&#xff09;访问 某个类里面的(私有或保护的)内容时&#xff0c;可以选择使用友元。 友元提供了一种突破&a…...

ffmpeg+vue2

一、安装依赖 npm install ffmpeg/core ffmpeg/ffmpeg "ffmpeg/core": "^0.10.0", "ffmpeg/ffmpeg": "^0.10.1",二、配置ffmpeg 安装好插件以后&#xff0c;需要配置一下代码&#xff0c;否则会报错&#xff1a; 1、在vue.config.js…...

基于深度学习YOLOv10的电动二轮车目标检测、轨迹跟踪、测距算法

基于深度学习YOLOv10的电动二轮车目标检测、轨迹跟踪、测距算法 基于深度学习YOLOv10的电动二轮车目标检测、轨迹跟踪、测距算法引言YOLOv10简介目标检测轨迹跟踪测距算法实际应用结论 基于深度学习YOLOv10的电动二轮车目标检测、轨迹跟踪、测距算法 二轮电动车的目标检测、跟踪…...

鸿蒙ArkTS中的image组件

开发文档很详尽&#xff0c;就在DevEco中的API参考&#xff0c;可以随时调出来进行学习。 在鸿蒙官网也有非常详尽的资料&#xff0c;地址&#xff1a;开发说明-API参考概述 - 华为HarmonyOS开发者 (huawei.com) 这里&#xff0c;就学习image组件的一般用法以及使用SVG图标和字…...

LeetCode 684.冗余连接:拓扑排序+哈希表(O(n)) 或 并查集(O(nlog n)-O(nα(n)))

【LetMeFly】684.冗余连接&#xff1a;拓扑排序哈希表&#xff08;O(n)&#xff09; 或 并查集&#xff08;O(nlog n)-O(nα(n))&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/redundant-connection/ 树可以看成是一个连通且 无环 的 无向 图。 给定往…...

让空气净化器“很听话”-置入NRK3502离线语音控制芯片

一、产品市场 随着智能家居的快速发展&#xff0c;人们对家居环境的舒适度与健康性要求日益提升&#xff0c;空气净化器作为改善室内空气质量的重要设备&#xff0c;其智能化升级变得尤为关键。让空气净化器“很听话”&#xff0c;不再仅仅是一个遥不可及的设想&#xff0c;而…...

8个Visio最佳替代软件推荐,每一款都堪称绘图神器

上午好&#xff0c;我的网工朋友。 绘图软件Visio是微软旗下知名的绘图软件&#xff0c;可用来绘制各种可视化图形&#xff0c;包括但不限于&#xff1a;流程图、人物关系图、组织架构图、思维导图、UML图、泳道图、甘特图、知识地图、软件架构图、鱼骨图等 它支持绘制的图形…...

微服务day02

教学文档&#xff1a; 黑马教学文档 Docker Docker的安装 镜像和容器 命令解读 常见命令 案例 查看DockerHub&#xff0c;拉取Nginx镜像&#xff0c;创建并运行容器 搜索Nginx镜像&#xff1a;在 www.hub.docker.com 网站进行查询 拉取镜像&#xff1a; docker pull ngin…...

使用 Logback 的最佳实践:`logback.xml` 与 `logback-spring.xml` 的区别与用法

在开发 Spring Boot 项目时&#xff0c;日志是调试和监控的重要工具。Spring Boot 默认支持 Logback 作为日志系统&#xff0c;并提供了 logback.xml 和 logback-spring.xml 两种配置方式。这篇文章将详细介绍这两者的区别、各自的优缺点以及最佳实践。 目录 一、什么是 Logbac…...

NSET or MSET算法--原理解析

1.背景 NSET/MSET是一种非线性的多元预测诊断技术&#xff0c;广泛应用于系统状态估计、故障诊断和预测等领域&#xff1b;相比于传统的线性模型和方法&#xff0c;NSET/MSET能够更好地处理非线性系统&#xff0c;并提供更准确的预测和诊断能力。在早期&#xff0c;MSET融合了…...

NC6 系统配置的消息渠道配置配置涉及相关的表,用户使用admin登录

NC6 系统配置的消息渠道配置配置涉及相关的表 --电子邮件、公共短信属性值配置表,比如邮箱类型、邮件发送服务器、用户、密码、发件人地址、url等。 SELECT * FROM sm_msg_stypeprop;--消息发送方式配置:电子邮件,公共短信。 SELECT * FROM sm_msg_stypebase WHERE active …...

PXC数据库性能测试对比

mysql单机 #初始化测试数据 sysbench /usr/share/sysbench/oltp_read_write.lua --mysql-host=xxx.xxx.xxx.xxx --mysql-db=test --mysql-user=hzhadmin --mysql-password=Admi --tables=10 --table-size=1000000 prepare#运行性能测试 sysbench /usr/share/sysbench/oltp_rea…...

使用AutoMySQLBackup 数据库自动备份

1.下载地址 AutoMySQLBackup的下在地址为http://sourceforge.net/projects/automysqlbackup/ 。 目前最新版本为automysqlbackup-v3.0_rc6.tar.gz 2.解压缩 把下载的automysqlbackup-v3.0_rc6.tar.gz文件拷贝到/usr/tmp下面 在/usr/local下面新建一个automysqlbackup文件夹…...

NVR批量管理软件/平台EasyNVR多个NVR同时管理支持对接阿里云、腾讯云、天翼云、亚马逊S3云存储

随着云计算技术的日益成熟&#xff0c;越来越多的企业开始将其业务迁移到云端&#xff0c;以享受更为灵活、高效且经济的服务模式。在视频监控领域&#xff0c;云存储因其强大的数据处理能力和弹性扩展性&#xff0c;成为视频数据存储的理想选择。NVR批量管理软件/平台EasyNVR&…...

13.React useTimeout

在 React 应用中,延迟执行某些操作是一个常见需求。传统的 setTimeout 在函数组件中使用可能会导致一些问题,如闭包陷阱或难以正确清理。useTimeout 钩子提供了一种声明式的方法来实现延迟执行,使得定时器的管理更加简单和可靠。这个自定义钩子不仅简化了定时器的使用,还解…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...