在c语言里,源码需要经过编译才能成为可执行文件
库文件:用于存放可复用的代码块,库文件被添加到c语言项目中后,就可以多次调用其中的函数。大多数程序员并不会直接分享源码,而是分享文件的二进制版本—链接库
链接库:是对库文件源码进行编译打包后得到的二进制文件,但无法独立运行,必须等程序调用才能被载入内存
头文件:说明函数名,入参出参等,告诉编译器一些函数和类型声明信息,以便程序正确的编译链接。
一个完整的c语言项目可能包含多个c文件,项目运行需要经过编译和链接两个过程
编译:编译器分析源码,生成二进制目标文件,会互相调用对方的函数,变量,也可能会调用某些链接库文件中的函数和变量,编译器无法跨文件找到他们的确切存储地址,所以这些文件还无法单独执行
链接:对于各目标文件中缺失的函数或变量(缺失的地址)由链接器负责修复,并最终将目标文件和链接库组成一个可执行文件。
链接器完成链接的方式:
静态链接库lib:在生成可执行文件前完成链接,(拷贝了所有目标文件和静态链接库的指令和数据),生成可独立运行的可执行文件,会浪费内存空间,程序有模块更新,整个程序就必须重新链接后一起运行,对用户不友好。(也可以通过头文件获取静态库的内容,进行预编译,之后的执行会比较快),每个用到库文件的程序都会有一份lib的拷贝,浪费空间,等静态库更新需要重新编译链接。
动态链接库dll:将日标文件组织成一个可执行文件,运行时将需要的库动态载入内存,由动态链接器完成可执行文件和动态文件库的链接。每次程序运行重新链接,会损失部分性能,时间换空间。(源码通过头文件获取动态链接库的内容,在运行过程中调用对应动态链接库的命令)。动态加载库文件并链接代码和资源,多个程序可以共享库文件,易于维护,但运行时加载和链接库文件,运行会比较慢。