質問

私はその輸出

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)

私の仕事:)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top