0

古い C/C++ ユーティリティ ライブラリをマネージ IJW DLL に変換しています。リンク エラー LNK2020 を理解しようとしています。/CLR を使用して DLL としてコンパイルされている C/C++ スタティック ライブラリと、ユーティリティ ライブラリ DLL を参照として使用するコンソール アプリがあります。DLL 内のすべての C 関数で未解決のトークンを取得します。ライブラリ DLL にある 1 つの ref クラスのリンク エラーは発生しません。

Error   1   error LNK2020: unresolved token (0A00000B) 
"void __clrcall BwLibM::Reallocx(void * *,unsigned int,class System::String ^,unsigned int)" (
?Reallocx@BwLibM@@$$FYMXPAPAXIP$AAVString@System@@I@Z)  C:\ICL5K\ICL5K\OPENSOUR.obj ICL5K

ユーティリティ DLL アセンブリで dumpbin /exports を使用すると、エクスポートされたシンボルが取得されません。

Microsoft (R) COFF/PE Dumper Version 11.00.50727.1
Copyright (C) Microsoft Corporation.  All rights reserved.

Dump of file bwlibm.dll
File Type: DLL
  Summary
        4000 .data
       26000 .rdata
        1000 .reloc
        3000 .rsrc
        F000 .text

dumpbin /relocations を使用すると、未定義の関数が表示され、プロトタイプは LNK2020 エラー メッセージと正確に一致します。

FE5  HIGHLOW 100365E4  __mep@
?Reallocx@BwLibM@@$$FYMXPAPAXIP$AAVString@System@@I@Z ([MEP] 
 void __clrcall BwLibM::Reallocx(void * *,unsigned int,class System::String ^,unsigned int))

dumpbin /export の出力に関数が表示されているはずですか? __declspec(dllexport) および __declspec(dllimport) を使用して従来の DLL インポート/エクスポート手法を使用して関数をエクスポートしようとしましたが、エラーが発生しました

エラー 1 エラー C3395: 'BwLibM::Reallocx': __declspec(dllexport) は、__clrcall 呼び出し規約 C:\ICL5K\BwLibM\REALLOCX.CPP 34 1 BwLibM を持つ関数に適用できません

ユーティリティ関数の 1 つのソースは次のようになります。 Reallocx.cpp

namespace BwLibM {
    void Reallocx(void **ptr, size_t nBytesI, System::String^ file, unsigned line)
    {
     . . .
    }
} // namespace BwLibM

===BwLibM.h==

namespace BwLibM {
 . . .
void Reallocx(void **ptr, size_t nBytesI, System::String^ file, unsigned line);
 . . .
}

数か月前に同様の問題を投稿しました。解決策は、ライブラリとアプリケーションの文字セットをマルチバイトに設定することでした。この場合、DLL とコンソール アプリはマルチバイト文字セットに設定され、リンカー エラーは持続します。

4

0 に答える 0