web-dev-qa-db-ja.com

MSVCを使用してWindowsのコマンドラインからDLLをビルドする方法

私は約20年間Cをやっていますが、DLLを作成したことはありません。私は常に静的にリンクすることを好みました。

コマンドライン-cl.exeなど-とgnumake makefileを使用して、Windowsアプリケーションをビルドします。

DLLをビルドしたいので、混乱しています。

最終的には、.libと.dllの両方になります。 .libには、実行時にDLLを読み込み、その中のコードを使用するスタブコードが含まれています。

私はlibとlinkのコマンドラインを見てきましたが、この出力を生成するために何が行われるべきか正確にはわかりません。

そこで、いくつか質問があります。

ClがDLL用にコンパイルされていることを示すために、追加の引数が必要ですか? (DLLエクスポートされたプロトタイプには__declspec(dllexport)が必要であることを知っています))。

リンクには引数として/ dllが必要であることは知っています。

Lib and linkを実行して、それぞれ.libと.dllを生成しますか、それとも両方を生成しますか?

他に何を知る必要がありますか?

34
user82238

自動的に発生することが判明しました。

関数(/ export、__ declspec(dllexport)など)をエクスポートした場合、リンカーは自動的に.libファイルを生成します(もちろん、リンカーコマンドラインで/ dllが必要です)。

3
user82238

コマンドラインで次を使用します。

cl.exe /LD <files-to-compile>

または、より冗長で明示的なバージョンを好む場合:

cl.exe /D_USRDLL /D_WINDLL <files-to-compile> <files-to-link> /link /DLL /OUT:<desired-dll-name>.dll
36
Ebow Halm

Ebow Halmの答えに似ていますが、エクスポートされた関数と新しいコマンドライン引数をリストするために.defファイルを使用します:

"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\vcvars32.bat" && cl /O2 /Iall /Iyour /Iincludes /D_USRDLL /D_WINDLL /DOTHER_DEFINES <libs> <source files> /LD /Fe<dll name> /link /DEF:<def name>.def

参照:

3
eresonance

ClがDLL用にコンパイルされていることを示すために、追加の引数が必要ですか? (DLLエクスポートされたプロトタイプには__declspec(dllexport)が必要であることを知っています))。

Win3xがなくなってからではなく、__declspec(dllexport)またはエクスポートするシンボルの名前を定義する.DEFファイルのいずれかが必要になります。 .defファイルを使用すると、名前が変更されたシンボルをエクスポートできるため、特別な場合に役立ちます。

リンクには引数として/ dllが必要であることは知っています。

うん。

Libとlinkを実行して、それぞれ.libと.dllを生成しますか、それともリンクは両方を生成しますか?

libは、静的ライブラリを作成するためにのみ使用されます(または、implibに.objを追加するために)Linkは.dllとインポート.libの両方を生成します。

1
John Knoeller

最も簡単な方法は、必要に応じてすべてを設定するMSVCプロジェクトを作成し、ビルドロギングを有効にしてビルドを作成し、すべてのコマンドとその引数のビルドログを分析することです。

0
Sebastiaan M