避免使用CMake重新编译常见的目标文件?

时间:2011-01-06 10:53:56

标签: 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} 
)

1 个答案:

答案 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é