一、静态库和动态库的区别
1.该库是否被编译进目标(程序)内部。静态库在编译阶段就被获取并整合到了目标(exe)文件之中,生成可执行文件较大,简单升级也需要重新编译整个文件;动态库的代码在可执行程序运行时才载入内存,在编译过程中仅简单的引用,所以最后生成的可执行文件相对较小,升级时很多时候只需要重新编译生成特定库文件并替换。
2.库代码载入时间不同。静态库在生成可执行程序的过程中就被载入,动态库在可执行程序运行时,内部代码才被载入。
3.设计思路不同。静态库链接的时候把库直接加载到程序中,而动态库链接的时候,它只是保留接口,将动态库与程序代码独立,这样就可以提高代码的可复用度和降低程序的耦合度。
4.使用不同。生成可执行程序后,静态库就不再被需要,也无需发送给用户;动态库在使用时被需要,需要和可执行程序一起发送给用户。
(实际上静态库和动态库也都是由.o文件创建的)
这部分有两点需要注意(个人理解)
1)本部分提到的所有编译,指的均是包括预处理、编译、汇编、链接的宏观过程,而不是指其中的编译这一个生成汇编代码的过程,很多网上资料直接写编译很容易引起误导,并且实质上将库和目标文件整合的是链接这一过程。
2)目标文件.o指的是汇编生成的文件,而本部分提到的所有目标(程序)文件应该指的是链接后形成的可执行(exe)文件。
二、静态编译的lib文件和动态编译lib文件的区别
创建动态库时,可以发现除了dll文件,同时也生成了一个lib文件,此时的lib文件不是静态库文件(本身的体积也很小),而是lib导出库。即:lib库实际上分为两种,一种是静态链接lib库或者叫做静态lib库,另一种叫做动态链接库dll库的lib导入库或称为lib导入库。
二者区别:
- 静态库本身就包含了实际执行代码、符号表等等,而对于导入库而言,其实际的执行代码位于动态库中
- 导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。
动态库一般会有对应的导入库,方便程序静态载入动态链接库,否则你可能就需要自己LoadLibary调入DLL文件,然后再手工GetProcAddress获得对应函数了。有了导入库,你只需要链接导入库后按照头文件函数接口的声明调用函数就可以了。
lib导入库可以参考:
其中要注意条件编译语句:
// 下列 ifdef 块是创建使从 DLL 导出更简单的
// 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 MYDLL_EXPORTS
// 符号编译的。在使用此 DLL 的
// 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
// MYDLL_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
// 符号视为是被导出的。
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
extern "C" MYDLL_API double seekArea(int r, int h);
关于dllimport定义的必要性可以参考
__declspec(dllexport)与__declspec(dllimport)_huangyimo的博客-CSDN博客___declspec(dllimport)区别 他们都是DLL内的关键字,即导出与导入。他们是将DLL内部的类与函数以及数据导出与导入时使用的。 dllexport是在这些类、函数以及数据的申明的时候使用。用他表明这些东西可以被外部函数使用,即(dllexport)是把 DLL中的相关代码(类,函数,数据)暴露出来为其他应用程序使用。使用了(dllexport)关键字,相当于声明了紧接在(dllexport)...
https://blog.csdn.net/huangyimo/article/details/81748939?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-3-81748939-blog-7481481.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-3-81748939-blog-7481481.pc_relevant_default&utm_relevant_index=6__declspec(dllimport)_Repeaterbin的博客-CSDN博客___declspec(dllimport)2007-09-18 15:14我相信写WIN32程序的人,做过DLL,都会很清楚__declspec(dllexport)的作用,它就是为了省掉在DEF文件中手工定义导出哪些函数的一个方法。当然,如果你的DLL里全是C++的类的话,你无法在DEF里指定导出的函数,只能用__declspec(dllexport)导出类。但是,MSDN文档里面,对于__declspec(dl
https://blog.csdn.net/Repeaterbin/article/details/4269666如果要定义MYDLL_EXPORTS,在项目的属性中的“C/C++ ->预处理器”中的预处理器定义中写入MYDLL_EXPORTS(肯定也可以在CMake中定义),其他项目则不要定义。参考
本文详细介绍了静态库和动态库的区别,包括它们的加载时机、代码整合方式以及设计思想。同时阐述了静态编译的lib文件与动态编译lib文件的不同,特别是动态库中的导入库作用。文中还提到了动态库的定义和使用,以及__declspec(dllexport)和__declspec(dllimport)的关键字用法,强调了条件编译在创建DLL时的重要性。
http://www.cjjjs.com/article/201510250529375
https://www.cnblogs.com/wml-it/p/15951995.html

9万+

被折叠的 条评论
为什么被折叠?



