27

Visual Studio2005でコンパイルされているネイティブC++ライブラリ(Win32、MFCなし)がいくつかあり、多くのソリューションで使用されています。

それらを使用している特定のソリューションのニーズに応じて、静的ライブラリまたはDLLのいずれかとしてコンパイルおよびリンクすることを選択できるようにしたいと思います。

これを行うための最良の方法は何ですか?私はこれらのアプローチを検討しました:

1.複数のプロジェクトファイル

  • 例:「foo_static.vcproj」と「foo_dll.vcproj」
  • Pro:新しいライブラリ用に簡単に生成できます。手動でvcprojを変更する必要はありません。
  • 短所:2か所の設定やファイルリストなどが簡単に同期しなくなります。

2.単一のプロジェクトファイル、複数の構成

  • 例:「Debug|Win32」と「DebugDLL|Win32」など。
  • 長所:ファイルリストの同期を維持するのは簡単です。コンパイルオプションの同期を維持するのはやや簡単です
  • 短所:Win32とスマートデバイスの両方のターゲット用にビルドしているので、すでに複数の構成があります。組み合わせ爆発を悪化させたくない(「FooPhone用の静的ライブラリ| WinMobile 6」、「FooPhone用のダイナミックライブラリ| WinMobile 6」、「BarPda用の静的ライブラリ| WinMobile6」など)。
  • さらに悪い点:VS 2005には、プラットフォーム「Foo」用に定義された構成がある場合、ソリューション内の他のすべてのプラットフォームにそれが本当に必要であり、構成/プラットフォーム構成のすべての順列を無計画に挿入すると想定するという悪い習慣があります。有効かどうかに関係なく、影響を受けるvcprojファイル。(バグはMSに提出され、WONTFIXとしてクローズされました。)

3.単一のプロジェクトファイル、vspropsファイルを介して静的または動的を選択

  • 例:適切なvcprojフラグメントをプロパティシートファイルに保存し、静的ライブラリが必要な場合は「FooApp静的ライブラリ」プロパティシートをconfig / platformの組み合わせに適用し、DLLが必要な場合は「FooAppDLL」プロパティシートを適用します。
  • 長所:これは私が本当にやりたいことです!
  • 短所:それは不可能のようです。 静的ライブラリと動的ライブラリを切り替える.vcproj属性(Configuration要素のConfigurationType属性)は、.vspropsファイルでオーバーライドできないようです。これらのファイル用にMicrosoftが公開しているスキーマには、<Tool>要素と<UserMacro>要素のみがリストされています。

編集:誰かがそれを提案した場合に備えて、私は#3のより「賢い」バージョンも試しました。ここでは、「2」(DLL)または「 4 "(静的ライブラリ)、および.vcprojの構成をに変更しましたConfigurationType="$(ModuleConfigurationType)"。Visual Studioは、警告なしにサイレントに属性を削除し、。に置き換えますConfigurationType="1"。とても役に立ちました!

私はより良い解決策を逃していますか?

4

7 に答える 7

6

私は何かを見逃しているかもしれませんが、DLL プロジェクトをファイルなしで定義し、他のプロジェクトによって作成された lib にリンクさせることができないのはなぜですか? そして、設定に関しては、vsprop ファイルでそれらを除外できます...

于 2011-01-08T16:07:34.370 に答える
5

1 つのプロジェクトで静的バージョンと dll lib バージョンの両方を作成する簡単な方法があります。

dll プロジェクトを作成します。次に、次の操作を行います。

lib ツールを実行する nmake makefile または .bat ファイルを作成するだけです。基本的に、これはこれだけです:

lib /NOLOGO /OUT:<your_lib_pathname> @<<
<list_all_of_your_obj_paths_here>
<<

次に、プロジェクトで、コマンドが .bat ファイル (または nmake または perl) を実行するだけの Post Build Event を追加します。次に、常に dll と静的ライブラリの両方を取得します。このためのツールがリンカーの直前のプロジェクト (ツール フロー) に存在することを許可しないことで、ビジュアル スタジオを中傷することは差し控えます。

于 2011-08-24T20:42:27.427 に答える
2

これが行われる典型的な方法は、上記の選択肢2だと思います。これは私が使用しているものであり、多くの図書館や企業で行われているものです。

それがうまくいかない場合は、必ず他のものを使用してください。

幸運を。

于 2008-12-17T22:42:13.527 に答える
2

私は2つの構成方法を好みます。

プロジェクト プロパティ ウィンドウの [すべての構成] 項目を使用して、すべての共通設定をセットアップします。設定を分離した後。そして、それは完了です。コーディングしてみましょう。

また、指定された構成を順番にビルドする「バッチビルド」という非常に優れた機能もあります。

于 2008-12-18T09:07:36.540 に答える
0

複数のプロジェクトが最善の方法です。これは、私が遭遇したプロジェクトの中で最も広く見られた構成です。

そうは言っても、makeファイルから呼び出すことができる外部ツール(カスタムvbscriptなど)からその場でvcprojファイルを変更することにより、3番目のオプションを実装することも可能かもしれません。シェル変数を使用して、ツールの動作を制御できます。

ビルドを作成するには、引き続きVisual Studioを使用する必要があることに注意してください。makefileは、modを作成する必要がある場合にのみ外部ツールを起動し、その後に実際のビルドコマンドを実行する必要があります。

于 2008-12-18T03:03:02.920 に答える
-1

バージョン 1 を使用して、スクリプトなどを使用して、最初のプロジェクト ファイルのセットから 2 番目のプロジェクト ファイル セットを生成してみませんか。そうすれば、違いは dll または静的ライブラリを構築するために必要な部分に過ぎないことがわかります。

于 2008-12-18T08:35:41.720 に答える