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

windows + visual studio 2019 使用cmake 编译构建静、动态库并调用详解

环境
windows + visual studio 2019
visual studio 2019创建cmake工程

1. 静态库.lib

1.1 静态库编译生成

以下是我创建的cmake工程文件结构,只关注高亮文件夹部分
在这里插入图片描述

  • libout 存放编译生成的.lib文件
  • libsrc 存放编译用的源代码和头文件
  • CMakeLists.txt 此次编译CMake项目的配置文件

接着我们看一下我们的代码, 代码注释很详细


libscr/add.h 头文件中声明了两个不同精度的求和函数

// #ifndef...  #define...   #endif... 防止头文件被重复调用的时候头文件中多次定义报错, 意思只定义一次
#ifndef ADD_H
#define ADD_Hint add(int, int);
double add(double, double);#endif

libscr/add.cpp 源文件是两个不同精度的求和函数的定义

// add.cpp
#include "add.h"// 重载 int 类型的加法
int add(int a, int b) {return a + b;
}// 重载 double 类型的加法
double add(double a, double b) {return a + b;
}

CMakeLists.txt

  • add_library()中 addlib 是生成的.lib名称;STATIC 指定的是生成库类型为静态库
  • set_target_properties 设置静态库存放路径为libout文件夹下
# CMakeList.txt: 顶层 CMake 项目文件,在此处执行全局配置
# 并包含子项目。
#
cmake_minimum_required (VERSION 3.8)
project ("libgen")
# 设置c++标准
set(CMAKE_CXX_STANDARD 11)# 生成静态库并指定静态库存放路径
add_library(addlib STATIC libsrc/add.cpp)
set_target_properties(addlib PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/libout)

全部重新生成,即可将编译的.lib文件生成到指定的文件夹下
在这里插入图片描述
在这里插入图片描述


1.2 静态库使用

同样只关注高亮文件夹部分
在这里插入图片描述

  • libinclude 存放头文件,直接从libscr 将头文件copy过来即可
  • libout 1.1中编译生成的.lib文件
  • libuse 调用lib的代码实现
  • CMakeLists.txt 此次编译执行的CMake项目的配置文件

libuse/main.cpp 调用静态库中的add求和函数实现

#include "add.h"
#include <iostream>int main() {int a = 3, b = 5;std::cout << "add(3.1, 4.1) = " << add(3.1, 4.1) << std::endl;std::cout << "add(3.1f, 4.1f) = " << add(3.1f, 4.1f) << std::endl;std::cout << "add(3, 4) = " << add(a, b) << std::endl;return 0;
}

CMakeLists.txt 注释说的非常清楚了,不在详说

# CMakeList.txt: 顶层 CMake 项目文件,在此处执行全局配置
# 并包含子项目。
#
cmake_minimum_required (VERSION 3.8)
project ("libgen")
# 设置c++标准
set(CMAKE_CXX_STANDARD 11)# 生成静态库并指定静态库存放路径
# add_library(addlib STATIC libsrc/add.cpp)
# set_target_properties(addlib PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/libout)## 创建可执行文件并指定头文件
add_executable(testlib libuse/main.cpp)
## 指定addlib.lib的绝对路径
target_link_libraries(testlib  PRIVATE ${PROJECT_SOURCE_DIR}/libout/addlib.lib)
## 指定头文件目录
target_include_directories(testlib PRIVATE ${PROJECT_SOURCE_DIR}/libinclude)

执行结果和预期完全一样
在这里插入图片描述

2. 动态库.dll

2.1 动态库编译生成

在这里插入图片描述

  • dllout 存放编译生成的动态库文件
  • dllsrc 存放编译用的源代码和头文件
  • CMakeLists.txt 此次编译CMake项目的配置文件

