动态库静态库生成及显式隐式调用
2020-10-26 本文已影响0人
冀望的air
动态库
首先新建一个dll动态库
1.png
然后建立一个.h头文件,加入函数
#ifdef 函数名_EXPORTS
#define 函数名_API __declspec(dllexport)
#else
#define 函数名_API __declspec(dllimport)
#endif
隐式调用
·项目->属性->配置属性->VC++ 目录-> 在“包含目录”里添加头文件project2.h所在的目录
配置头文件.png
·项目->属性->配置属性->VC++ 目录-> 在“库目录”里添加头文件project2.lib所在的目录
·项目->属性->配置属性->链接器->输入-> 在“附加依赖项”里添加“project2.lib”(若有多个 lib 则以逗号隔开)
·隐式调用源文件必须加上'#define TESTDLL_EXPORTS//不进行宏定义,或提示链接不一致,导致隐式调用失败'
显式调用
直接上函数
dllfun lucky; //先是定一个函数指针 dllfun;然后通过GetProcAdress来获取函数的地址
HINSTANCE hDLL; //定一个句柄实例,用来取DLL的实例地址
hDLL = LoadLibrary("C:\\Users\\Pomelo\\Desktop\\caculater\\caculator\\Debug\\multiply.dll");//加载动态链接库MyDll.dll文件;
if (hDLL == NULL) //取的地址要判断,返回的句柄是否为空,
{ //如果为无效句柄,那么要释放加载DLL所占用的内存
printf("无法载入dll\n");
FreeLibrary(hDLL);
return 0;
}
lucky = (dllfun)GetProcAddress(hDLL, "?Multiply@@YAMMM@Z"); //参数是DLL的句柄和你要调用的函数名
if (lucky == NULL) //这里也要判断要函数指针是否为空,如果没取到要求的函数,那么要释放句柄
{
printf("无法获取函数地址\n");
FreeLibrary(hDLL);
return 0;
}
c1 = lucky(a, b); //调用compute函数,指向函数运算结果
cout << a << "*" << b << "的值为:" << c1 << endl; //输出最后计算结果
FreeLibrary(hDLL);
静态库
静态库建立方法和动态库一样,选择静态库。
静态库的调用只需要在属性中vc/c++添加包含目录(.h文件路径)和库目录(.lib)文件路径,连接器常规加入依赖项.lib文件名。