库的基本认识
静态库(Static Library)
- 基本概念:静态库是在编译时链接到目标程序中的库文件。它包含了程序运行所需的所有函数和数据,这些函数和数据会被直接嵌入到最终生成的可执行文件中。静态库通常以
.a
(在Unix-like系统中)或.lib
(在Windows系统中)为文件扩展名。 - 作用:
- 代码重用:静态库允许开发者将常用的代码或功能封装成库,以便在多个项目或模块中重复使用。
- 隐藏实现细节:通过静态库,开发者可以隐藏某些函数或数据的实现细节,只提供必要的接口供其他开发者使用。
- 减小可执行文件大小:虽然静态库本身较大,但多个使用相同静态库的可执行文件在磁盘上的总存储空间可能会减小,因为它们共享相同的代码段。
- 增加编译时间:由于静态库在编译时链接到目标程序中,因此每次编译都会重新处理库中的代码,这可能导致编译时间增加。
- 不便于更新:如果静态库中的代码需要更新,那么所有使用该库的可执行文件都需要重新编译。
动态库(Dynamic Library)
- 基本概念:动态库是在运行时链接到目标程序中的库文件。它包含了程序运行所需的一些函数和数据,但这些函数和数据在程序运行时才会被加载到内存中。动态库通常以
.so
(在Unix-like系统中)或.dll
(在Windows系统中)为文件扩展名。 - 作用:
- 代码重用:与静态库类似,动态库也允许开发者将常用的代码或功能封装成库,以便在多个项目或模块中重复使用。
- 节省磁盘空间:由于动态库在多个可执行文件之间共享,因此可以节省磁盘空间。
- 减少内存使用:当多个程序使用相同的动态库时,它们可以共享内存中的同一份库代码,从而减少内存使用。
- 便于更新:如果动态库中的代码需要更新,只需要替换库文件即可,而无需重新编译使用该库的可执行文件。
- 增加加载时间:由于动态库在程序运行时才链接,因此可能导致程序加载时间增加。此外,如果动态库丢失或损坏,程序将无法正常运行。
总的来说,静态库和动态库各有优缺点,开发者需要根据具体需求选择合适的库类型。例如,在需要隐藏实现细节或减小可执行文件大小的场景中,可以使用静态库;而在需要节省磁盘空间、减少内存使用或便于更新的场景中,可以使用动态库。
文件结构与原理
- 在
dll
项目中,我们建议将函数、类…代码的声明放到.h
的头文件中,而它的具体实现将放到.cpp
文件中。 - 这样做不仅可以让项目的结构更加清晰,而且还起到一个很重要的作用:在
.h
头文件中的代码,可以巧妙利用宏定义,实现动态的声明——头文件为dll
项目的.cpp
文件的函数、类…声明"向外导出",又可以为未来要使用dll
的应用程序声明"向里面导入"。
dll 的创建
创建一个空项目
编写你的代码
- 在
MyDll.h
文件中编写代码:
- 想直接复制粘贴的朋友看这里:
#pragma once
#ifdef MYDLL
#define PORT __declspec(dllexport)
#else
#define PORT __declspec(dllimport)
#endif
PORT int add(int a, int b