LIB,DLL区别
我们在写项目时会链接(调用)第3方库,或者比如在vs的解决方案solution创建项目project时,不仅可以开发可执行程序exe(可单独运行)(windows/控制台 应用程序),也可以开发自定义库(不可单独运行,只能在应用程序被调用)(DLL动态库,LIB静态库)
库是一个二进制文件,包含了源文件中(.cpp
或 .c)
,头文件相反,头文件仅包含声明信息
静态库(.lib静态库文件)
静态库存储了实际的数据和函数
当编译器链接库时,会从库中复制这些函数,并和我们的应用程序一起组合为exe可执行文件,最终的可执行文件exe会比较大
发布时仅发布这个可执行文件就行
静态链接库中不能再包含其他的动态链接库或者静态库
动态库(.dll动态库文件)辅助文件:(lib引入库/导入库文件)
引入库文件(.LIB)包含DLL导出的函数和变量的符号名,而.DLL文件包含该DLL实际的函数和数据
编译时仅需要链接LIB引入库文件,DLL中的函数代码和数据并不可复制到可执行文件
运行时,会根据LIB的地址符号表,从DLL库查找导出的函数
发布时不仅要发布这个可执行文件,也要发布DLL动态库文件
动态链接库中还可以再包含其他的动态或静态链接 库
优点:
内存优化:只有exe调用了函数时,才会被加载到内存中,从而可以减少exe文件的大小
代码共享/模块化/跨平台兼容性/插件支持:因为并非像静态库一样被复制到exe中,而是调用了什么什么就被加载,因此有较高的灵活性
LIB,DLL库配置
DLL
使用时只能使用dll中导出的函数,未导出的函数只能在dll内部使用
隐式连接
需要三个文件
*.h头文件
需要include 包含导出函数的头文件
- 可以直接写绝对路径
- 可以拷贝到src源码目录下
- 也可以配置项目属性,VC++目录->包含目录,或者,C/C++->常规->附加包含目录
lib引入库
- 可以添加到项目project中,确保选中目标项目,选中要添加的库:”添加”–>”现有项”–>选择lib文件
- 可以配置项目属性,链接器->常规->附加库目录,然后,链接器->输入->附加依赖项(库名)
DLL库
- 直接拷贝,将dll拷贝到运行时目录,与调用者exe文件在同一目录
- 可以配置项目属性,VC++目录->可执行目录,并且,调试 ->工作目录
LIB
*.h头文件
.lib静态库
……和上述一样
DLL库使用
我们要手动控制dll中函数哪些被导出,哪些仅在内部使用,
并且是被导出还是导入,在生成dll的时候我们希望导出,在使用dll时则时希望导入符号
__declspec关键字可以作用于,类,函数,变量
_declspec(dllimport) 导入
__declspec(dllexport)导出
使用时通常通过宏,如果项目定义了DLLEXPORT导出宏,那么宏_DLL_DECLARE_ 即为导出
否则_DLL_DECLARE_为导入
#ifdef DLLEXPORT
#define _DLL_DECLARE_ declspec(dllexport)
#else
#define _DLL_DECLARE_ declspec(dllimport)
名词
编译器:将高级编程语言(如C、C++、Java等)编写的源代码转换为机器语言
IDE集成开发环境:它集成了代码编辑器、编译器、调试器、图形用户界面工具等多种功能,使得开发者可以在一个统一的界面中完成代码编写、编译、调试、运行等所有开发任务。
GCC编译器:支持多种编程语言(如C、C++、Objective-C、Fortran等)和多种计算机体系结构(如x86、ARM等)
MSVC编译器:微软公司开发的C++编译器,提供了丰富的库和工具来支持Windows平台的应用程序开发
MinGW:开源的软件开发工具集,旨在为Windows提供GNU开发环境。
GNU:项目提供了许多库,如libstdc++(GCC的C++标准库实现)、glibc(GNU C Library,GNU的C标准库实现)等