Избегать перекомпиляции общих объектных файлов с CMake? - PullRequest
4 голосов
/ 06 января 2011

Я недавно добавил тестирование через 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} 
)

1 Ответ

13 голосов
/ 06 января 2011

Да, сделав ваш фреймворк отдельной библиотекой. Как и сейчас, вы указываете 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 или использовать общую сборку)

С уважением, Андре

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...