0

今日は、独自の動的ライブラリを作成したいと考えていました。VC++ 2010 を使用しています。コンソールの例 ( http://msdn.microsoft.com/en-us/library/ms235636%28v=vs.80%29.aspxから) を適用しようとしましたが、失敗し続けます。私が従う手順は次のとおりです。

  • Win32 プロジェクトを作成し、空のプロジェクト、ウィザードから 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

私が間違っていることがあるはずです。エラーがどこにあるのか指摘してもらえますか?

4

1 に答える 1

2

.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 エクスポートとインポートは必要ありません

于 2013-07-27T19:36:48.067 に答える