什么是库?
是一个包含可由多个程序 同时使用的代码和数据的文件,不是可执行文件,不能直接执行,一般包含在.dll文件中。库有助于共享数据和资源。
静态链接库:就是你使用的.lib文件,库中的代码最后需要连接到你的楞执行文件中,所以静态连接的可执行文件一般比较大一些。
动态链接库:就是程序 运行时由该程序动态链接调用的函数库,是一些函数、数据和类集合成的可执行模块,我们可以将动态链接库动态地集成到自己的程序中以使用库中的函数,数据和类。
两种库的区别:动态链接发生在程序运行时,动态链接的函数代码不出现在程序的EXE文件中,它仅仅包含了应用程序运行过程中所调用的DLL函数一些最基本信息,而静态链接发生在编译时,静态链接的函数代码实际被插入到程序的EXE文件中。
静态库的编写
visuostudio创建win32工程,静态链接库。
创建.h头文件,
#pragma once
extern "c" int add (int x,int y)
创建.cpp文件,做具体实现。
点击生成后,就会在你指定的目录下生成lib静态库
如何应用静态库?
创建控制台应用程序
#pragma comment(lib,"静态库.lib路径") 或设置链接器->常规->附加库目录->输入->附加依赖项
第二种 用写代码的方式导入静态库(其它的文章描述很多,不多说)
2.动态链接库
.h文件:extern "C" __declspec(dllexport) int add(intx ,int y);
.cpp文件中,实现具体函数。
动态库比静态库多了一个dlldllmain文件,是dll执行的一个入口。
动态库分为显式调用和隐式调用。
HMODULELoadLibrary(LPCTSTRlpFileName);
显式链接到DLL,则该函数将指定的DLL映射到调用进程的地址空间中并返回句柄可用于其它功能在显式链接。
FARPROC GetProcAddress(HMODULEhModule,LPCSTRipProcName);
功能:函数检索指定的动态链接库(DLL)中的输出库函数地址。
Bool freeLibrary(HMODULE hModule);
释放 指定的动态链接库资源
隐式调用
将相关文件(.dll,.lib和.h文件)复制到当前工作目录 中,工在工程设置对话框中添加导入库.lib的链接。
项目 属性-->配置属性--->链接器--->附加库目录
项目 属性-->配置属性--->链接器--->输入--->加入lib库文件。
或者 用 #pragma comment(lib,"路径...lib")
显式调用
与隐式链接不同,使用显示链接无需在工程设置中添加 导入库的链接,也不需要将dll文件复制到windows能找到的目录中,而是在程序代码中指定链接库的具体位置 。
动态库
动态库的调用
使用def文件导出函数
.def文件的用途:说明导出函数,并告知编译器不要以修饰后的函数名作为导出函数名,而以指定的函数名导出函数(如函数名func,让编译器处理后函数名仍为func).这样就可以避免由于microsoftVC++编译器的独特处理方式而引起的链接错误。
使用了def文件,导出函数时就不需要extern "C" __declspec(dllexport)了(dll的提供者除了提供dll之外,还要提供头文件,需要在头文件里加extern "C"和调用约定 的,因为使用者需要跟提供者必须遵守同样的规则 。
.def文件一般 只用于导出函数,如果要导出类,则要使用__declspec(dllexport)方式。
.def 文件的规则 : library "库名"
export
导出函数名@1;这是注解
如 库名是 test.lib
则
LIBRARY "test.lib"
EXPORT
add @1
myMax @2
1.添加.def文件
函数的调用约定方式:
__stdcall 方式:使DLL能被其他语言的程序调用,是从右往左压参数,由被调者清理参数的相关堆栈,winpai都采用这种方式。
__cdecl方式:c/c++默认的调用方式(用这种方式导出函数要加extern "C"说明),从右往左压参数,但由调用者清理参数的相关堆栈。这两种方式编译后生成的函数符号方式不同,__stdcall产生的函数形如:_fun@num,而__cdecl方式的函数形如:_fun.