dllscr/add.h 这里与静态库非常不一样
在Windows平台上,动态库(DLL)的导出和导入需要通过 __declspec(dllexport)__declspec(dllimport) 来显式声明。通常,我们会使用一个宏来切换这两种声明。如下:

  • MATHLIBRARY_EXPORTS 被定义时,MATHLIBRARY_API 会被替换为 __declspec(dllexport),表示当前正在编译动态库,需要导出符号。在编译dll的时候CMakeLists.txt中会定义。
  • MATHLIBRARY_EXPORTS 未被定义时,MATHLIBRARY_API 会被替换为 __declspec(dllimport),表示当前正在使用动态库,需要导入符号。在执行调用dll的时候CMakeLists.txt中不会定义。
// add.h
#pragma once#ifdef MATHLIBRARY_EXPORTS
#define MATHLIBRARY_API __declspec(dllexport)
#else
#define MATHLIBRARY_API __declspec(dllimport)
#endifextern "C" MATHLIBRARY_API int add(int a, int b);
  • extern "C":告诉编译器按照C语言的方式处理函数名,即不进行名称修饰。
  • MATHLIBRARY_EXPORTS 被定义时,MATHLIBRARY_API 会被替换为 __declspec(dllexport),表示该函数需要从动态库中导出。
  • MATHLIBRARY_EXPORTS 未被定义时,MATHLIBRARY_API 会被替换为 __declspec(dllimport),表示该函数是从动态库中导入的。

dllscr/add.cpp 源文件函数定义没什么好说的

// add.cpp
#include "add.h"extern "C" MATHLIBRARY_API int add(int a, int b) {return a + b;
}

CMakeLists.txt

  • add_library()中 adddll 是生成的.lib名称;SHARED 指定的是生成库类型为动态库
  • set_target_properties 设置静态库存放路径为dllout文件夹下
  • target_compile_definitions() 编译动态库是一定要定义宏,告知此时需要导出库
cmake_minimum_required(VERSION 3.10)
project("dllgen")# 设置C++标准
set(CMAKE_CXX_STANDARD 11)# 添加动态库
add_library(adddll SHARED dllsrc/add.cpp)# 指定动态库的导出宏 编译动态库的时候定义宏MATHLIBRARY_EXPORT
target_compile_definitions(adddll PRIVATE MATHLIBRARY_EXPORTS)# 设置输出路径
set_target_properties(adddll PROPERTIESARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/dlloutRUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/dllout
)

编译生成的只需要.dll 和.lib 。记住.lib并非静态库,而是导入库,用于解析符号引用
在这里插入图片描述


2.2 动态库使用

同样只关注高亮文件夹部分
在这里插入图片描述

  • dllinclude 存放头文件,直接从dllscr 将头文件copy过来即可
  • dllout 2.1中编译生成的.dll, .lib文件
  • dlluse 调用dll的代码实现
  • CMakeLists.txt 此次编译执行的CMake项目的配置文件

dlluse/main.cpp 调用静态库中的add求和函数实现

// main.cpp
#include <iostream>
#include "add.h"int main() {int result = add(3, 4);std::cout << "3 + 4 = " << result << std::endl;return 0;
}

CMakeLists.txt 注释说的非常清楚了,不在详说,但是需要注意的是:

  • 链接的是.lib 导入库
  • .dll 的文件夹路径一定要添加到环境变量中,或者放在.exe目录下,我这里是提前添加到环境变量中去了
    在这里插入图片描述
cmake_minimum_required(VERSION 3.10)
project("dllgen")# 设置C++标准
set(CMAKE_CXX_STANDARD 11)# 添加动态库
#add_library(adddll SHARED dllsrc/add.cpp "dllinclude/add.h")# 指定动态库的导出宏 编译动态库的时候定义宏MATHLIBRARY_EXPORT
#target_compile_definitions(adddll PRIVATE MATHLIBRARY_EXPORTS)# 设置输出路径
#set_target_properties(adddll PROPERTIES
#    ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/dllout
#    RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/dllout
#)# 添加可执行文件
add_executable(testdll dlluse/main.cpp)# 链接动态库的导入库到可执行文件,并非直接链接动态库
target_link_libraries(testdll PRIVATE ${PROJECT_SOURCE_DIR}/dllout/adddll.lib)
## 指定头文件目录
target_include_directories(testdll PRIVATE ${PROJECT_SOURCE_DIR}/dllinclude)

