1

他のモジュール (exe および dll) で使用されることになっているコンストラクターと共にクラスを公開するライブラリー (dll) があります。そのクラスを他のライブラリ モジュールからインスタンス化することはできますが、exe モジュールからインスタンス化することはできません。リンク中に「エラー LNK2019: 未解決の外部シンボル」というリンカ エラーが発生します。exe プロジェクトではなく、他のライブラリ プロジェクトで使用するとリンクが成功する理由がわかりません。誰かがこれで私を助けることができますか?

以下はクラス宣言です。

class __declspec(dllimport) MyException
{
public:
MyException(unsigned int _line, const char *_file, const char *_function, MyExceptionType _type, const wchar_t* _message = 0, ...);
};

これはエラー全体です: error LNK2019: unresolved external symbol "__declspec(dllimport) public: __cdecl MyException::MyException(unsigned int,char const *,char const *,enum MyException::MyExceptionType,unsigned short const *,... )" (_ imp ??0MyException@@QAA@IPBD0W4MyExceptionType@0@PBGZZ) 関数で参照される "public: __thiscall MyClassUsesMyException::MyClassUsesMyException(class SomeClass *,int)" (??0MyClassUsesMyException@@QAE@PAVSomeClass@@H@ Z)

MyClassUsesMyException は 'MyApp.cpp' でインスタンス化されています。

ありがとう、ラケシュ。

4

1 に答える 1

0

更新:wchar_t必ずしもネイティブではない

かなり長い間情報を交換し、OP からもう少し情報を取得した後、問題は次のように不可欠です。

class __declspec(dllimport) MyException
{
public:
    MyException(unsigned int _line, 
        const char *_file, 
        const char *_function, 
        MyExceptionType _type, 
        const wchar_t* _message = 0, // <<== note wchar_t type
        ...);
};

Visual C++ はwchar_t、ネイティブ型として扱うかどうかを構成できます。ネイティブ タイプとして扱われない場合unsigned shortは、指定された マクロ置換 ですwchar_t。リンカは、上記の関数が解決できないと不平を言っていましたが、実際に私の目を引いたのは、未定義のシンボルの末尾にあるものでした:

,unsigned short const *,...)

に注意してくださいunsigned shortwchar_tこれは、EXE のコンパイル時にコンパイラが非ネイティブを使用していたことを示唆しています。DLL がwchar_tネイティブとして構成されてコンパイルされた可能性があると考えたため、別の署名が導入され、リンク時に一致しませんでした。

これが問題だったことに驚いたなら、Rakesh と私がどれほど驚いたか想像してみてください =P


元の回答

そのクラスは、宣言の適切なインポート/エクスポート状態を判断するためのプリプロセッサ ロジックを持つ単一の共通ヘッダーにある必要があります。そのようです:

MyDLL.h

#ifndef MYDLL_H
#define MYDLL_H

// setup an import/export macro based on whether the 
//  DLL implementing this class is being compiled or
//  a client of the DLL is using it. Only the MyDLL.DLL
//  project should define MYDLL_EXPORTS. What it is 
//  defined as is not relevant. *That* it is defined *is*.

#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif

class MYDLL_API MyException
{
    // your class definition here...
};

#endif

次に、例外を実装する DLL プロジェクト (およびそのプロジェクトのみ) で、プロジェクト構成のプリプロセッサ定義リストに MYDLL_EXPORTS を追加します。

于 2013-02-18T05:29:08.443 に答える