1〉导入库与静态链接库差别:导入库一般与dll一起使用,其中导入库包含编译或链接的信息,调用程序在编译和连接时均可以不需要dll的存在,在运行时,则通过导入库中导入到调用程序的信息,可以找到对应dll(导出对应的接口)文件名,进行外部调用;而静态链接库中,包含了符号信息和程序的二进制部分,并在编译的过程中提供符号定义,以及在链接时提供外部对象(.obj)的链接。动态链接库包含两种加载方式:静态加载时的静态库包含了相应文件PE头中的大部分信息,如FILE HEADER,OPTIONAL HEADER等。当link的时候,用来填充EXE文件的PE头,比如在IMAGE_IMPORT_DESCRIPTOR结构中相应dll的名字,引入函数的名字等。当PE LOADER加载EXE的时候,dll也加载,通过引入表就可以知道相应引入函数的偏移地址并填充EXE的PE头。而动态链接时需要时才加载dll,通过引入函数名字直接搜索dll的引出表,得到相应RVA和Base Address就可得到相应引入函数的偏移地址
2> 静态库与动态库的使用
a 如果想要讲第三方的源码包含其中的话,又不需要将第三方的代码生成一个独立的库,一般可以采用静态库的方法,这样就不容易暴露信息,呵呵。我的理解
b 静态调用与文件内函数调用一般,调用过程方便,将调用的接口放在一个统一的头文件下就可以了,所以一般项目目录下有include, lib, bin目录源于此。
c 动态链接库与调用程序是独立的,这样就可以很好的做到各自升级,保持接口不变就可以了;
d 静态链接时,每个调用程序均有一份静态库的副本,而动态链接库基本上可以做到共享一份副本,所以节省了空间。