执行结果和预期完全一样,而且输出视图中我们能够看到adddll.dll的加载
在这里插入图片描述
在这里插入图片描述

3 静态库、动态库区别联系(以下来自deepseek)

静态库和动态库是两种常见的代码复用方式,它们在代码链接、内存管理、维护灵活性等方面有显著差异。以下是它们的核心区别与联系:


一、核心区别

特性静态库动态库
文件格式.lib(Windows)、.a(Linux).dll(Windows)、.so(Linux) + 导入库 .lib(Windows)
链接时机编译时直接嵌入到可执行文件中运行时由操作系统动态加载到内存中
代码存储可执行文件包含库代码的完整副本可执行文件仅包含对动态库的引用
内存占用多进程无法共享库代码,内存冗余多进程可共享同一动态库,节省内存
更新维护更新库需重新编译整个程序更新库只需替换动态库文件,无需重新编译程序
运行依赖无需外部库文件,独立性强依赖动态库文件存在且路径正确
加载速度启动快(代码已嵌入)启动稍慢(需加载动态库)
体积大小可执行文件体积大可执行文件体积小

二、核心联系

  1. 代码复用

    • 两者均用于封装通用功能(如数学计算、文件操作),避免重复开发。
    • 例如:将加密算法封装为库,供多个项目调用。
  2. 模块化设计

    • 通过库分离核心模块和业务逻辑,提升代码可维护性。
    • 例如:将图形渲染功能封装为动态库,独立于主程序更新。
  3. 混合使用

    • 项目中可同时使用静态库和动态库。
    • 例如:主程序链接静态库保证核心功能稳定,插件使用动态库实现热更新。

三、典型应用场景

场景静态库动态库
嵌入式开发✅ 资源有限,需减少运行时依赖❌ 动态加载可能增加复杂性
跨平台插件❌ 更新需重新编译✅ 支持运行时加载,如浏览器插件、游戏模组
系统级共享功能❌ 内存占用高✅ 如Windows的kernel32.dll,Linux的libc.so
闭源分发✅ 代码完全嵌入,保护知识产权❌ 需分发动态库文件
快速迭代更新❌ 每次更新需重新编译✅ 替换动态库即可生效

四、技术细节对比

1. 符号冲突处理
  • 静态库:多个静态库中同名符号会导致链接错误。
  • 动态库:符号在运行时解析,不同动态库的同名符号可共存。
2. 跨平台兼容性
  • Windows
    • 静态库:.lib
    • 动态库:.dll(实现文件) + .lib(导入库)
  • Linux
    • 静态库:.a
    • 动态库:.so(直接链接,无需导入库)
3. CMake配置
# 静态库
add_library(MyStaticLib STATIC src.cpp)
target_include_directories(MyStaticLib PUBLIC include)# 动态库(需导出符号)
add_library(MySharedLib SHARED src.cpp)
target_compile_definitions(MySharedLib PRIVATE MYLIB_EXPORTS)
target_include_directories(MySharedLib PUBLIC include)# 使用库
add_executable(MyApp main.cpp)
target_link_libraries(MyApp PRIVATE MyStaticLib MySharedLib)

五、如何选择?

  • 选静态库
    ✅ 项目规模小,无需频繁更新
    ✅ 对启动速度敏感(如命令行工具)
    ✅ 目标环境依赖管理困难(如嵌入式设备)

  • 选动态库
    ✅ 代码需多进程共享(如系统库)
    ✅ 支持热更新或插件化架构
    ✅ 减少可执行文件体积(如大型应用)


六、总结

静态库和动态库本质是代码复用的两种策略

  • 静态库追求简单性和独立性,牺牲体积和灵活性。
  • 动态库追求资源共享和灵活性,牺牲启动速度和环境依赖。

实际开发中,二者常结合使用。例如:核心基础模块用静态库保证稳定性,业务模块用动态库支持灵活扩展。

相关文章:

windows + visual studio 2019 使用cmake 编译构建静、动态库并调用详解

