【计算机网络】 静态库与动态库

这篇具有很好参考价值的文章主要介绍了【计算机网络】 静态库与动态库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

库有两种:静态库(.a、.lib)和动态库(.so、.dll)。所谓静态、动态是指链接。静态库是将整个库文件都拷贝到可执行文件中了,而动态库只是将索引文件拷贝到可执行文件中,可以通过索引文件找到动态库文件。

静态库实践

使用方法

首先我们用vs创建一个静态库,再创建之后我们发现会自动生成4个文件(两个头文件,两个源文件)

【计算机网络】 静态库与动态库,计算机网络(网络编程),计算机网络

先来看pch.h文件

一进去会给出一些注释
【计算机网络】 静态库与动态库,计算机网络(网络编程),计算机网络

其实意思就是在这个文件中加载头文件和声明函数的

然后framework.h中是定义宏的

pch.cpp里就是对pch.h中声明的函数进行定义

最后那个自己命名的文件就是测试文件

比如我们想创建一个加法函数,那么首先我们在pch.h中声明这个函数

【计算机网络】 静态库与动态库,计算机网络(网络编程),计算机网络

然后在pch.cpp中进行实现

【计算机网络】 静态库与动态库,计算机网络(网络编程),计算机网络

因为库不能执行,所以不能点击本地调试器,我们可以点击生成中的生成解决方案,这样就不会报错了

【计算机网络】 静态库与动态库,计算机网络(网络编程),计算机网络

点击后我们就可以看到生成了一个.lib文件,也会显示出它的路径

【计算机网络】 静态库与动态库,计算机网络(网络编程),计算机网络

可以在这条路径中找到静态库文件

【计算机网络】 静态库与动态库,计算机网络(网络编程),计算机网络

那么我们要怎么使用这个静态库呢?

我们需要再打开一个解决方案,创建一个空项目,然后添加一个源文件,我们想在这个源文件中使用刚才在静态库中添加的函数

【计算机网络】 静态库与动态库,计算机网络(网络编程),计算机网络

在没做任何操作的时候会出现一个未定义标识符的错误,因为不认识这个函数(当前项目里没有这个函数),解决办法就是添加头文件,那么头文件在哪呢,在我们刚才那个项目的路径中可以找到那个pch.h,然后在pch.h中还调用了framework.h

【计算机网络】 静态库与动态库,计算机网络(网络编程),计算机网络

所以将这两个个文件拷贝到当前项目中,然后添加头文件
【计算机网络】 静态库与动态库,计算机网络(网络编程),计算机网络

此时我们可以看到不再报错,但是如果要运行还是不可以,会出现“无法解析的外部符号”的错误,因为这个函数目前只有声明,并没有定义实现,解决办法是添加库依赖

先将刚才生成的库拷贝到当前路径下

这里为了使项目看起来更清晰整洁,我们可以创建两个文件夹,一个用来放头文件,一个用来放库文件
【计算机网络】 静态库与动态库,计算机网络(网络编程),计算机网络

那么这样我们在添加的时候就需要稍微寻找一下路径,这里涉及到绝对路径和相对路径:

  • 相对路径:./(当前路径下)或者是…/(当前文件夹向上一层)
  • 绝对路径:从盘符开始的路径,比如:E:\20230105\静态库与动态链接库\network_1_01_applyLib

使用:只有当前项目使用的文件,要随着项目的移动一起移动,放到同一个解决方案里,使用相对路径;
操作系统提供的文件,使用绝对路径。

添加库依赖:

【计算机网络】 静态库与动态库,计算机网络(网络编程),计算机网络

最后再加上system(“pause”);,这样就可以运行了

【计算机网络】 静态库与动态库,计算机网络(网络编程),计算机网络

总结

使用步骤:

  1. 把头文件拷贝到当前项目中,添加头文件依赖
  2. 把库文件拷贝到当前项目中,添加库文件依赖

动态库实践

使用方法

先创建一个动态链接库文件,与静态库一样,这里也有四个文件

【计算机网络】 静态库与动态库,计算机网络(网络编程),计算机网络

我们在这个文件中写两个函数(为了比较),一个加法函数,一个减法函数

我们在声明减法函数的前面写上_declspec(dllexport),因为只有声明导出,才会在索引文件中生成索引

【计算机网络】 静态库与动态库,计算机网络(网络编程),计算机网络

实现这两个函数

【计算机网络】 静态库与动态库,计算机网络(网络编程),计算机网络

然后我们旋转生成解决方案,可以看到,生成了一个.lib索引文件和一个.dll

【计算机网络】 静态库与动态库,计算机网络(网络编程),计算机网络

我们去对应路径下找到他们,然后拷贝到静态库实践中我们创建的那个测试项目中,当然那两个头文件也需要拷贝过来

【计算机网络】 静态库与动态库,计算机网络(网络编程),计算机网络

如果是静态库,到此为止已经可以正常执行了,但我们在运行的时候发现会出现找不到dll文件的错误,原因是我们需要将dll拷贝到exe同文件下
【计算机网络】 静态库与动态库,计算机网络(网络编程),计算机网络

这样就可以了

【计算机网络】 静态库与动态库,计算机网络(网络编程),计算机网络

我们知道静态库有一个优点,就是在库文件更新时,只需要重新编译库并把库提供给别人,别人不需要重新执行可执行文件就可以执行exe

我们在刚才动态库中的代码修改一下,然后重新生成一下
【计算机网络】 静态库与动态库,计算机网络(网络编程),计算机网络

再将用户的exe同文件下的dll替换就可以,我们点击exe可以发现执行结果已经做出改变

