静态库和动态库相关概念

来源:互联网 发布:淘宝客活动怎么取消 编辑:程序博客网 时间:2024/05/16 08:42


静态库
动态库
导入库


delay load
rebase


静态库:

以lib库(obj集合)的形式提供代码重用,需要和客户程序一起编译,成为一个二进制程序体。


动态库:

以二进制的dll提供代码重用,无需和客户程序一起编译。客户程序依赖其导出符号表(lib)。


dll和lib(静态库)在代码上的差别,主要是多了__declspec(dllexport)。

模板类不能导出。



静态链接:
1、#pragma comment(lib, "libname.lib"). 
2、使用additional dependencies添加libname.lib。(同时在Additional Library Directories中设置搜寻位置)。
以上两种方式的libname.lib可以是静态库,也可以是dll的导入库。同时,使用处需要库的头文件。
libname.lib为dll的静态库时,静态库就被引入了,可以编译了。相应被引用的函数和代码都被拷贝到exe中。
libname.lib为dll的导入库时,由于有了符号表和地址,也可以编译了。但函数代码和数据保存在dll中,只在exe被载入时,才把dll加载到内存。
3、是project dependencies设置依赖。相当于加lib。可以加静态库或动态库。
4、直接把lib文件添加到调用者的工程中。(没用过,不确定效果。)


动态链接:

1、LoadLibrary。


DllMain():

这个函数不是必须的。

不提供时,系统给提供一个默认的。(??)


查看dll的导出符合集:

dumpbin.exe /export dllname.dll

查看第三方dll所依赖的dll(特别是RT库的类型):

dumpbin.exe /import thirdparty.dll


dll文件位置:
dll应该放在和exe同目录中,或放在system PATH中。


留意使用的rt库类型:

表6-1 C/C++运行期库

库名描述LibC.lib用于单线程应用程序的静态链接库(当创建新应用程序时,它是默认库)LibCD.lib用于单线程应用程序的静态链接库的调试版LibCMt.lib用于多线程应用程序的静态链接库的发行版LibCMtD.lib用于多线程应用程序的静态链接库的调试版MSVCRt.lib用于动态链接M S V C R t . d l l库的发行版的输入库MSVCRtD.lib用于动态链接M S V C R t D . d l l的调试版的输入库。该库同时支持单线程应用程序和多线程应用程序







原创粉丝点击