【问题标题】:Export Unmanaged Classes from a Visual C++ DLL?从 Visual C++ DLL 导出非托管类?
【发布时间】:2010-11-15 13:09:50
【问题描述】:

使用 Visual C++ 2008 创建 DLL 时,我有几个选择。我可以创建一个“类库”,据我了解,它实际上会给我一个使用 C++ 的 CLI(托管)扩展的 .Net 库。

因为我不希望这样,并且我假设我需要一个静态 .LIB 文件来链接到另一个 Visual C++ Windows 可执行项目,所以我选择了“Win32 项目”,并在“应用程序设置”面板上指定了一个 C++ (无 MFC)DLL。

这将创建一个带有 .cpp 文件的项目,该文件应该是我定义 “DLL 应用程序的导出函数”的位置

这似乎也不是我想要的。基本上,我正在寻找的是本机 C++ 等价物,在 C# .NET 中是类库程序集。我想将一些类打包到 DLL 中,然后通过包含 DLL 项目头文件并链接到 .LIB 来解析引用,从而使 .EXE 项目使用 DLL 的类

通常的做法是什么?

【问题讨论】:

    标签: visual-c++ dll class-library name-decoration


    【解决方案1】:

    你做得对。您需要用__declspec(dllexport) 标记您的类,以使它们可从项目外部使用。构建项目时,您将生成一个 .DLL 和一个 .LIB。

    【讨论】:

    • 太棒了。另一边也有类似的方法来导入?
    • 看看自动生成的代码做了什么。它实际上基于预编译器指令对 dllexport/import 进行宏处理,因此消费者不必考虑导入与导出。
    • 查看我的回答,详细了解 ctacke 所说的内容 (stackoverflow.com/questions/1179103/…)
    • 谢谢。这阐明了向导生成的头文件中的注释。
    【解决方案2】:
    • 创建一个新项目
    • Visual C++:Win32:Win32 项目
    • 应用程序设置选择 DLL 并选中“导出符号”

    当您生成项目时,它会为您生成一个导出的类,通常命名为 C{MyLib}。

    【讨论】:

      【解决方案3】:

      制作 C++(无 MFC)DLL 是对的。您可以创建您的类,您定义的那些入口点将从该 DLL 中导出,以供其他 C++ 代码(例如,用 C++ 编写的 Win32 应用程序)使用。

      由于编译器会自动将 C++ 名称修改为奇怪而奇妙的值,因此如果 DLL 的客户端是 C 程序等,将它们按原样导出是不切实际的。但如果一切都在 C++ 中,你应该没问题。

      如果您创建一些类,您可以选择将它们动态链接(作为 DLL),但您需要一个包含 DLL 符号定义的导入库(为您自动创建)。您还可以选择从应用程序静态链接到您的代码 - 在这种情况下,您最终会得到一个静态库(也是 .LIB),其中包含您的类中的实际目标代码,而不是 DLL 中的符号。

      当然,DLL 的优点是,如果您使用您的库编写多个应用程序,它们都可以共享 DLL;对于静态库,它们每个都包含您的库代码的副本。

      【讨论】:

        【解决方案4】:

        我认为这篇文章描述了您正在尝试做的事情: http://www.codeproject.com/KB/mcpp/usingcppdll.aspx

        就我个人而言,我也更喜欢导出 C 函数(与 C++ 相对),我将 this 指针显式化以避免必须关心编译器特定的方法名称修饰和暴露编译器生成的函数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-01-07
          • 2013-08-17
          • 2015-09-18
          • 2011-04-29
          • 1970-01-01
          • 2010-10-14
          相关资源
          最近更新 更多