C++ 快速回顾(五)

C++ 快速回顾(五)

  • 前言
  • 一、Dll和Lib的区别
    • 区别
    • 在开发中使用
  • 二、封装并使用C++库
    • 1.封装库
    • 2.使用库
  • 三、封装并使用C库
    • 1.封装库
    • 2.使用库

前言

用于快速回顾之前遗漏或者补充C++知识

一、Dll和Lib的区别

静态库(LIB)在编译时链接,代码被复制到可执行文件中。
动态库(DLL)在运行时链接,可执行文件只包含对 DLL 中函数的引用。

区别

文件分布​​:
静态库:可执行文件独立,不需要额外的库文件。
动态库:可执行文件需要依赖 DLL 文件。
​​更新和维护​​:
静态库:更新库需要重新编译程序。
动态库:更新 DLL 可以独立进行(但要保持接口兼容),程序无需重新编译。
​​内存占用​​:
静态库:每个使用库的程序都会在内存中有自己的一份库代码拷贝。
动态库:多个程序可以共享内存中的同一份 DLL 代码。
​​加载​​:
静态库:在程序启动时,代码已经被加载。
动态库:可以在程序启动时加载(隐式链接),也可以在程序运行时按需加载(显式链接,使用 LoadLibrary 和 GetProcAddress 函数)。

在开发中使用

静态库(LIB)的使用​​:
在项目配置中,需要指定静态库的路径和库文件名。链接时,链接器会将库中的代码直接整合到可执行文件中。
​​动态库(DLL)的使用​​:
需要两个文件:DLL 文件和导入库(.lib)。在链接时,使用导入库来解析符号,但代码不会复制到可执行文件。运行时,DLL 文件必须放在可执行文件的目录或系统路径中。

如何选择​​:
如果需要减少可执行文件的大小,方便更新,或者多个程序共享库代码,则使用 DLL。
如果希望程序独立运行,不依赖外部文件,则使用静态库。

在这里插入图片描述

二、封装并使用C++库

题外话:防止头文件被重复包含的两种方式
1.#pragma once
2.宏定义包裹,如下:

#ifndef INTERFACE_H
#define INTERFACE_H//TODO:#endif // !INTERFACE_H

1.封装库

定义导出宏

#define TESTCPP_API __declspec(dllexport)

整体的头文件如下,IInterface这个类加了导出宏就可以被导出给外界使用
在这里插入图片描述
具体的实现如下,FHello这个类没有加导出宏,我们只在内部使用导出后的DLL无法直接使用此类
如下代码就是将FHello这个类作为内部实现,然后提供CreateInterface 这个接口给外界调用,返回的是内部定义的类
在这里插入图片描述
在项目属性中分别选择Dll和Lib导出
在这里插入图片描述
会生成以下这些文件
在这里插入图片描述
我们最后实际上使用的只有如下这几个文件,头文件是方便我们调用函数等查看使用,具体的实现都在dll或者lib中了
在这里插入图片描述

2.使用库

有了上面导出的库文件,我们可以来使用了
我们新建控制台项目,导入之前生成的库文件到自定义的目录中
在这里插入图片描述
可以看到我们可以正常包含我们实现的内容

#include "dlllib/Interface.h"
#include <iostream>int main()
{IInterface* Interface = IInterface::CreateInterface();Interface->Init();printf(Interface->GetName());Interface->Destroy();system("pause");return 0;
}

但是这时候运行却运行不起来
我们需要根据需要设置此路径
在这里插入图片描述
此处有两种方式可以选择
第一种是直接在设置处设置即可
在这里插入图片描述
第二种是在代码中设置
在这里插入图片描述
在生成前把库拷贝到对应生成目录之下
xcopy /e /r /y $(ProjectDir)dlllib $(OutDir)
在这里插入图片描述
在这里插入图片描述

三、封装并使用C库

1.封装库

使用c来封装库时要注意

