2011-01-06 100 views
4

我最近通過CMake將測試添加到我的一個項目中。我通過創建另一個可運行我的測試用例的可執行文件來完成此操作。我的項目中的測試用例使用我主應用程序中的代碼。每次我對主應用程序和測試運行器之間共享的源文件進行更改時,都會重新編譯該對象兩次。一次爲主應用程序,第二次爲測試運行者。避免用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作爲項目可執行文件的源代碼,然後爲test-runner可執行文件指定相同的源代碼。而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é