【发布时间】:2012-04-19 06:12:24
【问题描述】:
谷歌搜索后,我知道 Dllimport 使该功能可用于其他模块,
是否必须使用 extern "c" 标识符声明函数?
另外,Dllexport 的意思是,Dll 本身在编译时使用该函数。所以默认情况下都是
DLL 中存在的函数是 dllexport?
【问题讨论】:
标签: c++ dll dllimport dllexport
谷歌搜索后,我知道 Dllimport 使该功能可用于其他模块,
是否必须使用 extern "c" 标识符声明函数?
另外,Dllexport 的意思是,Dll 本身在编译时使用该函数。所以默认情况下都是
DLL 中存在的函数是 dllexport?
【问题讨论】:
标签: c++ dll dllimport 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:How to marshal a C++ class。我在工作中的许多项目中都使用过解决方案 A。
另外,这里有一个关于如何在另一个 C++ 应用程序中使用 C++ DLL 的简短教程:How to create and use DLL in C++。
【讨论】:
否 -- 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的链接,而不是试图从标准库之类的某个地方满足这些函数.
【讨论】:
__declspec(dllexport)(以标记您正在导出函数。您需要在 MyApp 项目中使用__declspec(dllimport),以从 DLL 中导入函数。
#ifdef BUILDDLL 对于每个项目(或解决方案)应该是唯一的,对吧?因此,当您从已构建的 dll 中添加头文件时,您会使用 dllexport 获得正确的头文件,而其他的应该是 dllimport。对吗?
这也意味着条目(以静态导入和导出表的形式)是(由链接器)在 exe、dll..files 中创建的,这些文件记录了提供者和消费者之间的依赖关系。
【讨论】: