2011-01-06 14 views
4

私は最近CMakeを通して私のプロジェクトの1つにテストを追加しました。テストケースを実行する別の実行可能ファイルを作成してこれを実行しました。私のプロジェクトのテストケースでは、メインアプリケーションのコードを使用しています。メインアプリケーションとテストランナーの間で共有されているソースファイルを変更するたびに、そのオブジェクトを2回再コンパイルします。メインアプリケーション用に1回、テストランナー用に2回目。CMakeで一般的なオブジェクトファイルを再コンパイルしないでください。

両方に同じオブジェクトファイルを共有する方法はありますか?

私のCMakeListsファイルは、このようになります。

AUX_SOURCE_DIRECTORY(${SRC_DIR}/game game_SRC) 
AUX_SOURCE_DIRECTORY(${SRC_DIR}/framework/ framework_SRC) 

ADD_EXECUTABLE(${CMAKE_PROJECT_NAME} 
       ${game_SRC} ${framework_SRC}) 

# --- Testing --- 
ENABLE_TESTING() 
AUX_SOURCE_DIRECTORY(${TEST_DIR} test_SRC) 

ADD_EXECUTABLE(${TEST_RUNNER_NAME} 
       ${test_SRC} 
       ${framework_SRC} 
) 

答えて

13

はい、フレームワークを別のライブラリにすることで可能です。今のように、framework_SRCSをプロジェクト実行可能ファイルのソースとして指定し、テストランナー実行可能ファイルと同じソースを指定します。また、CMakeは指定されたソースから両方の実行可能ファイルを単純にビルドします。

さらに悪いことに、CMakeは同じソースファイルが両方の実行可能ファイルでまったく同じに使用されることは容易に想定できません。テストとアプリケーションの間にいくつかの異なるコンパイルフラグがある場合はどうなりますか?

最も簡単な方法は、ライブラリの中にあなたのframework_SRCSをリンクして、リンクの依存関係を指定することです:

ADD_LIBRARY(MyFramework STATIC ${framework_SRCS}) 

ADD_EXECUTABLE(${CMAKE_PROJECT_NAME} 
       ${game_SRC}) 
TARGET_LINK_LIBRARIES(${CMAKE_PROJECT_NAME} MyFramework) 

# --- Testing --- 
ENABLE_TESTING() 
AUX_SOURCE_DIRECTORY(${TEST_DIR} test_SRC) 

ADD_EXECUTABLE(${TEST_RUNNER_NAME} 
       ${test_SRC} 

TARGET_LINK_LIBRARIES(${TEST_RUNNER_NAME} MyFramework) 

は(私が明示的に静的ライブラリを構築することを選んだことに注意してくださいもちろん、あなたがそれを残すことを選ぶことができます。共有ビルドをcmakeまたは強制する)

よろしくお願いします。André

関連する問題