什么是dllspec(dllimport)和dllspec(dllexport)的意思

时间:2012-04-19 06:12:25

标签: c++ dll dllimport dllexport

谷歌搜索后,我开始知道Dllimport使该功能可用于其他模块,

是否必须使用extern“c”标识符声明函数?

另外,Dllexport意味着,Dll本身在编译时使用该功能。所以默认情况下都是

DLL中存在的

函数是dllexport吗?

3 个答案:

答案 0 :(得分:19)

__declspec(dllexport)导出符号。它使它可以从DLL外部获得。

__declspec(dllimport)导入符号。它实际上说“此符号未在此应用程序中定义,需要从DLL文件导入”。

您不必使用extern "C"声明它。如果不使用extern "C",则符号将作为C ++符号导出,并且您只能从C ++(以及支持调用C ++ DLL的语言)调用它。如果使用extern "C",则符号将作为C符号导出,您可以从支持Caling C DLL的语言中调用它。

如果要在C#中使用DLL,则需要使用extern "C"

这是一个很好的教程,向您展示如何在C#中使用C ++ DLL:How to marshal a C++ class。我在许多工作项目中使用过解决方案A.

此外,这里有一个关于如何在另一个C ++应用程序中使用C ++ DLL的简短教程:How to create and use DLL in C++

答案 1 :(得分:8)

否 - dllexport意味着您从DLL(或从可执行文件)导出它,以便其他模块(DLL或可执行文件)可以使用该功能。

dllimport用于声明在DLL中实现的函数(或者,再次,可执行)。

因此,在一个典型的情况下,你会有类似的东西:

#ifdef BUILDDLL
#define DLL declspec(dllexport)
#else
#define DLL declspec(dllimport)
#endif

然后每个公共函数将DLL标记为DLL

DLL int dosomething(int);

然后,当您构建DLL时,您将定义BUILDDLL,将所有这些功能标记为dllexport。否则,您将在需要使用该功能的客户端代码中包含相同的标头。它不会定义BUILDDLL,所以它们都会被标记为dllimport,所以当涉及到链接时,它会创建一个指向该DLL的链接,而不是试图从某个地方满足这些功能。标准库。

答案 2 :(得分:0)

它还意味着在exe,dll..files中创建条目(以静态导入和导出表的形式)(通过链接器),它记录了提供者和使用者之间的依赖关系。