3

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

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

此外,Dllexport 表示,Dll 本身在编译时使用该函数。所以默认情况下所有

DLL 中存在的函数是 dllexport?

4

3 回答 3

20

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

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

您不必使用extern "C". 如果您不使用extern "C",则该符号将导出为 C++ 符号,并且您只能从 C++(以及支持调用 C++ DLL 的语言)调用它。如果使用extern "C",则该符号将导出为 C 符号,您将能够从支持校准 C DLL 的语言中调用它。

如果你想在 C# 中使用你的 DLL,你需要使用extern "C".

这是一个很好的教程,向您展示如何在 C# 中使用 C++ DLL:如何编组 C++ 类。我在工作中的许多项目中都使用了解决方案 A。

此外,这里有一个关于如何在另一个 C++ 应用程序中使用 C++ DLL 的简短教程:如何在 C++ 中创建和使用 DLL

于 2012-04-19T06:24:09.907 回答
10

否 - 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 的链接,而不是尝试从标准库之类的某个地方满足这些功能。

于 2012-04-19T06:24:24.963 回答
0

It also means that entries (in the form of static import and export tables) are created (by the linker) in the exe, dll..files, which document the dependencies between a provider and a consumer.

于 2012-05-04T14:22:46.517 回答