【计算机网络】 静态库与动态库,计算机网络(网络编程),计算机网络

总结

使用步骤:

  1. 把头文件拷贝到当前项目中,添加头文件依赖
  2. 把索引文件拷贝到当前项目中,添加索引文件依赖
  3. 把dll拷贝到exe同文件下

静态库与动态库的优缺点

静态库
优点

运行速度比动态库快

缺点
  1. 浪费内存空间,当多个应用程序依赖同一个静态库,在内存中要拷贝多份
  2. 更新部署发布比较麻烦,修改静态库代码,不止要重新编译库文件,还需要重新编译整个可执行文件
动态库
缺点

运行速度比静态库慢文章来源地址https://www.toymoban.com/news/detail-700797.html

优点
  1. 节省内存空间,当多个应用程序依赖同一个动态库,在内存中只需要拷贝一份
  2. 更新部署发布简单,修改动态库,只需要重新编译库文件即可,不需要重新编译可执行文件
  3. 动态库在运行的时候才被载入,可以依靠程序控制库文件的载入时间

到了这里,关于【计算机网络】 静态库与动态库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【计算机网络】网络编程套接字(二)

    简单TCP服务器实现 我们将会使用到的头文件放在 comm.h 文件中 创建套接字 创建过程和UDP服务器几乎完全一样,除了使用的是TCP服务器使用的是流式服务(SOCK_STREAM),UDP使用的是数据包服务(SOCK_DGRAM) 服务器绑定 绑定的过程和UDP服务器也是相同的,可以看着复习一下 定义好 st

    2024年02月13日
    浏览(35)
  • 【计算机网络】网络编程套接字(一)

    目录 1.预备知识 1.1.理解源IP地址和目的IP地址 1.2.认识端口号 1.2.1.理解\\\"端口号\\\"和\\\"进程ID\\\" 1.2.2.理解源端口号和目的端口号 1.3.认识TCP/UDP协议 1.3.1.TCP协议 1.3.2.UDP协议 1.4.网络字节序 网络字节序和主机字节序的转换 2.socket编程接口 2.1.sockaddr结构 struct sockaddr_in 的具体结构: 2.

    2024年02月08日
    浏览(37)
  • 【计算机网络】Socket编程

    IP地址:公网IP,用于唯一标识互联网中的一台主机 源IP,目的IP:对于一个报文来讲,从哪来,到哪去。 源IP指将数据发送过来的IP地址,目的IP指将数据发送给下一个设备的IP地址(mac地址的变化) 意义: 指导一个报文该如何进行路径选择,目的IP是让我们根据目标进行路径选

    2024年02月08日
    浏览(34)
  • 【计算机网络】socket编程基础

    因特网上的每台计算机都有一个唯一的IP地址,如果一台主机上的数据要传输到另一台主机,那么对端主机的IP地址就应该作为该数据传输时的目的IP地址。但仅仅知道目的IP地址是不够的,当对端主机收到数据后,对端还需要对该主机作出相应,因此对端主机也需要发送数据

    2024年02月15日
    浏览(35)
  • 【计算机网络】网络编程接口 Socket API 解读(8)

             Socket 是网络协议栈暴露给编程人员的 API,相比复杂的计算机网络协议,API 对关键操作和配置数据进行了抽象,简化了程序编程。         本文讲述的 socket 内容源自 Linux man。本文主要对各 API 进行详细介绍,从而更好的理解 socket 编程。        本文主要描述

    2024年02月08日
    浏览(35)
  • 【计算机网络】网络编程接口 Socket API 解读(6)

             Socket 是网络协议栈暴露给编程人员的 API,相比复杂的计算机网络协议,API 对关键操作和配置数据进行了抽象,简化了程序编程。         本文讲述的 socket 内容源自 Linux man。本文主要对各 API 进行详细介绍,从而更好的理解 socket 编程。 recv()           遵

    2024年02月07日
    浏览(32)
  • 【计算机网络】网络编程接口 Socket API 解读(2)

             Socket 是网络协议栈暴露给编程人员的 API,相比复杂的计算机网络协议,API 对关键操作和配置数据进行了抽象,简化了程序编程。         本文讲述的 socket 内容源自 Linux man。本文主要对各 API 进行详细介绍,从而更好的理解 socket 编程。 遵循 POSIX.1 - 2008    

    2024年02月09日
    浏览(31)
  • 【计算机网络】网络编程接口 Socket API 解读(3)

             Socket 是网络协议栈暴露给编程人员的 API,相比复杂的计算机网络协议,API 对关键操作和配置数据进行了抽象,简化了程序编程。         本文讲述的 socket 内容源自 Linux man。本文主要对各 API 进行详细介绍,从而更好的理解 socket 编程。 poll()           遵

    2024年02月09日
    浏览(33)
  • 【计算机网络】网络编程接口 Socket API 解读(5)

             Socket 是网络协议栈暴露给编程人员的 API,相比复杂的计算机网络协议,API 对关键操作和配置数据进行了抽象,简化了程序编程。         本文讲述的 socket 内容源自 Linux man。本文主要对各 API 进行详细介绍,从而更好的理解 socket 编程。 connect()         

    2024年02月08日
    浏览(32)
  • 【计算机网络】网络编程接口 Socket API 解读(11)

             Socket 是网络协议栈暴露给编程人员的 API,相比复杂的计算机网络协议,API 对关键操作和配置数据进行了抽象,简化了程序编程。         本文讲述的 socket 内容源自 Linux man。本文主要对各 API 进行详细介绍,从而更好的理解 socket 编程。 遵循 POSIX.1-2008      

    2024年02月08日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包