静态库和动态库的区别以及在C/C++中的调用方法

Linux下QT生成的(.o)、(.a)、(.so)、(.so.1)、(.so.1.0)、(.so.1.0.0)之间的区别

(一)Visual Studio下的静态库lib和动态库dll的区别

1.1项目类型的区别

VS在创建Win32项目时,有以下选项:(1)windows应用程序;(2)控制台应用程序;(3)动态库;(4)静态库;

  • 其中:静态库(.lib)和动态库(.dll)是不可以单独运行的,必须通过其他项目工程调用他们以执行。

1.2什么是静态库(.lib)和动态库(.dll)

静态库(.lib)和动态链接库(.dll)是在Visual Studio(VS)中开发和构建应用程序时使用的两种不同类型的库文件,它们在应用程序开发中有不同的用途和特性。

1.2.1静态库(.lib)

  • 11、静态库文件(.lib)包含的【函数和数据】被编译进一个二进制文件(.lib)。
    在使用静态库时,编译链接可执行文件需要链接器从库中复制这些函数和数据,并把它们和应用程序的其他模块组合起来,创建最终的可执行文件(.exe)。
  • 22、当发布产品时,只需要发布这个可执行文件(.exe),并不需要发布被使用的静态库文件(.lib)。

1.2.2动态库(.dll)

在使用动态库的时候,编译后往往提供两个文件:(import library)引入库文件(.lib)和(.dll)文件。

**虽然引入库文件的后缀名也是(.lib),但与静态库文件(.lib)有着本质的区别。**
  • 11、引入库文件(.lib)包含【DLL导出的函数和变量的符号名】,而动态库文件(.dll)文件包含【DLL实际的函数和数据】
    在使用动态库时,编译链接可执行文件需要链接该DLL的引入库文件(.lib),DLL中的函数代码和数据并不可复制到可执行文件,直到可执行程序(.exe)运行时,才去加载所需的DLL,并将该DLL映射到进程的内存空间中,然后访问DLL中导出的函数。
  • 22、在发布产品时,除了发布可执行文件(.exe)以外,同时还需要发布该程序将要调用的动态链接库(.dll)。
  • 优点: (1)减少了(.exe)文件的大小和对内存空间的需求;(2)该DLL模块可以同时被多个应用程序调用。

1.2.3引入库文件(.lib)的使用说明

  • 11、如果DLL不在内存中,系统将加载其到内存中。
  • 22、当链接Windows程序以产生一个可执行文件时,必须链接由编程环境提供的专门的" 引入库文件 "。引入库文件包含了动态链接库名称和所有Windows函数调用的引用信息。链接程序使用该信息在(.exe)文件中构造一个表,当加载程序时,Windows使用它将调用转换为Windows函数。
  • 两者共同点: 引入库文件的引入方式和静态库一样,要在链接路径上添加找到这些(.lib)的路径。

1.3动态库(.dll)和静态库(.lib)的区别

  • 11、两者都是共享代码的方式。在最终生成的可执行文件(.exe)中,静态库(.lib)中的指令将全部被包含;而(.dll)不会被包含在最终的(.exe)文件中,(.exe)文件执行时可以引用或卸载相对于(.exe)独立的(.dll)文件。
  • 22、静态库中不能再包含其他的动态库或者静态库,而动态库还可以再包含其他的动态库或静态库。
  • 33、静态库与动态库调用规则总结如下:静态库在可执行文件运行之前就已经加载了,而且一直存在到程序关闭;动态库是在运行时加载,故不会一直占着内存,而当(.dll)模块内部更改了,只要替换掉(.dll)即可,优点明显,但如果(.dll)中途丢失或被误删,就无法运行了。
  • 从产品化的角度:发布的算法库或功能库尽可能使用使动态库,方便更新和升级,从而不必重新编译整个可执行文件,只需要新版本的动态库替换掉旧动态库即可。
  • 从函数库集成的角度:若要将发布的所有子库(不止一个)集成为一个动态库向外提供接口,那么就需要将所有子库编译为静态库,这样所有子库就可以全部编译进目标动态库中,由最终的一个集成库向外提供功能。

(二)静态库lib和动态dll的使用

2.1 动态库(.dll)的使用

调用(.dll)包括显示连接和隐式连接两种:隐式连接需要头文件(.h),引入库文件(.lib),动态库文件(.dll);显示连接只需要动态库文件(.dll)即可。而这里的(.lib)仅是编译的时候使用,运行时只用(.dll);

  • 区别:隐式链接虽然实现较简单,但三个文件缺一不可,当只有(.dll)文件的时候就只能采用显式连接。显示连接通过调用API函数来完成对(.dll)的加载与卸载,能更加有效地使用内存,常应用于大型应用程序时开发。

2.1.1添加(.lib)

方法1:通过工程属性配置

  • 11、添加工程引用的(.h)目录:工程->属性->配置属性->c/c+±>常规->附加包含目录。然后添加(.h)的存放目录。
  • 22、添加工程引用的(.lib)路径:工程->属性->配置属性->链接器->常规->附加库目录。然后添加(.lib)的存放目录。
  • 33、添加工程引用的(.lib)文件名:工程->属性->配置属性->链接器->输入->附加依赖项。然后添加(.lib)的文件名。
  • 优缺点:比较繁琐,且不直观;且由于Debug版本和Release版本对应生成的库,可能存放在不同的目录中,故需要做不同的配置。

方法2:使用编译语句

	#ifdef _DEBUG
	#pragma comment(lib,"..\\debug\\LedCtrlBoard.lib")
	#else
	#pragma comment(lib,"..\\release\\LedCtrlBoard.lib")
	#endif
  • 优点:方法直观,方便;可以区分出Debug版本和Release版本的不同目录。通过宏,还可以区分更多版本。
  • 缺点:在指定目录时,容易出错。

方法3:直接添加库文件到工程中.

VS中,切换到" 解决方案资源管理器 " –> 选中要添加(.lib)的工程–>点击右键–>添加–>现有项–>选择(.lib)文件 –> 确定。把(.lib)文件添加到工程文件列表中。
优缺点:简单快捷,最高效;但只适用于在debug版本和Release版本中都使用同一个(.lib)库文件时。

2.1.2添加(.dll)

一般将(.dll)拷贝到(.exe)文件目录下,当然有其他方法添加环境变量PATH,如下:
(1)VS项目->右击属性->配置属性->VC++目录->可执行目录;
(2)VS项目->右击属性->配置属性 ->调试 ->工作目录。设置dll的路径。

2.1.3添加(.h)

  • 方法一:直接添加头文件到项目工程的同一目录下;
  • 方法二:#include 对应的头文件;可以用绝对路径,也可以用相对路口;其中:(./)表示当前目录,而(…/)表示上一级目录;
  • 方法三: 通过VS添加(include)头文件目录,VS中配置如下:
    (1)VS项目->右击属性->配置属性->VC++目录->包含目录
    (2)VS项目->右击属性->配置属性->C/C+±>常规->附加包含目录
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖墩会武术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值