【问题标题】:What is dllspec(dllimport) and dllspec(dllexport) meansdllspec(dllimport) 和 dllspec(dllexport) 是什么意思
【发布时间】:2012-04-19 06:12:24
【问题描述】:

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

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

另外,Dllexport 的意思是,Dll 本身在编译时使用该函数。所以默认情况下都是

DLL 中存在的函数是 dllexport?

【问题讨论】:

    标签: c++ dll dllimport dllexport


    【解决方案1】:

    __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++

    【讨论】:

      【解决方案2】:

      否 -- 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的链接,而不是试图从标准库之类的某个地方满足这些函数.

      【讨论】:

      • dllimport是用来声明一个在DLL中实现的函数?这个DLLimport有什么用?
      • @LLL:它让编译器知道它来自 DLL。来自 DLL 的函数总是通过指针调用,因此编译器必须知道足够的知识才能生成它。
      • @LLL 假设您正在创建两个项目:MyDLL 和 MyApp。您在 MyDLL 中定义一个函数,然后将 MyDLL.dll 文件导入 MyApp.exe 并从那里调用该函数。您需要在 MyDLL 项目中使用__declspec(dllexport)(以标记您正在导出函数。您需要在 MyApp 项目中使用__declspec(dllimport),以从 DLL 中导入函数。
      • 谢谢杰瑞,你能澄清一下吗? #ifdef BUILDDLL 对于每个项目(或解决方案)应该是唯一的,对吧?因此,当您从已构建的 dll 中添加头文件时,您会使用 dllexport 获得正确的头文件,而其他的应该是 dllimport。对吗?
      • @Ben:如果您要构建一个导出自己的一些函数并从其他 DLL 导入一些函数的 DLL,那么是的,每个函数都需要使用不同的名称。
      【解决方案3】:

      这也意味着条目(以静态导入和导出表的形式)是(由链接器)在 exe、dll..files 中创建的,这些文件记录了提供者和消费者之间的依赖关系。

      【讨论】:

        猜你喜欢
        • 2010-09-08
        • 2023-03-08
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-12
        • 2017-06-11
        • 2018-03-05
        相关资源
        最近更新 更多