在代码中见到declspec(dllexport)和declspec(dllimport) ,网上搜索学习了一下,明白了其具体含义与用法,自己总结的同时也希望能够帮助同样困惑的朋友。
阅读本篇文章,将会掌握以下内容:
- declspec(dllexport)和declspec(dllimport) 的使用说明
- 动态库文件dll的创建
- 动态库文件dll的调用
一、创建动态库文件
1.打开VS2012,创建解决方案“dllTest”.
2.创建WIN32控制台应用程序“dll”,其中“应用程序类型”选择DLL,空项目即可。
3.添加头文件dll.h,并输入以下代码:
#ifndef DLL_H
#define DLL_H
#ifdef DLL_EXPORTS //如果在工程里已经添加预定义宏DLL_EXPORTS
#define DLLEXPORT __declspec(dllexport) //那DLLEXPORT就指代__declspec(dllexport) 用于dll的导出
#else //当工程中不包含DLL_EXPORTS预定义时
#define DLLEXPORT __declspec(dllimport) //DLLEXPORT 就指代__declspec(dllimport)
#endif
DLLEXPORT int add(int ,int);
#endif
注释:
(1)如果在工程里添加预定义宏DLL_EXPORTS,那DLLEXPORT就指代__declspec(dllexport),用于dll的导出(函数 变量 类等),例如:
导出变量用 __declspec(dllexport) int a;
导出函数用 __declspec(dllexport) void foo();
导出类用 class __declspec(dllexport) a{};
(2)如果应用程序需要调用dll中的函数,则需要用__declspec(dllimport)修饰,因此当工程中不包含DLL_EXPORTS预定义时,DLLEXPORT 就指代__declspec(dllimport),这样生成dll程序和调用dll的程序可以使用同一个头文件
(ps:工程中会自动添加一个DLL_EXPORTS预定义,在属性—c\c++ —preprocesspr里面)
4.添加源文件dll.cpp,并输入以下代码:
#include "dll.h"
int add(int x,int y)
{
return x+y;
}
5.编译生成,则工程的debug目录下就生成了.dll和.lib文件。
二、调用动态库文件
1.在同一解决方案下,创建WIN32控制台应用程序,命名为“calldll”,空项目即可。
2.创建添加源文件calldll.cpp,并输入以下代码:
#include "dll.h"
#include <iostream>
int main()
{
int z;
int x=1, y=2;
z=add(x,y);
std::cout<<z<<std::endl;
}
3.工程属性进行以下设置:
(1)C/C++: “附加包含目录”,添加dll.h头文件目录;
(2)链接器--常规: “附加库目录”,添加上面生成的dll.lib文件的目录;
(3)链接器--输入:“附加依赖项”,添加上面生成的dll.lib文件。
4.按照如上操作,即可成功生成并运行。即完成dll动态库的调用。
注:
如果编译通过后用行,提示丢失dll.dll文件的错误信息。
解决:将dll.dll放在和exe同一目录下或放在c:\windows\system32目录下(Win64位操作系统且dll.dll不是64位而是32位的话放在c:\windows\syswow64目录下)
The End
注:
1.感谢参考博客http://blog.sina.com.cn/s/blog_a7e72e940101izkh.html
2.实例代码已经上传,供大家下载参考。http://download.csdn.net/detail/kaige2111/9451234