环境 windows visual studio 2019 visual studio 2019创建cmake工程 1. 静态库.lib 1.1 静态库编译生成 以下是我创建的cmake工程文件结构&#xff0c;只关注高亮文件夹部分 libout 存放编译生成的.lib文件libsrc 存放编译用的源代码和头文件CMakeLists.txt 此次编译CMak…...

使用Feign代替RestTemplet

Feign RestTemplet存在的问题 String url "http: //userservice/user/" order.getUserId(); User user restTemplate.getFor0bject(url, User.class);可读性差参数复杂URL难以维护 Feign声明式的Http客户端&#xff0c;官方地址&#xff1a;https://github.com…...

苹果笔记本安装jmeter

下载并安装jmeter即可&#xff0c;jmeter官网下载地址&#xff1a;Apache JMeter - Download Apache JMeter 参考以下文章&#xff1a;“https://blog.csdn.net/weixin_51664828/article/details/145008755”...

设备通过国标GB28181接入EasyCVR,显示在线但视频无法播放的原因排查

安防监控EasyCVR平台支持多种视频源接入&#xff0c;包括但不限于IP摄像头、NVR、编码器、流媒体服务器等。平台采用高效的视频流接入技术&#xff0c;支持大规模视频流的并发接入&#xff0c;确保视频流的稳定性和流畅性。 有用户反馈&#xff0c;项目现场使用国标GB28181接入…...

为什么我喜欢在 CSS 中使用 RegEx

说到正则&#xff08;RegEx&#xff09;&#xff0c;我们第一反应往往是“在编程中用来匹配或验证字符串”&#xff0c;比如做表单验证。但其实在 CSS 中&#xff0c;也能用到与正则类似的选择器特性&#xff0c;为我们的样式管理带来诸多便利。别怀疑&#xff0c;以下就是如何…...

深度剖析 Redisson 分布式锁:原理、实现与应用实践

文章目录 写在文章开头详解Redisson 分布式锁使用和实现前置准备工作分布式锁的基本使用公平锁的使用联锁的使用读写锁基本使用常见问题Redisson和Jedis有什么区别redisson如何实现分布式锁redisson如何实现分布式锁的可重入redisson如何实现公平锁Redisson的watchdog机制是什么…...

今日AI和商界事件(2025-02-08)

今日AI领域的重大事件主要包括以下几个方面&#xff1a; 一、DeepSeek引发的行业震动 事件概述&#xff1a;DeepSeek作为近期崛起的AI模型&#xff0c;以其低成本、高性能的推理能力引发了广泛关注。其开源策略、独特的出身以及强大的算力表现&#xff0c;使得微软、英伟达等…...

Mac 基于Ollama 本地部署DeepSeek离线模型

最近节日期间最火的除了《哪吒》就是deepseek了&#xff0c;毕竟又让西方各个层面都瑟瑟发抖的产品。DeepSeek凭借其强大的AI能力真的是在全球多个领域展现出强大的影响力。由于受到外部势力的恶意攻击倒是deepseek官方服务不稳定&#xff0c;国内其他厂家的适配版本也不是很稳…...

Python截图轻量化工具

这是用Python做到截图工具&#xff0c;不过由于使用了ctypes调用了Windows的API, 同时访问了Windows中"C:/Windows/Cursors/"中的.cur光标样式文件, 这个工具只适用于Windows环境&#xff1b; 如果要提升其跨平台性的话&#xff0c;需要考虑替换ctypes的一些专属于W…...

怎麼在Chrome中設置代理伺服器?

出於隱私、安全或者訪問特定網路資源的需求&#xff0c;設置代理伺服器顯得尤為重要。本文將詳細介紹如何在Chrome流覽器中進行代理伺服器的設置。 代理伺服器是介於電腦和互聯網之間的一道“中間牆”。幫助間接訪問互聯網資源&#xff0c;這樣實際的IP地址被代理伺服器的IP地…...

【数据结构中链表常用的方法实现过程】

