SpringCloud - Nacos注册/配置中心
前言
该博客为Nacos学习笔记,主要目的是为了帮助后期快速复习使用
学习视频:7小快速通关SpringCloud
辅助文档:SpringCloud快速通关
源码地址:cloud-demo
一、简介
Nacos官网:https://nacos.io/docs/next/quickstart/quick-start/
Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

二、安装
2.1 Windows本地安装:
- 点击下载
- 找到对应版本的二进制下载
- 将压缩包解压到非中文无空格的目录
- 找到并进入
bin目录,在地址栏输入cmd,打开黑窗口 - 输入
startup.cmd -m standalone启动,看到logo即启动成功【注意:黑窗口不能关闭】 - 在浏览器输入
http://localhost:8848/nacos/



2.2 Docker安装【推荐】
docker run -d -p 8848:8848 -p 9848:9848 -e MODE=standalone --name nacos nacos/nacos-server:v2.4.3
三、注册中心
3.1 整合配置
3.1.1 依赖引入
<!-- web场景 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><!-- 服务发现Nacos -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
3.1.2 编写yml配置文件
# 服务端口
server:port: 8000spring:application:name: service-order # 服务名称cloud:nacos:server-addr: 127.0.0.1:8848 # nacos地址(默认)
3.1.3 编写主程序
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class OrderMainApplication {public static void main(String[] args) {SpringApplication.run(OrderMainApplication.class, args);}
}
3.1.4 运行主程序,查看注册中心效果
运行成功,可以在服务列表中查看到

3.2 单机模拟集群启动
- 点击
服务 - 找到
OrderMainApplication,右键,点击复制配置


- 点击
修改选项,将程序参数勾选上

- 重新指定运行端口
--+ 配置,修改完成点击确定
--server.port=8001

- 右键
运行,查看Nacos服务列表


3.3 服务发现
3.3.1 开启服务发现功能
在主程序上加上@EnableDiscoveryClient , 启用服务注册发现功能
3.3.2编写测试用例
3.3.2.1 依赖引入
<!-- 测试场景 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>
3.3.2.2 使用DiscoveryClient测试服务发现API
@SpringBootTest
public class DiscoveryTest {@Autowiredprivate DiscoveryClient discoveryClient; // 服务发现客户端@Testvoid discoveryClientTest() {for (String service : discoveryClient.getServices()) {System.out.println("service = " + service);// 获取服务实例 ip + portList<ServiceInstance> instances = discoveryClient.getInstances(service);for (ServiceInstance instance : instances) {System.out.println("ip:"+instance.getHost()+";"+"port = " + instance.getPort());}}}
}

3.3.2.3 使用NacosServiceDiscovery测试服务发现API
@SpringBootTest
public class DiscoveryTest {@Autowiredprivate NacosServiceDiscovery nacosServiceDiscovery; // nacos服务发现客户端@Testvoid nacosServiceDiscoveryTest() throws NacosException {for (String service : nacosServiceDiscovery.getServices()) {System.out.println("service = " + service);List<ServiceInstance> instances = nacosServiceDiscovery.getInstances(service);for (ServiceInstance instance : instances) {System.out.println("ip:"+instance.getHost()+";"+"port = " + instance.getPort());}}}
}
DiscoveryClient和NacosServiceDiscovery区别:
- 抽象层次:
- DiscoveryClient 是一个通用接口,位于抽象层,不依赖于具体的服务注册中心。
- NacosServiceDiscovery 是 DiscoveryClient 的具体实现,依赖于 Nacos。
- 功能实现:
- DiscoveryClient 定义了服务发现的基本行为,但具体实现由各个服务注册中心提供。
- NacosServiceDiscovery 提供了对 Nacos 的具体实现,包括与 Nacos 服务器的通信逻辑。
- 使用方式:
- 在 Spring Cloud 应用程序中,通常通过
@EnableDiscoveryClient注解启用服务发现功能,底层会自动选择合适的 DiscoveryClient 实现。- 如果使用 Nacos 作为服务注册中心,NacosServiceDiscovery 会被自动配置为 DiscoveryClient 的实现。
3.4 远程调用
3.4.1 服务之间调用的基本流程
以订单服务调用商品服务为例:
- 订单服务向注册中心获取商品服务可访问地址列表
- 注册中返回商品服务地址列表
- 订单服务从地址列表中选择一个地址
- 订单服务向选中的商品服务地址发送请求
- 商品服务处理请求并返回数据
- 订单服务接收商品服务返回的数据

