__declspec(dllimport)和__declspec(dllexport)的区别

一、区别:

首先:

首先要知道,头文件是C++的接口文件,不仅本工程需要使用头文件来进行编译,给其他工程提供dll的时候也要提供此dll的头文件才能让其他人通过编程的方式来使用dll。记住:头文件要给自己用还要给别人用

头文件中声明了方法

在提供者那里,方法应该被声明为__declspec(dllexport)。

在使用者那里,方法应该被声明为__declspec(dllimport)。

 

二、使用方法:

使用条件编译:定义一个变量,针对提供者和使用者,设置不同值。

若要导出,__declspec(dllexport)关键字必须出现在调用约定关键字的左边(如果指定了关键字)。

例如:__declspec(dllexport) void __cdecl Function1(void);

若要导出类中的所有公共数据成员和成员函数,关键字必须出现在类名的左边,若要提高代码的可读性,请为__declspec(dllexport)定义一个宏,并对正在导出的每个符号使用该宏:

#define DllExport   __declspec( dllexport )

具体如下所示:

#ifdef _LABEL_API_EXPORT_ 
#define LABEL_IMG_API __declspec(dllexport) 
#else
#define LABEL_IMG_API __declspec(dllimport) 
#endif 

#include <string> 
using std::string;

 class LABEL_IMG_API ImgLabel 
{ 
}
}

三、具体的原理

DLL可以使用两种方法将公共符号导入到应用程序中或从 DLL 导出函数: 

1、生成 DLL 时使用模块定义 (.DEF) 文件。
模块定义 (.DEF) 文件是包含一个或多个描述各种 DLL 属性的 Module 语句的文本文件。如果不用 __declspec(dllimport) 或 __declspec(dllexport) 导出 DLL 函数,则 DLL 需要 .DEF 文件。

2、使用 __declspec
32 位版的 Visual C++ 用 __declspec(dllimport) 和 __declspec(dllexport) 取代以前在 16 位版的 Visual C++ 中使用的 __export 关键字。

注意:不使用 __declspec(dllimport) 也能正确编译代码,但使用 __declspec(dllimport) 使编译器可以生成更好的代码。编译器之所以能够生成更好的代码,是因为它十分清楚函数是否在 DLL 中,因此可以生成跳过间接级别的代码,而在跨 DLL 边界的函数中通常存在这些间接代码。但是,必须使用 __declspec(dllimport) 才能导入 DLL 中使用的变量。

如果有正确的 .DEF 文件 EXPORTS 节,则不需要 __declspec(dllexport)。

参考:

http://blog.sina.com.cn/s/blog_a7e72e940101izkh.html

 https://blog.csdn.net/kesalin/article/details/1612998?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

https://blog.csdn.net/bytxl/article/details/46313581?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-3

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值