【问题标题】:C++/CLI Windows Forms - creating custom DLL libraryC++/CLI Windows 窗体 - 创建自定义 DLL 库
【发布时间】:2013-07-27 22:06:53
【问题描述】:

今天我想制作自己的动态库。我正在使用 VC++ 2010。尝试应用控制台示例(来自http://msdn.microsoft.com/en-us/library/ms235636%28v=vs.80%29.aspx)但我一直失败。以下是我遵循的步骤:

  • 创建 Win32 项目并从向导中选择 Empty Project、DLL,
  • 创建一个标题

    // FILE: bday.h
    #ifndef BDAY_H_
    #define BDAY_H_
    
    #ifdef BUILD_DLL
    #define PORT_DLL __declspec(dllexport)
    #else
    #define PORT_DLL __declspec(dllimport)
    #endif
    
    namespace Tests
    {
        public class BDay
        {
        public:
            static PORT_DLL double Foo(double);
        };
    };
    #endif
    
  • 创建一个 .cpp 来实现该类,
  • 构建成功的这个项目。

那我去

  • 创建 Windows 窗体项目,添加对之前创建的 .dll 的引用,
  • 包含上一个项目中的 bday.h。
  • 定义 BUILD_DLL 常量,
  • 添加一个在单击时调用 Tests::BDay::Foo 的按钮。

构建这个项目给了我

1>CoreResGen:
1>  Processing resource file "Form1.resX" into "Debug\generatory2.Form1.resources".
1>generatory2.obj : error LNK2028: unresolved token (0A00000F) "public: static double __cdecl Tests::BDay::Foo(double)" (?Foo@BDay@Tests@@$$FSANN@Z) referenced in function "private: void __clrcall generatory2::Form1::button4_Click(class System::Object ^,class System::EventArgs ^)" (?button4_Click@Form1@generatory2@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)
1>generatory2.obj : error LNK2019: unresolved external symbol "public: static double __cdecl Tests::BDay::Foo(double)" (?Foo@BDay@Tests@@$$FSANN@Z) referenced in function "private: void __clrcall generatory2::Form1::button4_Click(class System::Object ^,class System::EventArgs ^)" (?button4_Click@Form1@generatory2@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)
1>C:\Users\Patryk\Documents\Visual Studio 2010\Projects\generatory2\Debug\generatory2.exe : fatal error LNK1120: 2 unresolved externals

一定是我做错了什么,你能指出错误在哪里吗?

【问题讨论】:

    标签: winforms visual-studio-2010 c++-cli


    【解决方案1】:

    如果您想将其引用为 .Net 类和方法,则需要这样做。
    dll 导出/导入用于非托管代码。 (在您的情况下为原生 c++)。

    在 c++ 项目中,您必须使用匹配的 .lib 文件编译 .dll,然后链接 lib 文件以便找到该函数。

    另一方面,在 .Net 库中,您只需要引用 dll。但为此需要将其编译为 .Net 库。

    使用 /CLR 标志编译 dll。并使该类成为引用 .Net 类:

    namespace Tests
    {
        public ref class BDay
        {
        public:
            static double Foo(double);
        };
    };
    

    .Net 不需要 declspec 导出和导入

    【讨论】:

    • 这按预期工作。谢谢你这么简单明了的解释
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多