线性表 线性表包括:顺序表、链表、栈&#xff0c;队列等&#xff0c;本节我们先学习顺序表。 顺序表 利用新的数据类型——顺序表&#xff0c;操作数组 顺序表的本质就是对数组的增删改查。 /*** 打印顺序表中的所有元素*/Overridepublic void display() {for (int i 0; i…...

语言月赛 202308【小粉兔处理题解审核志愿者轮换】题解(AC)

》》》点我查看「视频」详解》》》 [语言月赛 202308] 小粉兔处理题解审核志愿者轮换 题目背景 又到了一周的周日&#xff0c;扶苏又像催命一样开始催促小粉兔处理题解审核志愿者的轮换。但是懒狗小粉兔总是把这项工作拖到第二天凌晨。 【这里有一张内部群聊图&#xff0c;…...

第二十二章:游戏结缘与现实的相遇

“终于结束了……” 小冷的手微微颤抖&#xff0c;笔在纸上划过&#xff0c;签下放弃 985 高校研究生入学资格的名字&#xff0c;那一刻&#xff0c;数月来压在心头沉甸甸的巨石轰然崩塌&#xff0c;扬起的尘埃渐渐消散。曾经&#xff0c;学术巅峰犹如夜空中遥不可及却又熠熠生…...

(ICLR=2025)生成的表征对齐:训练扩散Transformer比你想象的更简单

生成的表征对齐&#xff1a;训练扩散Transformer比你想象的更简单 paper是KAIST发表在ICLR 2025的工作 paper title:REPRESENTATION ALIGNMENT FOR GENERATION: TRAINING DIFFUSION TRANSFORMERS IS EASIER THAN YOU THINK Code&#xff1a;链接 ABSTRACT 最近的研究表明&…...

保姆级教程--DeepSeek部署

以DeepSeek-R1或其他类似模型为例&#xff0c;涵盖环境配置、代码部署和运行测试的全流程&#xff1a; 准备工作 1. 注册 Cloud Studio - 访问 [Cloud Studio 官网](https://cloudstudio.net/)&#xff0c;使用腾讯云账号登录。 - 完成实名认证&#xff08;如需长期使用…...

[css] 黑白主题切换

link动态引入 类名切换 css滤镜 var 类名切换 v-bind css预处理器mixin类名切换 【前端知识分享】CSS主题切换方案...

C语言练习题

文章目录 1. 递归实现将字符串str中的元素逆序2. 对数组arr进行冒泡排序&#xff08;升序&#xff09;3. 对数组从下标low到下标hihg区间内的元素进行快速排序&#xff08;升序&#xff09;4. 在数组中利用二分查找(折半查找)目标关键字5. 求n的阶乘6. 判断year是否为闰年7. 求…...

Lambda 表达式

一、Lambda 表达式简介 Lambda 表达式是一种简洁的函数式编程方式&#xff0c;用于实现只有一个方法的接口&#xff08;例如函数式接口&#xff09;。 基本语法 (parameters) -> expression (parameters) -> { statements; } 参数&#xff1a;可以有零个或多个参数。…...

Vue 鼠标事件合集,关于鼠标右键的处理方法(改写鼠标右键方法、自定义鼠标右键)

鼠标事件使用 mousedown"canvasDown($event)"按下事件合集 click 点击某个对象时触发 mousedown 鼠标按钮被按下时触发 mouseup 鼠标按钮被松开时触发 mouseleave 当鼠标指针移出元素时触发 dblclick 双击时触发 mousemove 鼠标移动时触发&#xff0c…...

go语言中的接口

接口简介 现实生活中的接口 现实生活中手机、相机、U 盘都可以和电脑的 USB 接口建立连接。我们不需要关注 usb 卡槽大小是否一样&#xff0c;因为所有的 USB 接口都是按照统一的标准来设计的。 Golang 中的接口&#xff08;interface&#xff09; Golang 中的接口是一种抽象…...

如何在Android Studio中开发一个简单的Android应用?

Android Studio是开发Android应用的官方集成开发环境&#xff08;IDE&#xff09;&#xff0c;它提供了许多强大的功能&#xff0c;使得开发者能够高效地创建Android应用。如果你是Android开发的初学者&#xff0c;本文将引导你如何在Android Studio中开发一个简单的Android应用…...

