(转)静态编译,动态编译,静态链接库,动态链接库

1.定义
LIB文件中包含函数代码本身,在编译时直接将代码加入程序当中。称为静态链接库static link library。
LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。
静态链接库包括两个文件:
(1).h头文件,包含静态链接库中说明输出的类或符号原型或数据结构。应用程序调用静态链接库时,需要将该文件包含入应用程序的源文件中。
(2).lib文件,放到固定位置,在应用程序中添加库目录,在附加依赖项中进行添加。
动态链接库包括三个文件:
(1).h头文件,包含动态链接库中说明输出的类或符号原型或数据结构的.h文件。应用程序调用动态链接库时,需要将该文件包含入应用程序的源文件中。
(2).lib文件,是动态链接库在编译、链接成功之后生成的文件,作用是当其他应用程序调用.dll时,需要将该文件引入应用程序,否则产生错误。如果不想用.lib文件或者没有.lib文件,可以用WIN32 API函数LoadLibrary、GetProcAddress装载。
(3).dll文件,真正的可执行文件,开发成功后的应用程序在发布时,只需要有.exe文件和.dll文件,并不需要.lib文件和.h头文件。
2. .lib文件和.dll文件区别
(1).lib是编译时用到的,.dll是运行时用到的。如果要完成源代码的编译,只需要静态链接库;如果要使动态链接的程序运行起来,只需要动态链接库。
(2)如果有.dll文件,那么.lib一般是一些索引信息,记录了.dll中函数的入口和位置,.dll中是函数的具体内容;如果只有.lib文件,那么这个.lib文件是静态编译出来的,索引和实现都在其中。使用静态编译的.lib文件,在运行程序时不需要再挂动态库,缺点是导致应用程序比较大,而且失去了动态库的灵活性,发布新版本时要发布新的应用程序才行。
(3)动态链接的情况下,有两个文件:一个是.lib文件,一个是.dll文件。.lib包含被.dll导出的函数名称和位置,.dll包含实际的函数和数据,应用程序使用.lib文件链接到.dll文件。在应用程序的可执行文件中,存放的不是被调用的函数代码,而是.dll中相应函数代码的地址,从而节省了内存资源。.dll和.lib文件必须随应用程序一起发行,否则应用程序会产生错误。如果不想用.lib文件或者没有.lib文件,可以用WIN32 API函数LoadLibrary、GetProcAddress装载。

1.静态编译:编译器在编译可执行文件时,把需要用到的对应动态链接库(.so或.ilb)中的部分提取出来,链接到可执行文件中去,
使可执行文件在运行时不需要依赖于动态链接库. 静态lib将导出声明和实现都放在lib中。编译后所有代码都嵌入到宿主程序。

2.动态编译: 动态编译的可执行文件需要附带一个的动态链接库,在执行时,需要调用其对应动态链接库中的命令。所以其优点一
方面是缩小了执行文件本身的体积,另一方面是加快了编译速度,节省了系统资源。缺点一是哪怕是很简单的程序,只用到了链接
库中的一两条命令,也需要附带一个相对庞大的链接库;二是如果其他计算机上没有安装对应的运行库,则用动态编译的可执行文
件就不能运行。
动态lib相当于一个h文件,是对实现部分(.dll文件)的导出部分的声明。编译后只是将导出声明部分编译到宿主程序中,运行时
候需要相应的dll文件支持。

动态链接库:
创建一个动态链接库,会生成x.dll,x.lib
动态链接库有两种加载方式:
1.一种是静态加载,就是在编译的时候就载入动态链接库。此种方法可调用类方法.
可执行程序静态加载动态链接库需要三个文件 x.dll, x.lib, x.h
可执行程序的头文件加入:

include “x.h”

pragma comment(lib,”x.lib”)

编译时还要附加库目录,防止程序编译时无法找到x.dll。

2.动态加载
只需要x.dll文件。
在程序执行需要该动态链接库的地方加载x.dll。
然后获取需要的x.dll库里面的函数或数据.
该方法不能调用类方法.

可执行程序调用了动态链接库,其运行不能缺少动态链接库.

静态链接库:
创建一个静态链接库,会生成x.lib文件
想要调用静态链接库里面的内容需要x.lib文件和x.h文件
库中内容会直接编译到x.exe文件中。
可执行程序使用静态库编译成x.exe后,x.exe的运行就不在需要静态链接库了,可以独立运行了。

一般的静态编译可以理解为加载静态链接库;动态编译理解我加载动态链接库。
静态链接库中不能包含其他库,动态链接库中能包含其他库。

猜你喜欢

转载自blog.csdn.net/qq_38350514/article/details/82315192