动态库静态库生成及显式隐式调用

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所在的目录

库目录.png

·项目->属性->配置属性->链接器->输入-> 在“附加依赖项”里添加“project2.lib”(若有多个 lib 则以逗号隔开)

lib文件.png

·隐式调用源文件必须加上'#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文件名。

lib.png
上一篇下一篇

猜你喜欢

热点阅读