C语言 动态链接库&静态链接库

C写的代码最终要想变成可执行文件,需要经过编译链接。

​ 在windows上,.c文件进过编译生成目标文件.obj,再将目标文件链接生成.exe。

​ 对于大型项目,会把程序划分成几个独立的模块,然后每个模块分别编译,在编译之后,由连接器把这些独立的片段“粘接到一起”。

静态链接库

采用静态链接库,lib中的指令都被直接包含在最终生成的EXE文件中。

​ 制作静态链接库

​ 有lib.h和lib.cpp两个文件,编译这个工程得到libTest.lib文件。这个文件就是一个函数库。将lib.h和libTest.lib提交给用户后,用户就能使用这个模块内的函数了。

​ 使用libTest.lib有两种方式:

​ 1.将lib.h和libTest.lib拷贝到工程子目录下。在要使用的.c文件中,加上lib.h头文件引用,加上#pragma comment(lib, “libTest.lib”)。这样就可以调用静态链接库。这句代码的意思是指本文件生成的.obj文件应该和libTest.lib一起链接。

​ 2.在VS工程中,填入库文件libTest.lib路径。也是可行的。

​ 库不能单独执行

​ 库提供一些可以给别的程序调用的内容,别的程序要调用它必须以某种方式指明它要调用。

动态链接库(.dll)

​ 动态链接库可以理解为将源代码编译成目标代码后打成的库。该目标代码库可被其他进程在执行时动态调用。动态链接库在程序执行时动态进行调用和卸载。

​ 制作动态链接库

​ 有dll.h和dll.cpp两个文件,编译生成 dllTest.dll 和 dllTest.lib。

动态库调用

​ 1.将.dll和.lib拷贝到要使用的目录(.lib到.c同级目录, .dll到debug目录)下,然后在.cpp文件中加上#pragma comment(lib, “dllTest.lib”),然后通过extern 声明引用dll.cpp中的函数。接着编译、链接、执行就会得到结果。对于动态链接库,链接的时候需要.lib文件,运行的时候需要.dll文件。

​ 2.在工程中使用loadLibrary动态的载入dll。

.lib文件的区别

​ 静态库对应的.lib文件叫静态库,本身包含了实际执行代码、符号表等等。当生成可执行文件以后,可执行文件包含所有的代码,因此,在可执行文件运行时就不再需要静态库。但是这样最后的程序占用磁盘空间较大。如果有多个进程在内存中运行,内存中就存有多份相同的库函数代码,因此占用内存空间较多。

​ 动态库对应的.lib文件叫导入库,实际的执行代码位于动态库中,导入库只包含了地址符号表,确保程序找到对应函数的一些基本地址信息。最终的可执行文件不包含DLL中的内容,只是通过导入库(.lib)知道了相应的地址信息,因此,可执行文件在运行时动态得去加载DLL。多个应用程序可以同时使用一个dll,有效的节省硬盘空间。