#ifdef __cplusplus
extern "C"
{
#endif

同时注意函数要使用 ** __stdcall** 写在要导出的函数前面,这个是函数压栈依次进行的标识

在这里插入图片描述
下面是具体的函数实现
在这里插入图片描述

2.使用库

使用的方式同上C++使用类库
可以看到只有CTEST_API导出宏的函数可以正常进行使用,不然会在运行时报错!!!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/87067.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/87067.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ARM】解决ArmDS的工程没有生成Map文件的问题

1、 文档目标 在嵌入式开发过程中&#xff0c;使用Arm Development Studio&#xff08;简称ArmDS&#xff09;进行项目构建时&#xff0c;Map文件的生成是调试和分析代码的重要环节。Map文件不仅记录了程序中各个段&#xff08;sections&#xff09;的内存分布情况&#xff0c…

Java如何导出word(根据模板生成),通过word转成pdf,放压缩包

<!-- 导出word文档所需依赖--><dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.10.0-beta</version></dependency><dependency><groupId>org.apache.poi</gr…

【C#】 DevExpress.XtraEditors.SidePanel

DevExpress.XtraEditors.SidePanel&#xff0c; 它是 DevExpress 提供的“侧边滑出”面板&#xff08;类似于抽屉、浮动信息区&#xff09;&#xff0c;非常适合做可隐藏的参数区、帮助区、临时交互区等。 SidePanel 用法核心点 1. 基本用法 可容纳其它控件&#xff0c;就像普…

1.1_2 计算机网络的组成和功能

在这个视频中&#xff0c;我们会探讨计算机网络的组成和功能。我们会从三个视角去探讨计算机网络由哪些部分组成&#xff0c;其次&#xff0c;我们会简单的了解计算机网络的功能。 首先我们可以把计算机网络看作是由硬件、软件和协议共同组成的一个庞大复杂的系统。首先在硬件上…

Linux驱动学习day11(定时器)

定时器 定时器主要作用就是&#xff1a;设置超时时间&#xff0c;执行超时函数。 按键按下存在抖动&#xff0c;为了消除抖动可以设置定时器&#xff0c;如上图所示&#xff0c;按下一次按键会产生多次抖动&#xff0c;即会产生多次中断&#xff0c;在每次中断产生的时候&…

Java 编程之观察者模式详解

一、什么是观察者模式&#xff1f; 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式&#xff0c;用于对象之间的一对多依赖关系&#xff1a;当被观察对象&#xff08;Subject&#xff09;状态发生变化时&#xff0c;所有依赖它的观察者&#xff08;O…

【C++】经典string类问题

目录 1. 浅拷贝 2. 深拷贝 3. string类传统写法 4. string类现代版写法 5. 自定义类实现swap成员函数 6. 标准库swap函数的调用 7. 引用计数和写时拷贝 1. 浅拷贝 若string类没有显示定义拷贝构造函数与赋值运算符重载&#xff0c;编译器会自动生成默认的&#xff0c…

kotlin中object:的用法

在Kotlin中&#xff0c;object: 用于声明匿名对象&#xff08;Anonymous Object&#xff09;&#xff0c;这是实现接口或继承类的轻量级方式&#xff0c;无需显式定义具名类。以下是核心用法和场景&#xff1a; 1. 基本语法 val obj object : SomeInterface { // 实现接口ov…

js代码04

题目 非常好。我们刚刚看到了回调函数在处理多个异步操作时会变得多么混乱&#xff08;回调地狱&#xff09;。为了解决这个问题&#xff0c;现代 JavaScript 提供了一个更强大、更优雅的工具&#xff1a;Promise。 Promise&#xff0c;正如其名&#xff0c;是一个“承诺”。…

Jenkins初探-通过Docker部署Jenkins并安装插件

简介 本文介绍了使用Docker安装Jenkins并进行初始配置的完整流程。主要内容包括&#xff1a; (1)通过docker pull命令获取Jenkins镜像&#xff1b;(2)使用docker run命令启动容器并映射端口&#xff1b;(3)访问Jenkins界面获取初始管理员密码&#xff1b;(4)安装推荐插件并创…

嵌入式开发:GPIO、UART、SPI、I2C 驱动开发详解与实战案例

&#x1f4cd; 本文为嵌入式学习系列第二篇&#xff0c;基于 GitHub 开源项目&#xff1a;0voice/EmbeddedSoftwareLearn &#x1f4ac; 作者&#xff1a;0voice &#x1f440; 适合对象&#xff1a;嵌入式初学者、STM32学习者、想搞明白外设驱动开发的C语言学习者 一、驱动是什…

常用 Linux 命令和 shell 脚本语言整理

目录 一、Linux 命令大全 1、文件和目录操作 &#xff08;1&#xff09;ls 列出目录内容 &#xff08;2&#xff09;pwd 查看当前目录 &#xff08;3&#xff09;cd 切换目录 &#xff08;4&#xff09;mkdir 创建目录 &#xff08;5&#xff09;cp 复制文件或目录 &…

YOLOv12_ultralytics-8.3.145_2025_5_27部分代码阅读笔记-autobackend.py

autobackend.py ultralytics\nn\autobackend.py 目录 autobackend.py 1.所需的库和模块 2.def check_class_names(names: Union[List, Dict]) -> Dict[int, str]: 3.def default_class_names(data: Optional[Union[str, Path]] None) -> Dict[int, str]: 4.cla…

【MySQL基础】MySQL索引全面解析:从原理到实践

MySQL学习&#xff1a; https://blog.csdn.net/2301_80220607/category_12971838.html?spm1001.2014.3001.5482 前言&#xff1a; 在前面我们基本上已经把MySQL的基础知识都进行了学习&#xff0c;但是我们之前处理的数据都是十分少的&#xff0c;但是如果当我们的数据量很大…

第三十五章 I2S——音频传输接口

第三十五章 I2S——音频传输接口 目录 第三十五章 I2S——音频传输接口 1 I2S概述 1.1 简介 1.2 功能特点 1.3 工作原理 1.4 利用DMA通信的I2S 1.4.1 I2S配合DMA通信工作原理 1.4.2 配置要点 2 应用场景 2.1 消费类音频设备 2.2 专业音频设备 2.3 通信设备 2.4 汽车电子 2.5 嵌…

产品-Figma(英文版),图像的布尔类型图例说明

文章目录 Union SelectionSubtract SelectionIntersect SelectionExclude SelectionFlatten Selection Union Selection 把多个形状合并成一个新的完整形状&#xff0c;保留所有外部轮廓&#xff0c;内部不被切割。由于红色的长方形在外面的一层&#xff0c;所以切割后&#x…

Windows CMD命令分类大全

⚙️ ‌一、系统与磁盘管理‌ ‌系统信息‌ systeminfo&#xff1a;查看详细硬件及系统配置&#xff08;版本/内存/补丁&#xff09;211 winver&#xff1a;快速检查Windows版本11 msinfo32&#xff1a;图形化系统信息面板811‌磁盘工具‌ chkdsk /f&#xff1a;修复磁盘错误&…

【Dify系列】【Dify1.4.2 升级到Dify1.5.0】

1. 升级前准备工作 1.1 数据备份&#xff1a; 进入原安装包 docker 目录&#xff0c;备份“volumes”文件夹&#xff0c;此文件夹包含了 Dify 数据库数据&#xff1a; rootjoe:/usr/local/dify/docker/volumes# pwd /usr/local/dify/docker/volumesrootjoe:/usr/local/dify/…

DeepSeek网页版随机点名器

用DeepSeek帮我们生成了一个基于html5的随机点名器&#xff0c;效果非常棒&#xff0c;如果需要加入名字&#xff0c;请在代码中按照对应的格式添加即可。 提示词prompt 帮我生成一个随机点名的HTML5页面 生成真实一点的名字数据 点击随机按钮开始随机选择 要有闪动的效果 &…

前后端分离实战2----后端

戳我抵达前端 项目描述&#xff1a;用Vscode创建Spring Bootmybatis项目&#xff0c;用maven进行管理。创建一个User表&#xff0c;对其内容进行表的基本操作&#xff08;增删改查&#xff09;&#xff0c;显示在前端。 项目地址&#xff1a;戳我一键下载项目 运行效果如下&…