首页 > 代码库 > 关于.h,.lib,.dll文件

关于.h,.lib,.dll文件

1 .h文件:

(1) .h只做声明,编译后不产生代码,#include 完全等价于把 .h 文件拷贝 到 .c 中;

(2)函数定义要放在.c中,而.h只做声明.否则多引用几次,就会发生函数重复定义的错误;

(3)C文件是编译器运行的最小单位,每个C文件会被编译成一个独立的目标文件(二进制);——obj文件

(4)连接器是以目标文件为单位,它将一个或多个目标文件进行函数与变量的重定位,生成最终的可执行文件;

tips:

(1)只有声明没有定义,编译阶段不会报错;

(2).h声明的函数必然能在编译器搜索路径下找到对应的目标文件(.c文件编译后的二进制文件),此时一般为lib或dll形式?,这样可以在提供函数使用的同时隐藏函数源代码。

2 .lib文件

(1)目前以lib后缀的库有两种:一种为静态链接库(Static Library),另一种为动态连接库(DLL,Dynamic Link Library )的导入库(Import Library);

(2)静态库是一个或者多个obj文件的打包,所以有人干脆把从obj文件生成lib的过程称为Archive,即合并到一起。比如你链接一个静态库,如果其中有错,它会准确的找到是哪个obj有错,即静态lib只是壳子;

(3)静态库本身就包含了实际执行代码、符号表等等,导入库的实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。

3 .dll文件

(1)静态调用(隐式调用):动态库一般会有对应的导入库,方便程序静态载入动态链接库,有了导入库,只需要链接导入库后按照头文件函数接口的声明调用函数就可以了;

(2)动态调用(显式调用):使用LoadLibrary调入DLL文件,然后再手工GetProcAddress获得对应函数了;

(3)当程序运行时,操作系统将动态链接库文件一并加载入内存,并映射到程序的地址空间中,这样就保证了程序能够正常调用到库文件中的函数。同时操作系统保证当程序有多个实例运行时,动态链接库也只有一份拷贝在内存中,也就是说动态链接库是在运行期共享的。