Dll to lib というツールがあることは知っていますが、開発者は $1000 を要求しています。変換する必要があるライブラリは 1 回だけなので、その価格を正当化するのは簡単ではありません。
IMPLIB32.EXE を試しましたが、空の .lib ファイルしか取得できません。どうすればこれを達成できますか? おそらく私は簡単な変換アプリを書くことができますか?
追加1:
Dll は通常、cdecl ではなく stdcall であり、C#、.NET、C++ ではなく、古い C のような言語で記述されています。C++ アプリからそれらを呼び出す必要があります。例としては、SQLite.dll または zlib.dll があります。これらの dll の .lib ファイルにアクセスできません。
追加2:
VS2008 http://floodyberry.wordpress.com/2008/09/08/generating-dll-wrappers/用にこのコードを書き直し 、ここからダウンロード可能なサンプル Dll などを含めました: http://www.transferbigfiles.com/Get .aspx?id=7d86fa0b-6ddc-4f6f-8d31-2c20824aae9a これにより、DLL を作成するプロジェクトが作成されます。Dll をコンパイルしようとすると、リンカ エラーが発生します: AddShow.dll : 致命的なエラー LNK1107: 無効または破損したファイル: 0x300 で読み取れません /2006-March/000664.html 進め方 がわからない。これまでのところ、とても近い
次はこの方法に移ります
http://www.coderetard.com/2009/01/21/generate-a-lib-from-a-dll-with-visual-studio/
引数 /exports C:\path\to\AddShow.dll を指定して dumpbin を実行すると、まったく何も実行されません いくつかの調査の後
http://msdn.microsoft.com/en-us/library/aa446532.aspx common/ide フォルダから mspdb71.dll (現在は mspdb80.dll) が必要なようです。
致命的なエラー LNK1106: 無効なファイルまたはディスクがいっぱいです: 0x6179A をシークできません これらのスレッドは、dumpbin.exe のバージョンが問題である可能性があることを示唆しています
Microsoft (R) COFF/PE Dumper バージョン 9.00.30729.01 を持っています
そこで、Microsoft (R) COFF Binary File Dumper Version 5.12.8078 を試しましたが、成功しませんでした。多くの読書の後、私は近くにいません
http://support.microsoft.com/kb/815645 http://support.microsoft.com/kb/839286 http://markmail.org/message/p5vwzyfyv3bs6z34 http://fixunix.com/programmer/94825-fatal -error-lnk1106-invalid-file-disk-full.html
ProcMon を実行すると、svchost.exe がそれを開こうとして、エラー PATH NOT FOUND で失敗したときに、queryopen と sqlite3.dll の最初の出現が表示されます。パスは C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\SQLITE3.DLL であり、正しいものです。C ドライブのルートに置くと、NAME NOT FOUND エラーが発生します。
C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\link.exe.Local
C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\dumpbin.exe.Local
それぞれlink.exeとdumpbin.exeから。私は Vista ではなく XPSP3 を使用していますが、これが sysinternals に関する私の知識の限界です。これらの .local ファイルは何ですか?
(csrss.exe もいくつかのマニフェスト ファイルを見つけることができません。)
まだ成功していないので、謎が増えるだけです
追加 3:
インストールされた場所 \Program Files\Microsoft Visual Studio 8\VC\bin から dumpbin.exe を実行しようとしましたが、OS は mspdb80.dll が見つからないと言いました。\Program Files\Microsoft Visual Studio 8\Common7\IDE から mspdb80.dll をコピーして、dumpbin.exe を実行しようとしました。
「c1902 プログラム データベース マネージャーが一致しません。インストールを確認してください」というエラーが表示されるようになりました。
\Program Files\Microsoft Visual Studio 8\VC\bin から mspdb80.dll を削除すると、エラーはなくなります。しかし、dumpbin.exe を実行できません。
追加された 4:
次のファイルをフォルダーにコピーすることで、最終的に dumpbin を実行することができました。
dumpbin.exe link.exe lib.exe mspdb80.dll
エラーが発生しました:
致命的なエラー LNK1248: 画像サイズ (FFFFFXXX) が最大許容サイズ (80000000) を超えています
一度ですが、dllを置き換えると修正されました。ひょっとして腐敗したのでは?
次に、手順の次のステップに進みました: http://www.coderetard.com/2009/01/21/generate-a-lib-from-a-dll-with-visual-studio/ http://support .microsoft.com/kb/131313 で、次のエラーが表示されました: ターゲット プラットフォームでサポートされていない警告 lnk4017 ステートメントは無視されました これは、.def ファイルではなく .dll を指定したことが原因であることが判明しました。
結果の .Lib および .exp ファイルは、VS2008 プロジェクトに追加され、コンパイルおよび実行されます。デバッガーはエラーを報告しました: 実行時チェックの失敗 #0 - ESP の値は、関数呼び出し全体で適切に保存されませんでした...
ここで述べたよう に、GameSpy lib の C++ コードからの C# コールバックが成功した後、「Run-Time Check Failure #0 - ESP の値が関数呼び出し全体で適切に保存されませんでした」 は、dll で stdcall を使用し、__cdecl を宣言したためです。アプリ。
extern "C" { // put Dll C function prototypes here
int __cdecl AddTwoNum(int n, double f); // __stdcall
}
したがって、これを __stdcall に変更すると、修正されるはずですが、残念ながらそうではありません。
リンク エラーが表示されるようになりました: error LNK2001: unresolved external symbol _AddTwoNum@12
これは何らかの理由で装飾された関数名です。なんで?
追加された n:
これは、STDCALL 関数を持つ dll を使用して .lib ファイルが作成されたためであることが判明しました。STDCALL は、呼び出し元がスタックをクリーンアップすることを要求するため、引数のバイト数が @ 記号で関数名に追加されます。この場合、合計 12 バイトの 3 つの 4Byte iinteger がありました。
CDECL 呼び出し規約で作成された dll から .lib ファイルを作り直したら、すべて問題ありませんでした。