c++ CMakeLists.txt详解
基本结构
- CMake 最低版本声明
用于指定需要的最低 CMake 版本,确保兼容性。
cmake_minimum_required(VERSION 3.10)
- 指定 CMake 的最低版本。
- 确保用户的 CMake 版本符合项目需求,否则报错。
- 版本选择建议根据项目使用的功能决定。例如,3.10 引入了
target_link_directories
。
- 项目名称和语言定义
定义项目的名称及支持的编程语言。
project(ProjectName LANGUAGES C CXX)
ProjectName
:项目名称,自动赋值给变量${PROJECT_NAME}
。LANGUAGES
:指定项目支持的语言,可以是C
、CXX
(C++)、Fortran
等。- 默认生成变量:
${PROJECT_SOURCE_DIR}
:项目根目录。${PROJECT_BINARY_DIR}
:构建目录。
- 设置编译选项
设置标准版本(如 C++17)或添加额外的编译器选项。
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
CMAKE_CXX_STANDARD
:设置 C++ 标准(如 11、14、17、20)。CMAKE_CXX_STANDARD_REQUIRED
:强制使用指定版本。CMAKE_CXX_EXTENSIONS
:是否使用非标准扩展(如-std=gnu++17
)。
- 定义源文件和头文件路径
将源代码组织到变量中,或直接指定路径。
set(SOURCES src/main.cpp src/foo.cpp)
set(INCLUDES include/)
- 生成可执行文件或库
指定目标类型(可执行文件、静态库、动态库)。
# 添加可执行文件
add_executable(MyApp ${SOURCES})# 添加静态库
add_library(MyStaticLib STATIC src/foo.cpp src/bar.cpp)# 添加动态库
add_library(MySharedLib SHARED src/foo.cpp src/bar.cpp)
- 设置目标的头文件路径
将头文件目录添加到目标的构建路径中。
target_include_directories(MyApp PRIVATE ${INCLUDES})
- 链接内部库
链接外部依赖库或内部生成的库。
target_link_libraries(MyApp PRIVATE MyLib)
- 查找外部库(可选)
查找并使用外部库(如 Boost 或 OpenCV)。
find_package(OpenCV REQUIRED)
target_link_libraries(MyApp PRIVATE ${OpenCV_LIBS})
- 安装规则
指定生成的二进制文件、配置文件等的安装路径。
install(TARGETS MyApp DESTINATION bin)
install(FILES config/settings.conf DESTINATION etc)
install()
定义安装文件的位置。- 常见用途:
- 安装可执行文件到
bin
。 - 安装库到
lib
。 - 安装配置文件到
etc
。
- 安装可执行文件到
- 测试支持(可选)
启用单元测试功能。
enable_testing()
add_test(NAME MyTest COMMAND MyApp --test)
- 子目录管理(可选)
用于大型项目,将多个模块分割到不同的子目录。
add_subdirectory(src/module1)
- 对于大型项目,将代码分割到子目录中,通过
add_subdirectory()
引入。
子模块的 CMakeLists.txt
:
add_library(Module1 STATIC module1.cpp)
target_include_directories(Module1 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
- 添加自定义命令和目标(可选)
- 添加自定义命令:
add_custom_command(OUTPUT generated.cppCOMMAND python generate.py > generated.cppDEPENDS generate.py
)
- 添加自定义目标:
add_custom_target(GenerateCode ALL DEPENDS generated.cpp)
- 使用变量和条件(动态配置)
- 条件语句:
if(CMAKE_BUILD_TYPE STREQUAL "Debug")message("Debug build")
endif()
- 变量替换:
set(VERSION "1.0.0")
message("Project version: ${VERSION}")
示例1:单模块(c++)
项目结构
MyProject/
├── CMakeLists.txt
├── src/
│ ├── main.cpp
│ ├── foo.cpp
├── include/
│ └── foo.h
└── config/└── settings.conf
代码文件
src/main.cpp
:
#include <iostream>
#include "foo.h"int main() {std::cout << "Sum of 3 and 5 is: " << add(3, 5) << std::endl;return 0;
}
src/foo.cpp
:
#include "foo.h"int add(int a, int b) {return a + b;
}
include/foo.h
:
#ifndef FOO_H
#define FOO_Hint add(int a, int b);#endif
config/settings.conf
:
# This is a placeholder configuration file
CMakelist.txt
# 设置 CMake 最低版本
cmake_minimum_required(VERSION 3.10)# 定义项目名称和语言
project(MyProject LANGUAGES CXX)# 设置编译选项
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 定义源文件和头文件目录
set(SOURCESsrc/main.cppsrc/foo.cpp
)set(INCLUDESinclude/
)# 添加可执行目标
add_executable(MyApp ${SOURCES})# 配置头文件路径
target_include_directories(MyApp PRIVATE ${INCLUDES})# 安装规则
install(TARGETS MyApp DESTINATION bin)
install(FILES config/settings.conf DESTINATION etc)# 启用测试支持
enable_testing()
add_test(NAME RunTests COMMAND MyApp)
构建和运行
1. 创建构建目录
为了保持源文件清晰,推荐在源代码目录外创建构建目录:
mkdir build
cd build
2. 运行 CMake
使用 CMake 生成构建文件:
cmake ..
3. 编译项目
使用 CMake 的构建命令:
cmake --build .
4. 运行程序
./MyApp
5. 安装程序
将可执行文件和配置文件安装到指定目录:
cmake --install .
示例2:多模块(c++)
项目结构
MyProject/
├── CMakeLists.txt # 顶层 CMakeLists.txt
├── module1/ # 模块1
│ ├── CMakeLists.txt # 模块1的 CMakeLists.txt
│ ├── module1.cpp
│ └── module1.h
├── module2/ # 模块2
│ ├── CMakeLists.txt # 模块2的 CMakeLists.txt
│ ├── module2.cpp
│ └── module2.h
├── app/ # 主程序
│ ├── CMakeLists.txt # 主程序的 CMakeLists.txt
│ ├── main.cpp
└── build/ # 构建目录
顶层 CMakeLists.txt
顶层的 CMakeLists.txt
文件负责整体项目的配置,包括引入各个模块、设置编译选项以及定义最终的构建目标。
# 设置最低 CMake 版本
cmake_minimum_required(VERSION 3.10)# 定义项目名称和语言
project(MyProject LANGUAGES CXX)# 设置编译选项
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 添加子模块目录
add_subdirectory(module1)
add_subdirectory(module2)
add_subdirectory(app)
模块1的 CMakeLists.txt
模块1构建为一个静态库,提供对其他模块的功能支持。
# 定义模块1的库
add_library(Module1 STATIC module1.cpp)# 指定模块1的头文件路径
target_include_directories(Module1 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})# 可选:设置特定的编译选项(如果模块需要)
target_compile_options(Module1 PRIVATE -Wall -Wextra)
模块2的 CMakeLists.txt
模块2构建为一个动态库,并依赖模块1。
# 定义模块2的库
add_library(Module2 SHARED module2.cpp)# 指定模块2的头文件路径
target_include_directories(Module2 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})# 链接模块1
target_link_libraries(Module2 PUBLIC Module1)
主程序的 CMakeLists.txt
主程序依赖模块1和模块2,并最终生成可执行文件。
# 定义主程序的可执行目标
add_executable(MyApp main.cpp)# 链接模块1和模块2
target_link_libraries(MyApp PRIVATE Module1 Module2)# 指定主程序的头文件路径(如果需要)
target_include_directories(MyApp PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
示例代码
- module1/module1.h
#ifndef MODULE1_H
#define MODULE1_Hint add(int a, int b);#endif
- module1/module1.cpp
#include "module1.h"int add(int a, int b) {return a + b;
}
- module2/module2.h
#ifndef MODULE2_H
#define MODULE2_Hint multiply(int a, int b);#endif
- module2/module2.cpp
#include "module2.h"
#include "module1.h"int multiply(int a, int b) {return a * add(a, b); // 使用模块1的功能
}
- app/main.cpp
#include <iostream>
#include "module1.h"
#include "module2.h"int main() {int a = 3, b = 5;std::cout << "Add: " << add(a, b) << std::endl;std::cout << "Multiply: " << multiply(a, b) << std::endl;return 0;
}
功能扩展
-
模块化管理: 将子模块组织到不同目录,并通过
add_subdirectory()
引入。 -
外部库集成: 使用
find_package()
和target_link_libraries()
管理外部库。 -
生成静态库: 使用
add_library()
定义静态库目标,并链接到其他可执行文件。 -
跨平台支持: CMake 支持跨平台构建(如 Makefile、Visual Studio 项目文件等)。
相关文章:
c++ CMakeLists.txt详解
基本结构 CMake 最低版本声明 用于指定需要的最低 CMake 版本,确保兼容性。 cmake_minimum_required(VERSION 3.10)指定 CMake 的最低版本。确保用户的 CMake 版本符合项目需求,否则报错。版本选择建议根据项目使用的功能决定。例如,3.10 引…...
树状数组详解
概述 树状数组(Binary Indexed Tree,简称BIT),是一种数据结构,用于处理区间查询和更新问题。它是一种可以高效地在对数级别时间复杂度内进行单点更新和区间查询的数据结构。树状数组通常用于解决以下两类问题…...
photoshop的2个形状-箭头
有时候用ps画一些教程类图文,需要用到箭头. 另外自己画了一个镂空的长方形和正方形 形状的路径一般在Custom Shapes文件夹内 例如 E:\photoshopCS4\Adobe Photoshop CS4\Presets\Custom Shapes...
docker 部署 redis
docker 部署 redis 1. 下载 redis 镜像 # docker images | grep redis bitnami/redis 7.2.4-debian-11-r5 45de196aef7e 10 months ago 95.2MB2. docker-compose 部署 version: "3" services:redis:image: bitnami/redis:7.2.4-debian-11-…...
如何持续优化呼叫中心大模型呼入机器人的性能?
如何持续优化呼叫中心大模型呼入机器人的性能? 原作者:开源呼叫中心FreeIPCC,其Github:https://github.com/lihaiya/freeipcc 持续优化呼叫中心大模型呼入机器人的性能是一个复杂而细致的过程,它涉及到数据、模型结构…...
【01】mysql安装后MySQL Configurator无法启动的问题
安装完Mysql之后打开MySql Configurator提示MySQL Configurator Internal error.(值不能为null.参数名:input) The Configurator will now close. mysql安装后MySQL Configurator无法启动的问题 文章目录 mysql安装后MySQL Configurator无法启动的问题1.MySQL Configurator无法…...
基于单片机的血氧心率检测与报警系统(论文+源码)
1系统的功能及方案设计 本次课题为基于单片机的血氧心率检测与报警系统研制,在此设计了如图2.1所示的系统结构框图,整个系统包括了MAX30102心率血氧检测模块,DS18B20体温检测模块,液晶显示模块,按键以及主控制器stm32…...
科技潮头浪接天,一桥飞架两界连。EthernetIP转Profinet互译连
本案例介绍的是西门子1200PLC通过稳联技术PROFINET转EtherNetIP网关(WL-ABC2006)连接HCS-6100系统配置案例。 打开稳联技术Ethernetip转profient网关(WL-ABC2006)配置软件,因为网关作为EtherNetIP从站,所以选择PN2EIP。设置网关Pr…...
day11 性能测试(4)——Jmeter使用(黑马的完结,课程不全)直连数据库+逻辑控制器+定时器
【没有所谓的运气🍬,只有绝对的努力✊】 目录 1、复习 1.1 断言(3种) 1.2 关联(3种) 1.3 录制脚本 2、Jmeter直连数据库 2.1 直连数据库——使用场景 2.2 直连数据库——操作步骤 2.2.1 案例1&…...
如何使用 Python 读取文本文件?
在Python编程中,读取文本文件是一项基本且重要的操作。 无论是处理日志文件、配置文件,还是进行数据分析,都需要用到这一技能。 下面,我将详细介绍如何使用Python读取文本文件,并提供一些实际开发中的建议和注意事项…...
11. qml ShaderEffect实现阴影效果
目录 MDropShadow.qml使用 MDropShadow.qml 基于上一章所制作的MGaussianBlur.qml 开发 MDropShadow阴影效果 import QtQuick 2.12Item {id: controlproperty var source;property real radius: 4property bool cached: falseproperty int offsetX: 0property int offsetY: 0…...
故障013:易忘的NULL表达式
故障013:易忘的NULL表达式 一、问题引入二、探索之路2.1 数据准备2.2 回顾NULL表达式2.3 重现问题2.3.1 分析原因2.3.2 如何化解预期? 三、知识总结 一、问题引入 某单位开发人员理直气壮抛出一张截图,以红色醒目地标记问题,好似…...
基于nginx和ffmpeg搭建HTTP FLV流媒体服务器
一、简介 整体是使用nginx搭建HTTP FLV流媒体服务器: 流程:音视频->rtmp->http-flv 音视频转为rtmp需要借助ffmpeg转化。 rtmp转为http-flv需要借助nginx转化。 nginx-http-flv-module是基于nginx-rtmp-module开发的,包含nginx-rt…...
【人工智能】用Python构建高效的自动化数据标注工具:从理论到实现
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 数据标注是构建高质量机器学习模型的关键环节,但其耗时耗力常成为制约因素。本篇文章将介绍如何用Python构建一个自动化数据标注工具,结合机器学习和NLP技术,…...
MVC基础——市场管理系统(四)
文章目录 项目地址六、EF CORE6.1 配置ef core环境6.2 code first6.2.1 创建Database context1. 添加navigation property2. 添加MarketContext上下文七、Authentication7.1 添加Identity7.2 Run DB migration for Identity7.3 使用Identity7.3.1 设置认证中间件7.3.2 设置权限…...
多模块应用、发布使用第三方库(持续更新中)
目录: 1、多模块概述(HAP、HSP、HAR) HAR与HSP两种共享包的主要区别体现在: 2、三类模块: 3、创建项目:项目名:meituan (1)创建Ability类型的Module,编译后为HAP文件…...
MVP模式的理解和实践
MVP(Model-View-Presenter)模式是一种用于组织代码的架构模式,主要用于用户界面的开发。它通过将应用程序的三个主要组件分开,提高了应用的可维护性和可测试性。本文将详细介绍MVP模式的理解和实践,并通过Java语言提供…...
开启第二阶段---蓝桥杯
一、12.10--数据类型的范围及转化 今天是刚开始,一天一道题 对于这道题我想要记录的是Java中的整数默认是 int 类型,如果数值超出了 int 的范围,就会发生溢出错误。为了避免这个问题,可以将数字表示为 long 类型,方法…...
Linux 网络流量控制 - 实现概述
摘要 Linux 提供了一整套丰富的流量控制(traffic control)功能。本文档概述了相应的内核代码设计,描述了其结构,并通过描述一种新的排队策略来说明新元素的添加。 1 引言 最近的Linux内核提供了多种流量控制功能。Alexey Kuznetsov(kuznet…...
分布式 Raft算法 总结
前言 相关系列 《分布式 & 目录》《分布式 & Raft算法 & 总结》《分布式 & Raft算法 & 问题》 参考文献 《Raft一致性算法论文译文》《深入剖析共识性算法 Raft》 简介 Raft 木筏是一种基于日志复制实现的分布式容错&一致性算法。在Raft算法…...
【前端面试题】变量提升、闭包、promise
飞书面试 题目1: async function foo() {console.log(foo start);await bar();console.log(foo end); }async function bar() {console.log(bar start);return new Promise((resolve, reject) > {setTimeout(() > {console.log(bar promise);resolve();}, 1…...
UE5安装Fab插件
今天才知道原来Fab也有类似Quixel Bridge的插件,于是立马就安装上了,这里分享一下安装方法 在Epic客户端 - 库 - Fab Library 搜索 Fab 即可安装Fab插件 然后重启引擎,在插件面板勾选即可 然后在窗口这就有了 引擎左下角也会多出一个Fab图标…...
数据分析思维(一):业务指标(数据分析并非只是简单三板斧)
个人认为,数据分析并非只是简单的数据分析工具三板斧——Excel、SQL、Python,更重要的是数据分析思维。没有数据分析思维和业务知识,就算拿到一堆数据,也不知道如何下手。 推荐书本《数据分析思维——分析方法和业务知识》&#x…...
linux下socket本地套接字通讯
使用套接字除了可以实现网络间不同主机间的通信外,还可以实现同一主机的不同进程间的通信,且建立的通信是双向的通信。socket进程通信与网络通信使用的是统一套接口,只是地址结构与某些参数不同。 用途 进程间通信:本地套…...
vmcore和kdump
在Linux系统中,vmcore是指内核崩溃时生成的内存转储文件。这个文件包含了系统崩溃时的内存状态,可以用于分析和诊断内核崩溃的原因。分析vmcore文件通常需要使用专门的工具和方法。以下是关于vmcore的一些关键点: 生成vmcore Kdump…...
[线段树] 回转寿司
题目描述 酷爱日料的小 Z Z Z 经常光顾学校东门外的回转寿司店。在这里,一盘盘寿司通过传送带依次呈现在小Z眼前。 不同的寿司带给小Z的味觉感受是不一样的,我们定义小 Z Z Z 对每盘寿司都有一个满意度。 例如小 Z Z Z 酷爱三文鱼,他对…...
RobotFrameWork详解-RF框架脚本测试集成
Robot Framework是一款python编写的功能自动化测试框架。具备良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可以进行分布式测试执行。主要用于轮次很多的验收测试和验收测试驱动开发(ATDD)。 之前讲过很多RF框架的内…...
【操作系统】实验八:添加/proc文件系统
实验八 添加/proc文件系统 8.1 实验目的 通过加载内核模块,为/proc文件系统创建以下内容: 一个名叫proc_test的子目录。 一个名叫current的文件,只读,读出的内容是读它的进程的情况。 一个名叫current_too的链接,…...
操作系统(8)死锁
一、概念 死锁是指在一个进程集合中的每个进程都在等待只能由该集合中的其他进程才能引起的事件,而无限期地僵持下去的局面。在多任务环境中,由于资源分配不当,导致两个或多个进程在等待对方释放资源时陷入无限等待的状态,这就是死…...
3D 生成重建039-Edify 3D:Nvidia的3D生成大模型
3D 生成重建039-Edify 3D:Nvidia的3D生成大模型 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 文档介绍了Edify 3D,一种为高质量的3D资产生成而设计的高级解决方案。首先在多个视点上合成了所描述对象的RGB和表面法线图像正在使用扩散模型。然后使用多视图…...
vue绕过rules自定义编写动态校验
今天犯了个低级错误,虽然走了很多弯路,但这个过程还是值得记录一下 例子如下,有两个输入框: 第一个是套餐选择下拉框,可以下拉选择三个内容 第二个要根据上面的套餐选择三个选项来决定怎么显示,使用v-if&…...
.NET中的JSON序列化库:Newtonsoft.Json与System.Text.Json对比与示例
在.NET生态系统中,存在多个用于JSON序列化的库,其中最为常用和知名的包括Newtonsoft.Json(也称为Json.NET)和System.Text.Json。以下是这两个库的区别: Newtonsoft.Json(Json.NET) 功能与灵活…...
Electron-Vite 项目搭建(Vue)
前提条件 Node.js: 确保已安装 Node.js 版本 18 或更高版本 (推荐使用最新稳定版)。Vite: 确保 Vite 版本为 4.0 或以上。包管理工具: 推荐使用 pnpm,但也可以使用 npm 或 yarn。 安装 Electron-Vite 首先,在项目中安装 electron-vite 作为开发依赖&a…...
Elasticsearch Java Api Client中DSL语句的查询方法汇总
说明:示例代码依赖的是co.elastic.clients:elasticsearch-java:8.16.1。 1、termQuery 方法 用途:用于精确匹配某个字段的完全相等的值。这在查询如文档的 ID、状态码等具有明确取值的字段时非常有用。参数说明: field:这是一个…...
Linux之远程登录
一、使用ssh命令登录 winR打开cmd输入命令 # root是命令,192.168.101.200是地址 ssh root192.168.101.200是否要保存密码,就是yes以后可以免密登录,这里就yes了 输入密码,就登录成功了 操作完成之后,输入命令退出 e…...
医学图像分割数据集腹部肝脏多器官图像分割数据集labelme格式860张10类别
数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数):860 标注数量(json文件个数):860 标注类别数:10 标注类别名称:["liver","stomach","o…...
Xerces-C,一个成熟的 C++ XML 解析库!
嗨,大家好!我是一行。今天咱们来探索 Xerces-C,它可是 C里超棒的 XML 解析库哦!能帮咱轻松处理 XML 数据,在很多数据交互、配置文件读取场景都超实用,快来一起学习使用它的妙招吧。 一、Xerces-C 是什么&am…...
go语言中context的用法
0 概述 Context 是 Go 语言中非常重要的一个概念,它主要用于跨多个函数或 goroutine 传递 取消信号、超时控制、截止时间 和 请求范围数据。在并发编程中,Context 提供了更好的控制和管理,尤其是当你需要在多个 goroutine 之间传递状态或进行…...
UE5编辑器下将RenderTarget输出为UTexture并保存
在使用UE5开发项目时,RenderTarget是一种非常强大的工具,常用于生成实时纹理效果、后处理和调试。而将RenderTarget的内容转换为UTexture并储存,是许多编辑器内的需求都需要的功能。 1.材质球输出至Texture 首先创建一个Actor类,…...
探秘 AI Agent 之 Coze 智能体:从简介到搭建全攻略(4/30)
一、Coze 智能体概述 (一)Coze 智能体是什么 Coze 智能体是基于机器学习和自然语言处理技术的软件实体,它在人工智能领域扮演着重要的角色,能够像一个智能助手一样,通过与外界环境进行交互学习,进而执行各…...
解决navicat 导出excel数字为科学计数法问题
一、原因分析 用程序导出的csv文件,当字段中有比较长的数字字段存在时,在用excel软件查看csv文件时就会变成科学技术法的表现形式。 其实这个问题跟用什么语言导出csv文件没有关系。Excel显示数字时,如果数字大于12位,它会自动转化…...
蓝桥杯刷题——day4
蓝桥杯刷题——day4 题目一题干题目解析代码 题目二题干题目解析代码 题目一 题干 小蓝和朋友们在玩一个报数游戏。由于今年是2024 年,他们决定要从小到大轮流报出是20或24倍数的正整数。前10个被报出的数是:20,24,40,48,60,72,80,96,100,120。请问第2…...
【AI日记】24.12.13 kaggle 比赛 2-3 大扫除、断舍离、自己做饭
【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 参加:kaggle 比赛 Regression with an Insurance Dataset参考:kaggle 回归类入门比赛 House Prices - Advanced Regression Techniques内容:构建自己的EDA(…...
http 和 https 的区别?
HTTP (HyperText Transfer Protocol) 和 HTTPS (HyperText Transfer Protocol Secure) 是两种用于在 Web 浏览器和网站服务器之间传输网页的协议,它们的主要区别在于安全性。以下是 HTTP 和 HTTPS 的一些关键区别: 安全性: HTTP:H…...
Mysql数据库中,什么情况下设置了索引但无法使用?
在MySQL数据库中,即使已经正确设置了索引,但在某些情况下索引可能无法被使用。 以下是一些常见的情况: 1. 数据分布不均匀 当某个列的数据分布非常不均匀时,索引可能无法有效地过滤掉大部分的数据,导致索引失效。 …...
[Unity] AppLovin Max接入Native 广告 Android篇
把下载下来的maxnativelibrary-release-文件放在Plugins/Android下 将这一行加入到mainTemplate.gradle文件中 implementation androidx.constraintlayout:constraintlayout:2.1.4添加下面的两个脚本 using System; using System.Collections; using System.Collections.Gener…...
青少年夏令营管理系统的设计与开发(社团)+开题报告(springboot+freemarker)
💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…...
JSSIP的使用及问题(webRTC,WebSockets)
简介 项目中有一个需要拨打电话的功能,要求实时的进行音频接听,并且可以在电话接听或者挂断等情况下做出相应的操作。jssip作为一个强大的实现实时通信的javascript库,这不门当户对了嘛。 jssip(官网: JsSIP - the J…...
13.继承和多态的实例 C#
这是一个动物园的动物发出不同的声音,使用了继承和多态 using System; using System.Collections.Generic;namespace InheritanceAndPolymorphismExample {//一个动物类,包含属性:名称。包含方法:发出叫声public class Animal{pub…...
Vue3之入门介绍
Vue 3是一种用于构建用户界面的渐进式JavaScript框架。它主要用于创建单页应用(SPA),具备响应式数据绑定、组件化开发、虚拟DOM等核心特性,使得开发者能够高效地构建复杂的前端应用。Vue 3相比于之前的版本,进行了大量的性能优化和功能改进&a…...