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

动态库

首先新建一个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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容