启明星辰发布MAF大模型应用防火墙产品,提升DeepSeek类企业用户安全

2月7日&#xff0c;启明星辰面向DeepSeek等企业级大模型业务服务者提供的安全防护产品——天清MAF&#xff08;Model Application Firewall&#xff09;大模型应用防火墙产品正式发布。 一个新赛道将被开启…… DeepSeek的低成本引爆赛道规模 随着DeepSeek成为当前最热的现象级…...

开箱即用的.NET MAUI组件库 V-Control 发布了!

之前写过挺多的MAUI Sample&#xff0c;其中有很多代码可以打包成组件&#xff0c;当组件完善到一定程度&#xff0c;我会把控件封装起来放到控件库中。 今天&#xff0c;在这个仓库建立一年零八个月后&#xff0c;我觉得可以考虑将其作为开源库发布。 有很多网友在观望.NET …...

android skia渲染介绍

Android AOSP 的渲染系统主要使用 Skia 图形库。Skia 是一个开源的 2D 图形库&#xff0c;它被广泛应用于 Android 的图形渲染中&#xff0c;负责绘制 UI 元素、文本、图像以及其他 2D 图形内容。 以下是 Android AOSP 中 Skia 的作用和它在渲染系统中的位置&#xff1a; 1. 什…...

MySQL的底层原理与架构

前言 了解MySQL的架构和原理对于很多的后续很多的操作会有很大的帮助与理解。并且很多知识都与底层架构相关联。 了解MySQL架构 通过上面的架构图可以得知&#xff0c;Server层中主要由 连接器、查询缓存、解析器/分析器、优化器、执行器 几部分组成的&#xff0c;下面将主要…...

GB/T 43698-2024 《网络安全技术 软件供应链安全要求》标准解读

一、43698-2024标准图解 https://mmbiz.qpic.cn/sz_mmbiz_png/rwcfRwCticvgeBPR8TWIPywUP8nGp4IMFwwrxAHMZ9Enfp3wibNxnfichT5zs7rh2FxTZWMxz0je9TZSqQ0lNZ7lQ/640?wx_fmtpng&fromappmsg 标准在线预览&#xff1a; 国家标准|GB/T 43698-2024 相关标准&#xff1a; &a…...

Vue(4)

一.组件的三大组成部分-注意点说明 &#xff08;1&#xff09;scoped样式冲突 默认情况&#xff1a;写在组件中的样式会全局生效 → 因此很容易造成多个组件之间的样式冲突 ①全局样式&#xff1a;默认组件中的样式会作用到全局 ②局部样式&#xff1a;可以给组件加上scoped属…...

实验3 词法分析(二)

实验3 词法分析(二) [实验目的]&#xff1a; 1 . 熟悉给定的词法分析程序&#xff1b; 2 . 改进词法分析程序。 [实验内容]&#xff1a; 1.尝试多方面改进TEST语言的文法&#xff0c;参考教材附录B词法分析程序TESTscan.c&#xff0c;在此词法分析程序的基础上改进程序&#x…...

MYSQL第四次

目录 题目分析 代码实现 一、修改 Student 表中年龄&#xff08;sage&#xff09;字段属性&#xff0c;数据类型由 int 改变为 smallint 二、为 Course 表中 Cno 字段设置索引&#xff0c;并查看索引 三、为 SC 表建立按学号&#xff08;sno&#xff09;和课程号&#xff…...

CentOS 7配置samba服务设置文件共享

CentOS 7配置samba服务设置文件共享 一、生成另一个Linux系统&#xff0c;名为Linux-client&#xff0c;作为测试系统。 [rootliunx-client ~]# hostnamectl set-hostname Liunx-client二、如果没有则安装Samba服务&#xff0c;如果已经安装则省略此步。 yum install samba…...

分布式微服务系统架构第91集:系统性能指标总结

