计网 静态库和动态库

news2024/11/17 4:22:12

计网 静态库和动态库

一.我们先来了解一下一个程序编译成可执行文件的四个过程

1.预处理期(预编译)

在预处理期会进行替换,将头文件和宏定义进行替换

2.编译期

编译期会将源代码变为汇编语言

3.汇编期

汇编期是把汇编语言变为机器语言 .obj文件/.o文件(windows下是 .obj文件linux是.o文件)

4.连接期

连接期是把所有的.obj文件/.o文件和程序中引用的动态库和静态库连接到一起生成可执行文件

二.动态库和静态库

1.所谓的动态和静态说的是库连接的方式

2.静态库的文件有两种

(1) .a文件

(2).lib文件

3.动态库的文件有两种

(1).so文件(linus中.so文件用的比较多)

(2).dll文件(windows中用的是.dll文件)

4.静态库和动态库的使用

1.静态库的使用

直接拷贝到可执行文件中

2.动态库的使用

动态库在使用的过程中还需要有一个索引(同名字,但不同文件类型,索引文件是.lib文件)

把索引拷贝到可执行文件中

5.静态库和动态库的优缺点

1.静态库

1.静态库会造成空间浪费

2.静态库对程序的更新、部署和发布页会带来麻烦。如果静态库更新了,那么所有使用它的应用程序都需要重新编译、发布给用户

三.自己创建一个静态库,并在其他程序中进行使用

1.创建静态库文件

1.创建一个静态库项目

在这里插入图片描述

2.在静态库中写一个加法函数
1.加法函数的声明(写在pch.h文件中)

代码如下

// pch.h: 这是预编译标头文件。
// 下方列出的文件仅编译一次,提高了将来生成的生成性能。
// 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。
// 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。
// 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。

#ifndef PCH_H
#define PCH_H

// 添加要在此处预编译的标头
#include "framework.h"
int add(int a, int b);
#endif //PCH_H
2.加法函数的定义(写在pch.cpp文件中)
// pch.cpp: 与预编译标头对应的源文件

#include "pch.h"

int add(int a, int b) {
	return a + b;
}
// 当使用预编译的头时,需要使用此源文件,编译才能成功。

3.生成解决方案(生成解决方案时会生成库),通过绝对路径获得静态库
1.生成解决方案

在这里插入图片描述

2.通过绝对路径获得静态库

在这里插入图片描述

这里说一下绝对路径和相对路径的知识点

1.绝对路径:在windows里面,从盘符开始的路径就是绝对路径

例如:F:\vs\jingtaiku\x64\Debug\jingtaiku.lib

2.相对路径:从任意位置开始,./(表示当前路径)或者…/(表示上一层路径)

2.再创建一个新项目用来使用静态库

1.创建一个新项目

在这里插入图片描述

2.使用静态库
使用静态库的步骤
1.包含头文件(如果使用一个函数出现未定义标识符的错误就说明是没有包含头文件)

将pch.h这个头文件放到当前项目所在的文件夹,如下

先在当前文件夹中创建一个用来放头文件的文件夹

在这里插入图片描述

再将pch.h这个头文件放到此文件夹中

在这里插入图片描述

然后还要将framework.h这个头文件放入到此文件夹中,因为在pch.h头文件中用到了framework.h这个头文件

在这里插入图片描述

最后进行包含头文件代码的书写,整体代码如下

#include<iostream>
#include"./tou/pch.h"//包含头文件
using namespace std;

int main() {

	int c = add(2, 4);
	cout << "2 + 4 = "<<c << endl;

	return 0;
}
2.导入依赖库(如果出现无法解析的外部符号就说明编译器能找到函数的声明但找不到函数的是实现,缺少库文件的引用)

先在当前文件夹中创建一个存放库的文件夹再把静态库放到此文件夹中

(1)创建一个存放库的文件夹

在这里插入图片描述

(2)把静态库放到此文件夹中

在这里插入图片描述

然后进行导入依赖库代码的书写,整体代码如下

#include<iostream>
#include"./tou/pch.h"//包含头文件
using namespace std;

#pragma comment(lib/*第一个变量是固定的lib*/,"./ku/jingtaiku.lib"/*第二个变量是引用的那个库的路径(这是个相对路径相对于当前文件夹的路径)*/)//导入依赖库

int main() {

	int c = add(2, 4);
	cout << "2 + 4 = "<<c << endl;

	return 0;
}

四.自己创建一个动态库,并在其他程序中进行使用

1.创建动态库文件

1.创建一个静态库项目

在这里插入图片描述

2.在动态库中写两个函数(一个是加法函数,一个是减法函数)
1.加法函数的声明(写在pch.h文件中)

代码如下

// pch.h: 这是预编译标头文件。
// 下方列出的文件仅编译一次,提高了将来生成的生成性能。
// 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。
// 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。
// 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。

#ifndef PCH_H
#define PCH_H

// 添加要在此处预编译的标头
#include "framework.h"

//添加导出(添加导出之后才能在索引里找到这个函数的实现)
_declspec(dllexport) int add(int a, int b);

