1

現在、2 つの異なるネイティブ Visual-C++ プロジェクト (コンパイラ設定がまったく同じ) が中間ファイル (obj、pch、...) を共有できるかどうかを調べようとしています。

例が役立つはずです:

これは通常のセットアップです。

PROJECTS \ P1 \ p1.vcproj; p1.cpp; ...
              \ Release_Intermediate_Dir \ p1.obj
                                         \ tool1.obj
         \ P2 \ p2.vcproj; p2.cpp; ...
              \ Release_Intermediate_Dir \ p2.obj
                                         \ tool1.obj
         \ COMMON \ tool1.cpp; ...

このセットアップはどうですか:

PROJECTS \ P1 \ p1.vcproj (uses: p1.cpp; p1_main.cpp)
              \ p1_test.vcproj (uses: p1.cpp; p1_test.cpp)
              \ Release_Intermediate_Dir \ p1.obj      (used by both projects p1 and test)
                                         \ tool1.obj
                                         \ p1_main.obj (only p1.vcproj)
                                         \ p1_test.obj (only p1_test.vcproj
         \ COMMON \ tool1.cpp; ...

2 つの C++ プロジェクトに同じ中間フォルダーを使用して、objファイルを直接共有することはできますか?

それとも、追加の静的 lib プロジェクトが常に必要ですか? (私が理解している限り、静的ライブラリは単なるobjファイルのコンテナーです。)


なぜ私はこれをしたいのですか?このブログ記事を見てください:ネイティブ C++ 用の Visual Studio でのユニット テストの記述

2 つの異なる実行可能ファイル (必要に応じてメイン関数) を持つという唯一の目的で、静的ライブラリを使用します。(マネージド/CLIのことは忘れてください。)これは、同じコンパイル設定で同じコードを共有するが異なるメイン/スタートアップを使用する2つのプロジェクトだけが本当に必要な場合に、ソリューションに3つのプロジェクトを持つことを意味します(3つのプロジェクトを維持する必要があります)。リギング。

4

1 に答える 1

1

両方のプロジェクトに同じコンパイル フラグを適用し、プロジェクト A の中間体をプロジェクト B の前提条件にすることにより、B からすべての自由度を削除します。B だけをコンパイルする可能性は考えられず、リンクは B に存在理由がないことを示唆しています ' A のテストとは別に、最も簡単でクリーンな解決策は、B のテストを A にマージし、全体を 1 つのプロジェクトにすることです (率直に言って、これはそうです)。

automake の用語では、B の単体テストを check_PROGRAMS として宣言し、プログラムをチェックするためだけにコンパイルします。私は Visual-C++ の専門家ではありませんが、これは明確な解決策であり、VC++ で何らかの方法で実行できるはずです。

補遺: automake の用語を明確にするために、プロジェクトはたとえば次のようになります。

noinst_LTLIBRARIES = libthings-to-test.la libthings-not-tested.la
bin_PROGRAMS = production
check_PROGRAMS = unit_test_a

production_SOURCES = main.cpp
production_LDADD = libthings-to-test.la libthings-not-tested.la
unit_test_a_SOURCES = test.cpp
unit_test_a_LDADD = libthings-to-test.la
libthings_to_test_la_SOURCES = foo.cpp bar.cpp baz.cpp

コードベース全体 (製品コード、共通ライブラリ、テスト) を 1 つのプロジェクト、つまり、完全に構成および配布され、1 つのバージョン番号が付加された 1 つのユニット。エンド ユーザー/ディストリビューターがインストールすると、単一のプログラムproduction.exeがリンクされます。でコンパイルするとmake all、便利なライブラリと必要なオブジェクトがビルド ディレクトリにコンパイルされ、make checkが呼び出されると、単体テストにのみ必要なオブジェクトがコンパイルされ、製品コードがリンクされ、テストが実行されます。繰り返しますが、申し訳ありませんが、これを Microsoft Speak に翻訳できません。

于 2011-09-28T12:09:37.580 に答える