使用しているDLLからMSVCインポートライブラリを作成するSTDCALL
-
25-09-2019 - |
質問
私はその輸出
DLLを持っていますextern "C" __declspec(dllexport) int __stdcall Foo( void );
DLLショーのダンプ
******************************************************************************
Section: Exports
File Offset: 00001400 (5120)
Flags: 00000000
Time Stamp: 00000000
Major Version: 0000
Minor Version: 0000
Exports from simple.dll
3 exported name(s), 3 export addresse(s). Ordinal base is 1.
Sorted by Name:
RVA Ord. Hint Name
-------- ---- ---- ----
00002104 3 0000 std::nothrow
00001258 2 0001 Foo
000020F8 1 0002 ___CPPdebugHook
******************************************************************************
私は、次のDEFファイルを使用して起動しました
LIBRARY simple.dll
EXPORTS
Foo
これは、次の輸出とのlibファイルを作成します
Exports
ordinal name
_Foo
私はこのライブラリとリンクするとは、MSVCリンカはそれを_fooを見つけることができないと文句を言い@ 0。この問題を解決するには、私はDEFファイルにエイリアスを追加しました。
LIBRARY simple.dll
EXPORTS
Foo
Foo@0=Foo
どの輸出とlibのファイルに結果
Exports
ordinal name
_Foo
_Foo@0
問題なく今のプロジェクトへのリンク。私はそれを実行しようとすると、しかし、私はメッセージを取得します。
「0 @プロシージャエントリポイントのFooは、ダイナミックリンクライブラリsimple.dllに配置することができませんでした」
それは私がLIB.EXEに語っていても0 @ fooはfooの別名であること、それはまだ試行名前で「0 @ foo」をロードすることをインポートライブラリを作成します。
表示されるように私が尋ねられたとき、「フー」負荷へのインポートライブラリを取得する方法がある「fooは@ 0」?
おかげで、
デビッド
解決
あなたは別名を使用しようと正しい考えを持っていた...
「(それは単に等号の後の部分を無視します)LIBは、エイリアスフォームを受け入れていないようです; 2)それはDEFファイル__cdecl内のすべての機能を想定して、実際には2点目の嘘インポートライブラリということ。接頭辞、アンダースコアと内部名にDLL内の各シンボルをマッピングします生成、すなわち、しようとするインポートライブラリを使用して、リンカは、DLL内のシンボル関数に未定義のシンボル_functionを解決します。それは__stdcall呼び出しの特別な世話をしていません大会。いくつかのテクニックで、私たちは__stdcall関数のインポートライブラリーを作製するためにLIBを使用することができますが、呼び出し元が唯一の名前ではなく、序によってそれらを呼び出すことができます。詳細は、運動:-)として残っています。」 ( http://wyw.dcweb.cn/stdcall.htm の)
の代わりにエイリアスを使用しての順序を使用します(あなたの例を使用して):
LIBRARY simple.dll
EXPORTS
Foo
Foo@0 @2 ;(from your dumpbin)
私の仕事:)