//没添加导出的话就找不到这个函数的实现
int sub(int a, int b);
#endif //PCH_H

2.加法函数的定义(写在pch.cpp文件中)
// pch.cpp: 与预编译标头对应的源文件

#include "pch.h"

int add(int a, int b) {
	return a + b;
}

int sub(int a, int b) {
	return a - b;
}
// 当使用预编译的头时,需要使用此源文件,编译才能成功。

3.生成解决方案(生成解决方案时会生成库和索引),通过绝对路径获得动态库和其索引
1.生成解决方案

在这里插入图片描述

2.通过绝对路径获得动态库和其索引

在这里插入图片描述

2.再创建一个新项目用来使用动态库

1.创建一个新项目

在这里插入图片描述

2.使用动态库
使用动态库的步骤
1.包含头文件(如果使用一个函数出现未定义标识符的错误就说明是没有包含头文件)

将pch.h这个头文件放到当前项目所在的文件夹,如下

先在当前文件夹中创建一个用来放头文件的文件夹

在这里插入图片描述

再将pch.h这个头文件放到此文件夹中

在这里插入图片描述

然后还要将framework.h这个头文件放入到此文件夹中,因为在pch.h头文件中用到了framework.h这个头文件

在这里插入图片描述

2.导入依赖库(此时导入的是索引文件)(如果出现无法解析的外部符号就说明编译器能找到函数的声明但找不到函数的是实现,缺少库文件的引用)

先在当前文件夹中创建一个存放库(此时存放的是索引文件)的文件夹再把动态库的索引放到此文件夹中

(1)创建一个存放库的文件夹(此时存放的是索引文件)

在这里插入图片描述

(2)把动态库的索引放到此文件夹中

在这里插入图片描述

然后进行导入依赖库代码的书写,整体代码如下

#include<iostream>
#include"dlltou/pch.h"
using namespace std;

#pragma comment(lib,"./dllku/dongtai_Dll1.lib")


int main() {

	int c = add(2, 4);
	cout << "2 + 4 = "<<c << endl;

	return 0;
}
3.把dll文件拷贝到exe同文件夹下(为了使索引能找到动态库)

在这里插入图片描述

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

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

相关文章

STM32F103标准库硬件IIC+DMA连续数据发送、接收

目录 前言1、AHT20模块的简单了解&#xff08;为了更好的理解程序语句&#xff09;2、了解DMA相关中断标志位以及I2C相对应的DMA通道3、本篇文章提及程序中相关的变量定义提前了解4、DMAIIC数据发送、接收流程及本文所用程序中相关的函数作用提前了解4.1 DMAIIC数据发送、接收流…

qt判断当前日期是不是当月的最后一天

思路就是&#xff1a;将当前日期1&#xff0c;如果月份发生变化&#xff0c;则证明是最后一天 找一个dateTimeEdit&#xff0c;然后选择个日期&#xff0c;如下&#xff1a; 加入测试代码&#xff1a; QDateTime time ui->dateTimeEdit->dateTime();QDateTime nextWeek…

Debezium日常分享系列之:Debezium 2.3.0.Final发布

Debezium日常分享系列之&#xff1a;Debezium 2.3.0.Final发布 一、重大改变二、PostgreSQL / MySQL 安全连接更改三、JDBC 存储编码更改四、新功能和改进五、Kubernetes 的 Debezium Server Operator六、新的通知子系统七、新的可扩展信号子系统八、JMX 信号和通知集成九、新的…

如何查看dll文件内导出函数名称

一 使用VS自带工具 进入VS开发环境&#xff0c;然后Tools -> Visual studio 2017 Command Prompt&#xff0c;打开兼容工具命令提示符&#xff0c; 如果工具 目录下没有命令行提示&#xff0c;可以从开始菜单找到VS的命令行提示符。 cd到dll所在目录&#xff0c;输入命令…

联邦学习综述

《Advances and Open Problems in Federated Learning》 选题&#xff1a;Published 10 December 2019-Computer Science-Found. Trends Mach. Learn. 联邦学习定义 联邦学习是一种机器学习设置&#xff0c;其中多个客户端在中央服务器或服务提供商的协调下协作解决机器学习…

VR会议:远程带看功能,专为沉浸式云洽谈而生

随着科技的不断发展&#xff0c;VR技术已经成为当今市场上较为热门的新型技术之一了&#xff0c;而VR会议远程带看功能&#xff0c;更是为用户提供更加真实、自然的沉浸式体验。 随着5G技术的发展&#xff0c;传统的图文、视频这种展示形式已经无法满足消费者对信息真实性的需求…

存档&改造【04】二维码操作入口设置细节自动刷新设置后的交互式网格内容的隐藏

因为数据库中没有数据无法查看设置效果&#xff0c;于是自己创建了个测试数据表&#xff0c;用来给demo测试 -- 二维码操作入口设置 create table JM_QR_CODE(QR_CODE_ID NUMBER generated as identity primary key,SYSTEM_ID NUMBER(20) not null,IS_ENAB…

中国数字化转型浪潮下,移动钱包成为全球App标配