在上一篇博客中详细讲解:RestTemplate快速入门
3.5 负载均衡
3.5.1 依赖引入
<!--loadbalancer-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
3.5.2 使用LoadBalancerClient开启负载均衡
3.5.2.1 测试
@SpringBootTest
public class LoadBalancerTest {@AutowiredLoadBalancerClient loadBalancerClient;@Testpublic void test() {ServiceInstance choose = loadBalancerClient.choose("service-product");System.out.println(choose.getHost() + ":" + choose.getPort());choose = loadBalancerClient.choose("service-product");System.out.println(choose.getHost() + ":" + choose.getPort());choose = loadBalancerClient.choose("service-product");System.out.println(choose.getHost() + ":" + choose.getPort());choose = loadBalancerClient.choose("service-product");System.out.println(choose.getHost() + ":" + choose.getPort());}
}

3.5.2.2 使用示例
定义远程调用客户端RestTemplateBean对象
@Configuration
public class OrderConfig {@Bean@LoadBalanced //注解式负载均衡public RestTemplate restTemplate() {return new RestTemplate();}
}
假设有一个服务名为service-product,通过RestTemplate调用其/product接口的代码如下
// 注入LoadBalancerClient对象
@Autowired
private LoadBalancerClient loadBalancerClient;// 负载均衡发送请求
private Product getProductFromRemoteWithLoadBalancer(Long productId) {// 1. 获取到商品服务所在的所有机器IP + portServiceInstance choose = loadBalancerClient.choose("service-product");// 2. 根据IP + port调用商品服务String url = "http://" + choose.getHost() + ":" + choose.getPort() + "/product/" + productId;log.info("调用商品服务: {}", url);// 调用商品服务return restTemplate.getForObject(url, Product.class);}
3.5.3 使用@LoadBalanced注解开启负载均衡
3.5.3.1 使用示例
在远程调用客户端RestTemplate的Bean对象上,加上@LoadBalanced注解,开启负载均衡
@Configuration
public class OrderConfig {@Bean@LoadBalanced //注解式负载均衡public RestTemplate restTemplate() {return new RestTemplate();}
}
假设有一个服务名为service-product,通过RestTemplate调用其/product接口的代码如下
// 基于注解的负载均衡发送请求
private Product getProductFromRemoteWithLoadBalancerAnnotation(Long productId) {String url = "http://service-product/product/" + productId;// 调用商品服务,service-product为服务名称, 会被动态替换return restTemplate.getForObject(url, Product.class);}
3.5.3.2 调用过程解析
当RestTemplate通过@LoadBalanced注解被标记为负载均衡客户端时,它会与服务发现机制集成。在调用http://service-product/product/时,
- RestTemplate会首先向服务注册中心查询
service-product服务的所有可用实例。 - 服务注册中心会返回一个实例列表
- RestTemplate会根据配置的负载均衡策略(如轮询、随机等)从这些实例中选择一个进行调用
3.5.3.3 深入探索
经典面试题:如果注册中心宕机,远程调用是否可以成功?
- 从未调用过,如果宕机,调用会立即失败
- 调用过,如果宕机,因为会缓存名单,调用会成功
- 调用过,如果注册中心和对方服务宕机,因为会缓存名单,调用会阻塞后失败(Connection Refused)

四、配置中心
4.1 整合配置
4.1.1 依赖引入
<!-- 配置中心 -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
4.1.2 编写yml配置文件
spring:cloud:nacos:server-addr: 127.0.0.1:8848 # nacos地址(默认)config:import: nacos:service-order.properties
4.1.3 配置集-dataId
在浏览器中的Nacos可视化平台,找到配置管理,点击配置列表,新建一个配置
注意:Data ID 要和 yml配置文件 中的完全一致

注意:
当我们在项目引入了Nacos的配置中心的依赖,在项目启动前没导入任何的配置,就会报如下错误:
17:28:47.552 [main] ERROR org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter -- ***************************
APPLICATION FAILED TO START
***************************Description:No spring.config.import property has been definedAction:Add a spring.config.import=nacos: property to your configuration.If configuration is not required add spring.config.import=optional:nacos: instead.To disable this check, set spring.cloud.nacos.config.import-check.enabled=false.
解决方法
- 添加可选配置
# properties文件
spring.config.import=optional:nacos: # 可选
- 在yml配置中禁用导入检查
spring:cloud:nacos:config:import-check:enabled: false # 禁用配置检查
4.2 动态刷新
4.2.1 @RefreshScope
@RefreshScope -> 激活配置中心的自动刷新功能
@RestController
@RequiredArgsConstructor
@RefreshScope//自动刷新
public class OrderController {private final OrderService orderService;@Value("${order.timeout}")String orderTimeout;@Value("${order.timeout}")String orderAutoConfirm;@GetMapping("/config")public String getConfig() {return "timeout:" + orderTimeout + ",autoConfirm:" + orderAutoConfirm;}
}
启动项目,可见如下日志
2025-02-07T17:11:12.391+08:00 INFO 8056 --- [service-order] [ main] c.a.c.n.c.NacosConfigDataLoader : [Nacos Config] Load config[dataId=service-order.properties, group=DEFAULT_GROUP] success
2025-02-07T17:11:13.761+08:00 INFO 8056 --- [service-order] [ main] c.a.c.n.refresh.NacosContextRefresher : [Nacos Config] Listening config: dataId=service-order.properties, group=DEFAULT_GROUP
在浏览器输入http://localhost:8000/config,即可得到配置内容,在配置中心修改也可同步修改

4.2.2 @ConfigurationProperties
在配置文件中的属性较多的时候,使用@Value注解就显得有点繁琐。可以使用 @ConfigurationProperties 进行批量属性绑定,并且无需 @RefreshScope ,自动绑定配置,动态更新
抽取配置类,参考代码如下:
@Component
@ConfigurationProperties(prefix = "order") //配置批量绑定在nacos下,可以无需@RefreshScope就能实现自动刷新
@Data
public class OrderProperties {String timeout;String autoConfirm;String dbUrl;
}
@RestController
@RequiredArgsConstructor
public class OrderController {private final OrderProperties orderProperties; //注入订单配置类@GetMapping("/config")public String getConfig() {return "timeout:" + orderProperties.getTimeout() + ",autoConfirm:" + orderProperties.getAutoConfirm();}}
4.3 手动编写代码监听配置变化
/*** 创建并配置ApplicationRunner bean* 该bean在应用启动后,执行指定的操作,这里用于监听Nacos配置变化** @param manager NacosConfigManager实例,用于与Nacos配置服务交互* @return ApplicationRunner实例,用于执行应用启动后的操作*/@BeanApplicationRunner applicationRunner(NacosConfigManager manager){return args -> {// 获取Nacos配置服务实例ConfigService configService = manager.getConfigService();// 为特定的配置文件添加监听器// 这里监听"service-order.properties"配置文件的变化configService.addListener("service-order.properties", "DEFAULT_GROUP", new Listener() {/*** 返回一个固定大小的线程池,用于异步处理配置变更** @return Executor实例,用于异步执行任务*/@Overridepublic Executor getExecutor() {// 创建一个包含4个线程的固定大小线程池return Executors.newFixedThreadPool(4);}/*** 当监听的配置信息发生变化时,该方法被调用** @param configInfo 变更后的配置信息*/@Overridepublic void receiveConfigInfo(String configInfo) {// 打印变更后的配置信息System.out.println("configInfo = " + configInfo);}});};}
思考:Nacos中的数据集 和 application.properties 有相同的 配置项,哪个生效?
参考答案:Nacos中的数据集的优先级高于本地application.properties,因此Nacos中的数据集的会生效。遵循先导入优先,外部优先,高优先级的配置会覆盖低优先级相同的配置。

4.4 数据隔离
4.4.1 namespace
**命名空间:**实现多环境隔离,如:开发、测试、预发、生产等
创建方式如下图:

4.4.2 dataId
**数据集id:**就是以前配置文件的名字。完整写法:名字.后缀 如:common.properties
4.4.3 groupId
**分组id:**一般可以用微服务的名字作为自己的组。
创建方式如下图:

点击创建配置后,填写配置信息



4.4.4 推荐用法
namespace【命名空间】、dataId【数据集】、group【组】配合 spring.config.activate.on-profile实现配置环境隔离

“通俗易懂”:多个命名空间,每个命名空间下有多个组,每个组就是一个微服务,每个微服务下又有多个配置文件即数据集,每个配置文件下又有多个配置项
4.4.4 按需加载
# 服务端口
server:port: 8000spring:profiles:active: dev # 指定环境application:name: service-order # 服务名称cloud:nacos:server-addr: 127.0.0.1:8848 # nacos地址(默认)config:import-check:enabled: false # 禁用配置检查 -> 记得开启不然会报错namespace: ${spring.profiles.active:public} # 指定命名空间 -> 采用 spring.profiles.active的值,默认为public---
spring:config:import:- nacos:common.properties?group=order # 配置文件地址 group->指定组名- nacos:database.properties?group=orderactivate:on-profile: dev # 指定dev环境启用---
spring:config:import:- nacos:common.properties?group=order # 配置文件地址 group->指定组名- nacos:database.properties?group=order- nacos:haha.properties?group=orderactivate:on-profile: test # 指定test环境启用---
spring:config:import:- nacos:common.properties?group=order # 配置文件地址 group->指定组名- nacos:database.properties?group=order- nacos:hehe.properties?group=orderactivate:on-profile: prod # 指定prod环境启用
总结

相关文章:
SpringCloud - Nacos注册/配置中心
前言 该博客为Nacos学习笔记,主要目的是为了帮助后期快速复习使用 学习视频:7小快速通关SpringCloud 辅助文档:SpringCloud快速通关 源码地址:cloud-demo 一、简介 Nacos官网:https://nacos.io/docs/next/quickstar…...
C++ 继承(1)
1.继承概念 我们平时有时候在写多个有内容重复的类的时候会很麻烦 比如我要写Student Teacher Staff 这三个类 里面都要包含 sex name age成员变量 唯一不同的可能有一个成员变量 但是这三个成员变量我要写三遍 太麻烦了 有没有好的方式呢? 有的 就是继承…...
【C语言】传值调用与传址调用详解
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 💯前言💯传值调用1. 什么是传值调用?2. 示例代码:传值调用失败的情况执行结果: 3. 为什么传值调用无法修改外部变量? Ǵ…...
蓝桥杯C语言组:图论问题
蓝桥杯C语言组图论问题研究 摘要 图论是计算机科学中的一个重要分支,在蓝桥杯C语言组竞赛中,图论问题频繁出现,对参赛选手的算法设计和编程能力提出了较高要求。本文系统地介绍了图论的基本概念、常见算法及其在蓝桥杯C语言组中的应用&#…...
windows通过网络向Ubuntu发送文件/目录
由于最近要使用树莓派进行一些代码练习,但是好多东西都在windows里或虚拟机上,就想将文件传输到树莓派上,但试了发现u盘不能简单传送,就在网络上找到了通过windows 的scp命令传送 前提是树莓派先开启ssh服务,且Window…...
Unity抖音云启动测试:如何用cmd命令行启动exe
相关资料:弹幕云启动(原“玩法云启动能力”)_直播小玩法_抖音开放平台 1,操作方法 在做云启动的时候,接完发现需要命令行模拟云环境测试启动,所以研究了下。 首先进入cmd命令,CD进入对应包的文件…...
ZU47DR 100G光纤 高性能板卡
简介 2347DR是一款最大可提供8路ADC接收和8路DAC发射通道的高性能板卡。板卡选用高性价比的Xilinx的Zynq UltraScale RFSoC系列中XCZU47DR-FFVE1156作为处理芯片(管脚可以兼容XCZU48DR-FFVE1156,主要差别在有无FEC(信道纠错编解码࿰…...
【算法】动态规划专题⑥ —— 完全背包问题 python
目录 前置知识进入正题模板 前置知识 【算法】动态规划专题⑤ —— 0-1背包问题 滚动数组优化 完全背包问题是动态规划中的一种经典问题,它与0-1背包问题相似,但有一个关键的区别:在完全背包问题中,每种物品都有无限的数量可用。…...
MySQL——表操作及查询
一.表操作 MySQL的操作中,一些专用的词无论是大写还是小写都是可以通过的。 1.插入数据 INSERT [INTO] table_name (列名称…)VALUES (列数据…), (列数据…); "[]"表示可有可无,插入时,如果不指定要插入的列,则表示默…...
SAP-ABAP:ROLLBACK WORK使用详解
在SAP ABAP 中,ROLLBACK WORK 语句用于回滚当前事务(LUW,Logical Unit of Work),撤销自上次提交或回滚以来的所有数据库更改。它通常与 COMMIT WORK 配合使用,确保数据一致性。 关键点: 回滚作…...
C#中深度解析BinaryFormatter序列化生成的二进制文件
C#中深度解析BinaryFormatter序列化生成的二进制文件 BinaryFormatter序列化时,对象必须有 可序列化特性[Serializable] 一.新建窗体测试程序BinaryDeepAnalysisDemo,将默认的Form1重命名为FormBinaryDeepAnalysis 二.新建测试类Test Test.cs源程序如下: using System; us…...
Git提交错误解决:missing Change-Id in message footer
问题现象: 提交的commit中没有插入change id导致push代码失败。 问题解决: 针对该错误,Git已经给出了解决方案: 1、to automatically insert a Change-Id, install the hook: gitdir$(git rev-parse --git-dir); scp -p -P 2…...
51单片机之引脚图(详解)
8051单片机引脚分类与功能笔记 1. 电源引脚 VCC(第40脚):接入5V电源,为单片机提供工作电压。GND(第20脚):接地端,确保电路的电位参考点。 2.时钟引脚 XTAL1(第19脚&a…...
jupyterLab插件开发
jupyter lab安装、配置: jupyter lab安装、配置教程_容器里装jupyterlab-CSDN博客 『Linux笔记』服务器搭建神器JupyterLab_linux_布衣小张-腾讯云开发者社区 Jupyter Lab | 安装、配置、插件推荐、多用户使用教程-腾讯云开发者社区-腾讯云 jupyterLab插件开发教…...
配置#include “nlohmann/json.hpp“,用于处理json文件
#include “nlohmann/json.hpp” // 需要安装 nlohmann/json.hpp 头文件 using json = nlohmann::json; 下载链接:https://github.com/nlohmann/json/tree/develop 1.下载并解压:首先,需要从nlohmann/json的GitHub仓库下载源代码,并解压得到的文件。 地址: nlohmann/json…...
MATLAB | 基于Theil-Sen斜率和Mann-Kendall检验的栅格数据趋势分析
最近看到一些博主分享关于 SenMK 检验的代码,对于新手来说可能有点复杂。我们编写了一段 MATLAB 代码,能够一次性解决这些问题,简化操作流程。我们还准备了几个关于趋势检验的空间分布图,供大家参考。 一、Sens Slope和Mann-Kenda…...
python连点器
要实现一个用于抖音点赞的鼠标连点工具,可以通过编程或现有软件实现。以下是两种常见方法(但请注意:频繁自动化操作可能违反平台规则,需谨慎使用): 方法 1:使用现成工具(如 AutoClic…...
C#程式状态机及其Godot实践
前言 今天是周日,马上就要迎来新的一周了,前几周都没干什么事,为了减缓偷懒症状,立个Flag从今往后每周至少更新两次文章。内容虽然无法保证优质,但重在坚持,全当写周记了。希望不要三分钟热度吧。 今天记录…...
Windows 系统下使用 Ollama 离线部署 DeepSeek - R1 模型指南
引言 随着人工智能技术的飞速发展,各类大语言模型层出不穷。DeepSeek - R1 凭借其出色的语言理解和生成能力,受到了广泛关注。而 Ollama 作为一款便捷的模型管理和部署工具,能够帮助我们轻松地在本地环境中部署和使用模型。本文将详细介绍如…...
Docker、Ollama、Dify 及 DeepSeek 安装配置与搭建企业级本地私有化知识库实践
在现代企业中,管理和快速访问知识库是提升工作效率、促进创新的关键。为了满足这些需求,企业越来越倾向于构建本地私有化的知识库系统,这样可以更好地保护企业数据的安全性和隐私性。本文将介绍如何利用 **Docker**、**Ollama**、**Dify** 和…...
【漫话机器学习系列】087.常见的神经网络最优化算法(Common Optimizers Of Neural Nets)
常见的神经网络优化算法 1. 引言 在深度学习中,优化算法(Optimizers)用于更新神经网络的权重,以最小化损失函数(Loss Function)。一个高效的优化算法可以加速训练过程,并提高模型的性能和稳定…...
react-native fetch在具有http远程服务器后端的Android设备上抛出“Network request failed“错误
问题描述: 在具有http远程服务器后端的Android设备上,使用react-native fetch时抛出"Network request failed"错误。 回答: "Network request failed"错误通常表示在进行网络请求时出现了问题。可能的原因包括网络连接…...
【JVM详解四】执行引擎
一、概述 Java程序运行时,JVM会加载.class字节码文件,但是字节码并不能直接运行在操作系统之上,而JVM中的执行引擎就是负责将字节码转化为对应平台的机器码让CPU运行的组件。 执行引擎是JVM核心的组成部分之一。可以把JVM架构分成三部分&am…...
route 与 router 之间的差别
简述: router:主要用于处理一些动作, route:主要获得或处理一些数据,比如地址、参数等 例: videoInfo1.vue: <template><div class"video-info"><h3>二级组件…...
[vue3] Ref Reactive
【b站-【前端面试】Vue3 ref 与 reactive 区别】 Ref:Ref用于创建一个响应式的基本数据类型,比如数字、字符串等。它将普通的数据变成响应式数据,可以监听数据的变化。使用Ref时,我们可以通过.value来访问和修改数据的值。 Reac…...
SamWaf开源轻量级的网站应用防火墙(安装包),私有化部署,加密本地存储的数据,易于启动,并支持 Linux 和 Windows 64 位和 Arm64
一、SamWaf轻量级开源防火墙介绍 (文末提供下载) SamWaf网站防火墙是一款适用于小公司、工作室和个人网站的开源轻量级网站防火墙,完全私有化部署,数据加密且仅保存本地,一键启动,支持Linux,Wi…...
极客说|利用 Azure AI Agent Service 创建自定义 VS Code Chat participant
作者:卢建晖 - 微软高级云技术布道师 「极客说」 是一档专注 AI 时代开发者分享的专栏,我们邀请来自微软以及技术社区专家,带来最前沿的技术干货与实践经验。在这里,您将看到深度教程、最佳实践和创新解决方案。关注「极客说」&a…...
22.2、Apache安全分析与增强
目录 Apache Web安全分析与增强 - Apache Web概述Apache Web安全分析与增强 - Apache Web安全威胁Apache Web安全机制Apache Web安全增强 Apache Web安全分析与增强 - Apache Web概述 阿帕奇是一个用于搭建WEB服务器的应用程序,它是开源的,它的配置文件…...
理邦仪器嵌入式(C/C++开发)开发面试题及参考答案
C++ 虚函数的概念和作用 C++ 中的虚函数是一种非常重要的机制,它在实现多态性方面起着关键作用。 概念上来说,虚函数是在基类中使用关键字 virtual 声明的成员函数。当基类的指针或引用指向派生类的对象时,通过这个基类的指针或引用调用虚函数,实际执行的是派生类中重写的该…...
windows + visual studio 2019 使用cmake 编译构建静、动态库并调用详解
环境 windows visual studio 2019 visual studio 2019创建cmake工程 1. 静态库.lib 1.1 静态库编译生成 以下是我创建的cmake工程文件结构,只关注高亮文件夹部分 libout 存放编译生成的.lib文件libsrc 存放编译用的源代码和头文件CMakeLists.txt 此次编译CMak…...
