0

DLLとメインの実行可能ファイルがあり、メインの実行可能ファイルがDLLのインポートライブラリからのシンボルにリンクしておらず、DLL .mapファイルのdeclspecが一致しておらず、マングルされたC++名も一致していません。C ++のものをリンクさせることができないときにあなたがする通常のことをしたのに、なぜか理解できません。

私のヘッダーは次のようなものを定義しています:

#ifdef MY_MODULE
#undef CLASS_EXPORT
#define CLASS_EXPORT __declspec(dllexport)
#else
#undef CLASS_EXPORT
#define CLASS_EXPORT __declspec(dllimport)
#endif

私のクラスは正しくエクスポートされているようですが、.mapファイルは私が間違っていると思う奇妙なことを示しています:

    6    ?CreateDataArea@@YAKPAGPBD111PAVCObject@@K@Z (unsigned long __cdecl 
    CreateDataArea(unsigned short *,char const *,char const *,char const *,
    char const *,class CObject *,unsigned long))

上記のマングルされた名前は@@YAK...

リンクエラーは次のとおりです。

1>Device.obj : error LNK2019: unresolved external symbol 
"__declspec(dllimport) public: unsigned long __thiscall 
CCommonMemory::CreateDataArea(unsigned short *,char const *,char const *,
char const *,char const *,class CObject *,unsigned long)" 
(__imp_?CreateDataArea@CCommonMemory@@QAEKPAGPBD111PAVCObject@@K@Z) referenced 
in function "public: __thiscall CDevice::CDevice(void)" (??0CDevice@@QAE@XZ)

では、declspecマクロを構成しているときに、マングルされた名前が@@QAEK異なるのはなぜですか。また、マクロで定義されているときに.mapファイルに __thiscall呼び出し規約が表示されるのはなぜ__declspec(dllexport)ですか。

__declspec(dllimport / dllexport)マクロを実行するのを忘れたのとまったく同じですが、実行しました。

エクスポートされた各メソッドにCLASS_EXPORTを配置してみましたが、クラス宣言の最初の行で変更せずに試しました。

4

1 に答える 1

1

の定義がCreateDataArea()クラスにスコープされていないようです(つまりCCommonMemory::、関数を定義するときにを省略しました)。

マップファイルに何が入っているかを見ると__cdecl、クラス名「添付」のない関数であることがわかります。

于 2013-03-10T23:33:42.577 に答える