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拷贝到要使用的目录下,然后在.cpp文件中加上#pragma comment(lib, “dllTest.lib”),然后通过extern 声明引用dll.cpp中的函数。接着编译、链接、执行就会得到结果。对于动态链接库,链接的时候需要.lib文件,运行的时候需要.dll文件。
2.在工程中使用loadLibrary动态的载入dll。
静态库对应的.lib文件叫静态库,本身包含了实际执行代码、符号表等等。当生成可执行文件以后,可执行文件包含所有的代码,因此,在可执行文件运行时就不再需要静态库。但是这样最后的程序占用磁盘空间较大。如果有多个进程在内存中运行,内存中就存有多份相同的库函数代码,因此占用内存空间较多。
动态库对应的.lib文件叫导入库,实际的执行代码位于动态库中,导入库只包含了地址符号表,确保程序找到对应函数的一些基本地址信息。最终的可执行文件不包含DLL中的内容,只是通过导入库(.lib)知道了相应的地址信息,因此,可执行文件在运行时动态得去加载DLL。多个应用程序可以同时使用一个dll,有效的节省硬盘空间。
参考文章: