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代码不仅仅只是为了生成可执行程序,有的时候可能是为了生成动态库或者静态库,那么如果用cmake来构建的话,应该怎么做呢,怎么指定是生成可执行程序,还是生成动态库…...
使用ffmpeg和mediamtx模拟多通道rtsp相机
首先下载ffmpeg,在windows系统上直接下载可执行文件,并配置环境变量即可在命令行当中调用执行。 下载地址: https://ffmpeg.org/再在github上下载mediamtx搭建rtsp服务器,使用ffmpeg将码流推流到rtsp服务器。 下载地址࿱…...
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? 什么是USART? 简介 USART(Universal Synchron /Asynchronous Receiver /Transmitter)通用同步/异步收发器 1、USART是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧…...
再探“构造函数”(2)友元and内部类
文章目录 一. 友元‘全局函数’作友元‘成员函数’作友元‘类‘作友元 内部类 一. 友元 何时会用到友元呢? 当想让(类外面的某个函数/其它的类)访问 某个类里面的(私有或保护的)内容时,可以选择使用友元。 友元提供了一种突破&a…...
ffmpeg+vue2
一、安装依赖 npm install ffmpeg/core ffmpeg/ffmpeg "ffmpeg/core": "^0.10.0", "ffmpeg/ffmpeg": "^0.10.1",二、配置ffmpeg 安装好插件以后,需要配置一下代码,否则会报错: 1、在vue.config.js…...
基于深度学习YOLOv10的电动二轮车目标检测、轨迹跟踪、测距算法
基于深度学习YOLOv10的电动二轮车目标检测、轨迹跟踪、测距算法 基于深度学习YOLOv10的电动二轮车目标检测、轨迹跟踪、测距算法引言YOLOv10简介目标检测轨迹跟踪测距算法实际应用结论 基于深度学习YOLOv10的电动二轮车目标检测、轨迹跟踪、测距算法 二轮电动车的目标检测、跟踪…...
鸿蒙ArkTS中的image组件
开发文档很详尽,就在DevEco中的API参考,可以随时调出来进行学习。 在鸿蒙官网也有非常详尽的资料,地址:开发说明-API参考概述 - 华为HarmonyOS开发者 (huawei.com) 这里,就学习image组件的一般用法以及使用SVG图标和字…...
LeetCode 684.冗余连接:拓扑排序+哈希表(O(n)) 或 并查集(O(nlog n)-O(nα(n)))
【LetMeFly】684.冗余连接:拓扑排序哈希表(O(n)) 或 并查集(O(nlog n)-O(nα(n))) 力扣题目链接:https://leetcode.cn/problems/redundant-connection/ 树可以看成是一个连通且 无环 的 无向 图。 给定往…...
让空气净化器“很听话”-置入NRK3502离线语音控制芯片
一、产品市场 随着智能家居的快速发展,人们对家居环境的舒适度与健康性要求日益提升,空气净化器作为改善室内空气质量的重要设备,其智能化升级变得尤为关键。让空气净化器“很听话”,不再仅仅是一个遥不可及的设想,而…...
8个Visio最佳替代软件推荐,每一款都堪称绘图神器
上午好,我的网工朋友。 绘图软件Visio是微软旗下知名的绘图软件,可用来绘制各种可视化图形,包括但不限于:流程图、人物关系图、组织架构图、思维导图、UML图、泳道图、甘特图、知识地图、软件架构图、鱼骨图等 它支持绘制的图形…...
微服务day02
教学文档: 黑马教学文档 Docker Docker的安装 镜像和容器 命令解读 常见命令 案例 查看DockerHub,拉取Nginx镜像,创建并运行容器 搜索Nginx镜像:在 www.hub.docker.com 网站进行查询 拉取镜像: docker pull ngin…...
使用 Logback 的最佳实践:`logback.xml` 与 `logback-spring.xml` 的区别与用法
在开发 Spring Boot 项目时,日志是调试和监控的重要工具。Spring Boot 默认支持 Logback 作为日志系统,并提供了 logback.xml 和 logback-spring.xml 两种配置方式。这篇文章将详细介绍这两者的区别、各自的优缺点以及最佳实践。 目录 一、什么是 Logbac…...
NSET or MSET算法--原理解析
1.背景 NSET/MSET是一种非线性的多元预测诊断技术,广泛应用于系统状态估计、故障诊断和预测等领域;相比于传统的线性模型和方法,NSET/MSET能够更好地处理非线性系统,并提供更准确的预测和诊断能力。在早期,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云存储
随着云计算技术的日益成熟,越来越多的企业开始将其业务迁移到云端,以享受更为灵活、高效且经济的服务模式。在视频监控领域,云存储因其强大的数据处理能力和弹性扩展性,成为视频数据存储的理想选择。NVR批量管理软件/平台EasyNVR&…...
13.React useTimeout
在 React 应用中,延迟执行某些操作是一个常见需求。传统的 setTimeout 在函数组件中使用可能会导致一些问题,如闭包陷阱或难以正确清理。useTimeout 钩子提供了一种声明式的方法来实现延迟执行,使得定时器的管理更加简单和可靠。这个自定义钩子不仅简化了定时器的使用,还解…...
zotero-style:提升文献管理效率的3个核心方案
zotero-style:提升文献管理效率的3个核心方案 【免费下载链接】zotero-style zotero-style - 一个 Zotero 插件,提供了一系列功能来增强 Zotero 的用户体验,如阅读进度可视化和标签管理,适合研究人员和学者。 项目地址: https:/…...
Kettle错误处理实战:如何用表输出步骤捕获并存储ETL过程中的异常数据
Kettle错误处理实战:如何用表输出步骤捕获并存储ETL过程中的异常数据 在数据仓库和ETL(Extract, Transform, Load)流程中,错误处理是确保数据质量的关键环节。Kettle(现称Pentaho Data Integration)作为一款…...
Windows下RedisInsight保姆级安装教程:从下载到连接Redis全流程详解
Windows平台RedisInsight全流程实战指南:从零搭建高效Redis可视化环境 Redis作为当下最流行的内存数据库之一,其强大的性能与丰富的数据结构深受开发者青睐。但在日常开发中,仅通过命令行操作Redis难免效率低下——这正是RedisInsight的价值所…...
OpenClaw+ollama-QwQ-32B实战:自动化处理100份简历筛选
OpenClawollama-QwQ-32B实战:自动化处理100份简历筛选 1. 为什么选择自动化简历筛选 去年团队扩张时,我作为技术负责人参与了简历初筛工作。面对雪片般飞来的PDF简历,连续三天熬夜到凌晨两点手动整理关键信息后,我意识到必须寻找…...
【独家首发】Python扩展安全成熟度模型(PESMM v1.2):覆盖编译期/加载期/运行期的9维评分体系,仅限前500名开发者免费获取评估工具包
第一章:Python扩展模块安全概述Python 扩展模块(如 C/C 编写的 .so/.dll 文件或 Cython 生成的二进制模块)在提升性能的同时,也引入了原生层特有的安全风险。与纯 Python 代码不同,扩展模块直接操作内存、调用系统 API…...
20吨燃气蒸汽锅炉实力厂家/支持上门安装调试
燃气蒸汽锅炉,认准源头实力厂家,不仅能买到品质过硬的设备,更能享受到省心便捷的上门安装调试服务,免去自行安装的繁琐与隐患,让设备快速投入平稳运行。我们作为深耕锅炉制造行业的实力厂家,具备正规生产资…...
OpenClaw安全方案:nanobot本地模型的数据隐私保护实践
OpenClaw安全方案:nanobot本地模型的数据隐私保护实践 1. 为什么选择本地化部署 去年夏天,我接手了一个特殊项目——为一家小型会计师事务所设计自动化财务文档处理方案。最初考虑使用云端AI服务时,客户明确提出了数据隐私的硬性要求&#…...
毕业论文神器 2026 降AI率平台推荐:工具对比+最好用AI推荐
2026年真正好用的AI论文降重与改写工具,核心看降重效果、去AI味、格式保留、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 …...
FOC算法避坑指南:克拉克变换的‘等幅值’与‘等功率’到底选哪个?基于AS5600编码器的实测对比
FOC算法避坑指南:克拉克变换的‘等幅值’与‘等功率’到底选哪个?基于AS5600编码器的实测对比 在无刷电机控制领域,FOC(Field Oriented Control)算法因其优异的动态性能和效率表现,已成为工业驱动和高精度…...
Phi-4-Reasoning-Vision效果展示:低资源语言(如日/韩/西)图文推理能力
Phi-4-Reasoning-Vision效果展示:低资源语言(如日/韩/西)图文推理能力 1. 多模态推理工具概览 Phi-4-Reasoning-Vision是一款基于微软Phi-4-reasoning-vision-15B多模态大模型开发的高性能推理工具。该工具专为双卡RTX 4090环境优化&#x…...