加群联系作者vx&#xff1a;xiaoda0423 仓库地址&#xff1a;https://webvueblog.github.io/JavaPlusDoc/ 系统性能指标总结 系统性能指标包括哪些&#xff1f; 业务指标、资源指标、中间件指标、数据库指标、前端指标、稳定性指标、批量处理指标、可扩展性指标、可靠性指标。 …...

【算法】动态规划专题⑦ —— 多重背包问题 + 二进制分解优化 python

目录 前置知识进入正题优化方法&#xff1a;二进制分解实战演练 前置知识 【算法】动态规划专题⑤ —— 0-1背包问题 滚动数组优化 python 【算法】动态规划专题⑥ —— 完全背包问题 python 进入正题 多重背包问题I https://www.acwing.com/problem/content/4/ 题目描述 有…...

Node.js学习指南

一、模块化规范 nodejs使用的模块化规范 叫做 common.js 规范: 每一个模块都有独立的作用域 代码在各自模块中执行 不会造成全局污染 每一个模块都是一个独立的文件&#xff08;module对象&#xff09; 模块可以被多次加载&#xff08;module.exports 属性&#xff09; 但是仅…...

Mybatis篇

1&#xff0c;什么是Mybatis &#xff08; 1 &#xff09;Mybatis 是一个半 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;它内部封装了 JDBC&#xff0c;开发时只需要关注 SQL 语句本身&#xff0c;不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁…...

微信小程序案例1——制作猫眼电影底部标签导航栏

