1. 静态库的使用需要库的开发者提供.h和.lib文件,使用者需要把这两个文件拷贝到调用静态库的工程目录下。
2. 静态库的编译:先新建一个静态库工程,然后再新建一个.h和.cpp文件,对这两个文件进行编译就会生成.lib文件。
3. 静态库的使用需要特殊的方式:
eg #include <stdio.h>
#include " lib.h"
#pragma comment(lib," libTest.lib") //这句话的作用是链接时把.lib文件该工程中的.obj文件链接到一起
int main(int argc,char *argv[])
{
printf("2+3=",add(2,3));
}
4. 动态库的使用需要库的开发者提供.dll和.lib文件,或.dll文件。动态库.dll文件中包含导出函数:可以被应用程序所调用;内部函数:不能被应用程序所调用。所以动态库的使用比静态库多出了一点即需要特殊的声明。
5. 动态库的编译:新建一个动态工程,再新建一个.h文件
#ifndef LIB_H
#define LIB_H
extern "C" int __declspec(dllexport)add(int x,int y); //__declspec(dllexport)的作用既特殊的声明add()为动态库中的导出函数。
#endif
新建一个.cpp文件
#include "lib.h"
int add(int x,int y)
{
return x+y;
}
编译就会生成.dll文件,将.dll文件拷贝到你的当前工作目录
动态库的动态调用:需要用到LoadLibrary—Dll加载函数,
GetProcAddress-Dll导出函数的地址获取,FreeLibrary-Dll卸载
eg #include <stdio.h>
#include <windows.h>
typedef int(*lpFunAdd)(int x,int y);//定义指向函数的指针
int main(int argc,char *argv[])
{
HINSTANCE hdll;定义一个句柄
hdll=LoadLibrary(”名称.dll”);
lpFunAdd addFun;//函数指针
if(hdll!=NULL)
{
addFun=(lpFunAdd)GetProcAddress(hdll,”add”);
if(addFun!=NULL)
{
int result=add(2,3);
printf(“%d”,result);
}
FreeLibrary(hdll);
}
return 0;
}
动态函数的静态调用: 使用更加广泛简单
#include <stdio.h>
#include <windows.h>
#pragma comment(lib,"libtest2.lib")
extern "C" __declspec(dllimport)add(int x,int y);
int main(int argc,char *argv[])
{
int result=add(2,3);
printf("%d",result);
return 0;
}
动态函数的静态调用需要完成两步:1.告诉编译器与dll文件相对应的.lib文件所在位置,.lib文件中包含了.dll文件中的导出函数的文件名和序号,并不包含实际代码,在应用程序中代替.dll文件进行编译2.声明导入函数 extern "C" __declspec(dllimport)add(int x,int y);
.lib,.h,.dll文件的区别??
1. DllMain函数,windows在加载dll函数时需要一个入口函数,在之前的例子中没有用到是因为系统在找不到DllMain函数时会从其他库中引用一个不做任何操作的DllMain,并不意味着不需要DllMain函数。(默认从其他动态库中加载一个DllMain)该函数不属于导出函数,而是内部函数。
DllMain.cpp:
#include <stdio.h> //printf函数需要
#include <windows.h> // APIENTRY等需要
BOOL APIENTRY DllMain(HANDLE hModule,
DWORD _ul_reason_for_call,
LPVOID lpReserved
)
{
switch(_ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
printf("\nprcess attach of dll");
break;
case DLL_THREAD_ATTACH:
printf("\nthread attach of dll");
break;
case DLL_PROCESS_DETACH:
printf("\nprocess detach of dll");
break;
case DLL_THREAD_DETACH:
printf("\nthread detach of dll");
break;
}
return true;
}
编译
和"lib.cpp","lib.h"连接即可生成.dll和.lib文件,动态库的引用在和上面一样。