中国&#xff0c;一个数字化转型极为快速的国家&#xff0c;在电子钱包和移动支付方面处于世界领先地位。 在中国&#xff0c;几乎一半的店内购物都是通过手机进行的&#xff0c;这远高于其他发达市场的水平&#xff08;德国25%&#xff0c;美国24%&#xff09;。移动支付&…

AI情感陪伴 | 数字伙伴为你而在,解锁情感健康的新时代

当我们审视当今社会的变革和进步时&#xff0c;不难发现新一代年轻人正面临着前所未有的多重挑战。其中就涵盖了社交关系的复杂性、学业上的巨大压力、激烈的就业竞争&#xff0c;以及紧迫的环境问题等等。这些挑战不仅深刻地影响着他们的生活品质&#xff0c;还可能引发严重的…

AUTOSAR CAN通信全过程

1、CAN通信概略图和基本概念介绍 应用层APPL、RTE&#xff08;实时运行环境 Runtime Environment&#xff09; 交互层&#xff1a; IPDU multiplexer&#xff1a;协议数据单元复用模块 COM&#xff1a;COMMUNICATION 通信模块 DCM: 诊断通信管理模块&#xff08;Diagnostic C…

多项目并行管理:优化协调策略提高效率

多项目同时进行已然是大部分项目管理者面临的现状了。相比于单项目管理&#xff0c;多项目管理可能会出现项目资源分配不均&#xff0c;项目进度监控难以及沟通协作复杂等问题。 可以通过一款灵活高效得项目管理工具&#xff0c;来帮助您进行多项目管理&#xff0c;比如 Zoho …

SSL证书如何提升网站的安全性和信任度

在今天的数字时代&#xff0c;随着网络攻击的日益增多&#xff0c;确保网站和用户数据的安全变得至关重要。SSL&#xff08;Secure Sockets Layer&#xff09;证书是一个有效的安全解决方案&#xff0c;可以为您的网站提供加密通信通道&#xff0c;并提升其安全性和信任度。下面…

南昌新颜|AIGC艺术之光,历史的魅力与未来的探索

在这个本来稀松平常的周一&#xff0c;我们坐在电脑前&#xff0c;回顾着刚刚过去的两天&#xff0c;仿佛经历了“反方向的钟”。前两天的上班日子&#xff0c;究竟是周几呢&#xff1f;答案不再是简单的星期几&#xff0c;而是“周负二”和“周负一”。因为&#xff0c;我们把…

三、WebGPU Uniforms

三、WebGPU Uniforms Uniform有点像着色器的全局变量。你可以在执行着色器之前设置它们的值&#xff0c;着色器的每次迭代都会有这些值。你可以在下一次请求GPU执行着色器时将它们设置为其他值。我们将再次从第一篇文章中的三角形示例开始&#xff0c;并对其进行修改以使用一些…

Go 字符串操作实战

1. 引言 在现代编程中&#xff0c;字符串处理是不可或缺的一部分。无论是简单的用户界面&#xff0c;还是复杂的数据处理&#xff0c;字符串都扮演着关键的角色。Go语言&#xff0c;作为一个现代的、性能优越的编程语言&#xff0c;为字符串处理提供了一系列强大的工具和功能。…

通过后台系统添加一段div,在div中写一个<style></style>标签来修改div外面的元素的深层元素的样式

先看图 btn元素就是通过后台系统加上的元素,现在需要通过在btn里面写一个style标签来修改grid-nine里面的head元素的高度.开始想通过style来修改,但是不知道怎么去获取这个div外面的元素,想通过js方法去修改,写了script标签加了js代码,但不生效,后面问了才知道,这个项目是vue打…

深度学习笔记之优化算法(六)RMSprop算法的简单认识

深度学习笔记之优化算法——RMSProp算法的简单认识 引言回顾&#xff1a;AdaGrad算法AdaGrad算法与动量法的优化方式区别AdaGrad算法的缺陷 RMProp算法关于AdaGrad问题的优化方式RMSProp的算法过程描述 RMSProp示例代码 引言 上一节对 AdaGrad \text{AdaGrad} AdaGrad算法进行…

重载和重写的区别

方法重载&#xff1a; &#xff08;1&#xff09;在同一个类中 &#xff08;2&#xff09;方法名必须相同 &#xff08;3&#xff09;形参列表必须不同&#xff08;形参类型或个数或顺序&#xff0c;至少有一样不同&#xff0c;参数名无要求&#xff09; &#xff08;4&…

基于SpringBoot的校园社团信息管理系统

目录 前言 一、技术栈 二、系统功能介绍 学生管理 社长管理 社团信息管理 社团新闻管理 社团添加 社团活动 加入社团 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术…

Linux---进程(1)

操作系统 传统的计算机系统资源分为硬件资源和软件资源。硬件资源包括中央处理器&#xff0c;存储器&#xff0c;输入设备&#xff0c;输出设备等物理设备&#xff1b;软件资源是以文件形式保存在存储器上的成熟和数据等信息。 操作系统就是计算机系统资源的管理者。 如果你的计…