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

Nar*_*uto 2 c++ dll dllimport dllexport

谷歌搜索后,我开始知道Dllimport可以为其他模块提供该功能,

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

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

DLL中存在的函数是dllexport吗?

Ove*_*Ove 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:如何编组C++类.我在许多项目中都使用过解决方案A.

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


Jer*_*fin 8

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

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

所以,在典型的情况下,你会有类似的东西:

#ifdef BUILDDLL
#define DLL declspec(dllexport)
#else
#define DLL declspec(dllimport)
#endif
Run Code Online (Sandbox Code Playgroud)

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

DLL int dosomething(int);
Run Code Online (Sandbox Code Playgroud)

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

  • @LLL假设您正在制作两个项目:MyDLL和MyApp.您在MyDLL中定义一个函数,并将MyDLL.dll文件导入MyApp.exe并从那里调用该函数.你需要在MyDLL项目中使用`__declspec(dllexport)`(标记你正在导出函数.你需要在MyApp项目中使用`__declspec(dllimport)`来从DLL导入函数. (3认同)
  • @Ben:如果要构建一个DLL,该DLL导出自己的某些功能,并从其他DLL导入某些功能,则是的,每个都需要使用不同的名称。 (2认同)