文章目录 一、项目步骤1 新建一个无AppID的movie项目2将准备好的底部标签导航图标拷贝到movie项目下面(将图标文件夹image放到项目文件夹里&#xff09;3 打开App.json配置文件&#xff0c;在pages数组里添加4个页面路径:电影“pages/movie/movie”、影院“pages/cinema/cinema…...

Docker 数据卷(Volume)详细介绍

Docker 数据卷&#xff08;Volume&#xff09;详细介绍 1. 什么是 Docker 数据卷&#xff1f; Docker 数据卷&#xff08;Volume&#xff09;是一种用于 持久化数据 和 容器间数据共享 的机制。由于容器的存储是临时的&#xff0c;容器删除后其中的数据会丢失&#xff0c;因此…...

Redis --- 使用Feed流实现社交平台的新闻流

要实现一个 Feed 流&#xff08;类似于社交媒体中的新闻流&#xff09;&#xff0c;通常涉及以下几个要素&#xff1a; 内容发布&#xff1a;用户发布内容&#xff08;例如文章、状态更新、图片等&#xff09;。内容订阅&#xff1a;用户可以订阅其他用户的内容&#xff0c;获…...

WPF 在后台使TextBox失去焦点的方法

在软件设计开发的时候&#xff0c;偶尔会遇到在后台xaml.cs后台中&#xff0c;要将TextBox控件的焦点取消或者使TextBox控件获取焦点&#xff0c;下面介绍讲述一种简单的“只让特定的 TextBox 失去焦点”方法: 前端xaml代码示例&#xff1a; <StackPanel Orientation"…...

自动化测试、压力测试、持续集成

因为项目的原因&#xff0c;前段时间研究并使用了 SoapUI 测试工具进行自测开发的 api。下面将研究的成果展示给大家&#xff0c;希望对需要的人有所帮助。 SoapUI 是什么&#xff1f; SoapUI 是一个开源测试工具&#xff0c;通过 soap/http 来检查、调用、实现 Web Service 的…...

Mac电脑上好用的压缩软件

在Mac电脑上&#xff0c;有许多优秀的压缩软件可供选择&#xff0c;这些软件不仅支持多种压缩格式&#xff0c;还提供了便捷的操作体验和强大的功能。以下是几款被广泛推荐的压缩软件&#xff1a; BetterZip 功能特点&#xff1a;BetterZip 是一款功能强大的压缩和解压缩工具&a…...

C++ 使用CURL开源库实现Http/Https的get/post请求进行字串和文件传输

CURL开源库介绍 CURL 是一个功能强大的开源库&#xff0c;用于在各种平台上进行网络数据传输。它支持众多的网络协议&#xff0c;像 HTTP、HTTPS、FTP、SMTP 等&#xff0c;能让开发者方便地在程序里实现与远程服务器的通信。 CURL 可以在 Windows、Linux、macOS 等多种操作系…...

[创业之路-276]:从燃油汽车到智能汽车:工业革命下的价值变迁

目录 前言&#xff1a; 从燃油汽车到智能汽车&#xff1a;工业革命下的价值变迁 前言&#xff1a; 燃油汽车&#xff0c;第一次、第二次工业革命&#xff0c;机械化、电气化时代的产物&#xff0c;以机械和电气自动化为核心价值。 智能汽车&#xff0c;第三次、第四次工业革…...

DeepSeek服务器繁忙问题的原因分析与解决方案

一、引言 随着人工智能技术的飞速发展&#xff0c;DeepSeek 等语言模型在众多领域得到了广泛应用。然而&#xff0c;在春节这段时间的使用过程中&#xff0c;用户常常遭遇服务器繁忙的问题&#xff0c;这不仅影响了用户的使用体验&#xff0c;也在一定程度上限制了模型的推广和…...

【python】简单的flask做页面。一组字母组成的所有单词。这里的输入是一组字母,而输出是所有可能得字母组成的单词列表

目录结构如下&#xff1a; . ├── static │ ├── css │ │ └── styles.css │ └── js │ └── scripts.js ├── templates │ ├── base.html │ ├── case_converter.html │ ├── index.html │ └── word_finder.html ├── app.py ├── tree.py…...

【华为OD-E卷 - 114 找最小数 100分(python、java、c++、js、c)】

【华为OD-E卷 - 找最小数 100分&#xff08;python、java、c、js、c&#xff09;】 题目 给一个正整数NUM1&#xff0c;计算出新正整数NUM2&#xff0c;NUM2为NUM1中移除N位数字后的结果&#xff0c;需要使得NUM2的值最小 输入描述 输入的第一行为一个字符串&#xff0c;字…...

Maven 依赖管理全面解析

目录 1. Maven 简介 2. 依赖的基本概念 依赖坐标 依赖范围 3. Maven 仓库 本地仓库 远程仓库 4. 依赖传递 5. 依赖冲突 6. 在 pom.xml 文件中管理依赖 基本依赖配置 依赖范围配置 依赖排除配置 依赖管理配置&#xff08;&#xff09; 1. Maven 简介 Maven 是一个…...

基于C#语言的海康威视智能车牌识别系统

基于C#语言的海康威视智能车牌识别系统&#xff0c;通过布控对来往车辆进行检测抓拍 资源文件列表 AICar.sln , 984 AICar.sln.GhostDoc.xml , 1306 AICar.v12.suo , 72704 AICar/AICar.csproj , 3573 AICar/AICar.csproj.user , 228 AICar/bin/Debug/AICar.exe , 220672 AIC…...

RabbitMQ 从入门到精通:从工作模式到集群部署实战(五)

#作者&#xff1a;闫乾苓 系列前几篇&#xff1a; 《RabbitMQ 从入门到精通&#xff1a;从工作模式到集群部署实战&#xff08;一&#xff09;》&#xff1a;link 《RabbitMQ 从入门到精通&#xff1a;从工作模式到集群部署实战&#xff08;二&#xff09;》&#xff1a; lin…...

清理服务器/docker容器

清理服务器 服务器或docker容器清理空间。 清理conda环境 删除不用的conda虚拟环境&#xff1a; conda env remove --name python38 conda env remove --name python310清理临时目录&#xff1a;/tmp du -sh /tmp # 查看/tmp目录的大小/tmp 目录下的文件通常是可以直接删除…...

【专题】2024-2025人工智能代理深度剖析:GenAI 前沿、LangChain 现状及演进影响与发展趋势报告汇总PDF洞察(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p39630 在科技飞速发展的当下&#xff0c;人工智能代理正经历着深刻的变革&#xff0c;其能力演变已然成为重塑各行业格局的关键力量。从早期简单的规则执行&#xff0c;到如今复杂的自主决策与多智能体协作&#xff0c;人工智能代理…...