一、区别:
首先:
首先要知道,头文件是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)。
参考: