谷歌搜索后,我知道 Dllimport 使该功能可用于其他模块,
是否必须使用 extern "c" 标识符声明函数?
此外,Dllexport 表示,Dll 本身在编译时使用该函数。所以默认情况下所有
DLL 中存在的函数是 dllexport?
__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。
否 - 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 的链接,而不是尝试从标准库之类的某个地方满足这些功能。
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.