windows下开发时库文件的一些问题

一、静态库和动态库的区别

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导入库可以参考:

lib库知识全面讲解:4 lib导入库有什么用,怎么生成lib导入库和dll?-C++技术网lib库知识全面讲解:4 lib导入库有什么用,怎么生成lib导入库和dll?,为了方便知道dll中的所有函数都在什么位置,就用上了lib导入库。这个导入库记录了dll中的所有函数在dll中的位置,那么我们引入了lib导入库之后,在运行的时候,在加载了dll后,就可以方便的定位需http://www.cjjjs.com/article/201510250529375三、动态库定义和使用(export import)

参考:C++动态库封装及调用_SetDreamer的博客-CSDN博客_c++动态库一直对动态库的封装理解不是很透彻,虽然之前写过一个Demo,不过并没有真正的理解。所以写下来,帮助自己理解下。1、一个程序从源文件编译生成可执行文件的步骤:预编译 -->  编译 -->  汇编 --> 链接(1)预编译,即预处理,主要处理在源代码文件中以“#”开始的预编译指令,如宏展开、处理条件编译指令、处理#include指令等。(2)编译过程就是把预处理完的文件进行一系列词法https://blog.csdn.net/zhangfuliang123/article/details/71515796

其中要注意条件编译语句:

// 下列 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(dlhttps://blog.csdn.net/Repeaterbin/article/details/4269666如果要定义MYDLL_EXPORTS,在项目的属性中的“C/C++ ->预处理器”中的预处理器定义中写入MYDLL_EXPORTS(肯定也可以在CMake中定义),其他项目则不要定义。参考

declspec(dllexport)和declspec(dllimport) 的使用说明 - 農碼一生 - 博客园一、创建动态文件 1.添加头文件dll.h,并输入以下代码: #ifdef DLL_EXPORTS //如果在工程里已经添加预定义宏DLL_EXPORTS #define DLLEXPORT __dehttps://www.cnblogs.com/wml-it/p/15951995.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值