我最近通过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}
)
答案 0 :(得分: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é