分享

declspec(dllexport)和declspec(dllimport) 的使用说明

 felwell 2018-06-21

在代码中见到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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
注释:
(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里面)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

4.添加源文件dll.cpp,并输入以下代码:

#include "dll.h"

int add(int x,int y)
{
    return x+y;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

3.工程属性进行以下设置:

(1)C/C++: “附加包含目录”,添加dll.h头文件目录;
(2)链接器--常规: “附加库目录”,添加上面生成的dll.lib文件的目录;
(3)链接器--输入:“附加依赖项”,添加上面生成的dll.lib文件。 
  • 1
  • 2
  • 3

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多