web-dev-qa-db-ja.com

Visual C ++の.objファイルから静的および動的ライブラリを構築する方法は?

Visual Studio 2008、Windows764ビットを使用しています。

私は WinBGIm グラフィックライブラリを使用しています。

このライブラリには、いくつかの.objファイルが付属しています。 .libまたは.dllファイルはありません。

それらを静的な.libファイルと動的な.dllファイルに変換したいと思います。

ディレクトリ内のすべての.objファイルをコピーしました。

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\AMD64

ただし、次のコマンドは機能しません。

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\AMD64>lib.exe /out:bgiout.lib *.obj
Microsoft (R) Library Manager Version 9.00.21022.08
Copyright (C) Microsoft Corporation.  All rights reserved.

LINK : fatal error LNK1104: cannot open file 'bgiout.lib'

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\AMD64>

どうやってするか?

13
user366312

はい、あなたはそれをすることができます、あなたがそれを持っているのとほとんど同じです。

C:\Code\bgi\obj>lib /out:libbgi.lib *.obj

LIB( lib.exe )は、静的ライブラリを作成するために使用されます。 LINK( link.exe/DLL )は、ダイナミックライブラリを作成するために使用されます(.dllとインポートライブラリ.libを作成します)。

C:\Code\bgi\obj>link /DLL /out:bgi.dll *.obj [additional libs]

link /DLLコマンドを使用する場合、追加のWin32およびC++標準ランタイムライブラリ(MSVCRT.libおよびUser32.libなどおよびMFCライブラリなど)が必要になります。

この場合;これは正しいリンカー引数のようです。

C:\Code\bgi\obj>link /DLL /out:bgi.dll *.obj MSVCRTD.lib User32.lib Gdi32.lib ole32.lib Comdlg32.lib OleAut32.lib

:ビルドされたオブジェクトファイルはデバッグバージョンであるため、ここで使用するのはMSVCRTD.lib(Dに注意)です。上記のコマンドを使用して、.dllと静的.libの両方を正常にリンクすることができました。

追加のインクルードパスとライブラリパス。

これらの出力を他のビルドに配布する場合、追加のヘッダーとライブラリパスをターゲットビルドに含める必要がある場合があります。インクルードおよびライブラリ検索パスに場所を追加するには、環境変数(INCLUDEおよびLIB)を(ユーザーごとまたはシステム全体で)追加できますが、これらはで指定することもできます。次のように /I および /LIBPATH を介したコマンドライン。

cl /IC:\Code\include [additional options] main.cpp
link /LIBPATH:C:\Code\lib [additional options] xyz.lib

ガイドライン;

  • 「VisualStudio」コマンドプロンプトを開始します。2008を指定すると、スタートメニューの「VisualStudio2008コマンドプロンプト」にリンクが表示されます。このバッチファイルは、C++ビルド用の正しい環境をセットアップします。 x86またはx64ターゲットの正しいツールチェーンと一致していることを確認してください。
  • オブジェクトファイルを含むディレクトリに移動します。
  • (上記のように)お持ちのコマンドを実行します。

エラーLNK1104

あなたが持っているエラー LNK1104 は、ユーザーが「ProgramFiles」ディレクトリ内にファイルを書き込むための十分な権限を持っていないことが原因である可能性が高いと思います。それ以外の場合は、ターゲットに不適切なツールチェーンを使用するとエラーになる可能性があります(x86とx64)。

通常は、独自のディレクトリでこれを行うことをお勧めします。例: "C:\ Code\bgi"

24
Niall

最新のC++コンパイラは、必要なライブラリに関する情報を埋め込みます。 Visual Studioの場合、.objファイルには依存するC++ライブラリ(/ MT/MD/MTd/MDd)への参照が含まれています。これらのライブラリの実装はわずかに異なり、互換性がありません。唯一の選択肢は、サポートされているビルドモードごとにソースコードまたは複数の.objファイルを用意することです。

1
mksteve