c++ - CppUnit 和 CMake : . cpp 文件被编译两次

标签 c++ cmake cppunit

我目前正在使用 CMake 构建我的项目,并使用 CppUnit 对其进行测试。在我的 CMake 文件中,我创建了两个可执行文件。 sample 是编译后的源代码本身。使用 sample_test 我运行测试。如果我是

这是我的 CMakeLists.txt 的一部分

SET(SAMPLE_ROOT_PATH ${PROJECT_BINARY_DIR})
SET(SAMPLE_SOURCE_PATH ${SAMPLE_ROOT_PATH}/src)
SET(SAMPLE_TEST_SOURCE_PATH ${SAMPLE_ROOT_PATH}/test)
SET(SAMPLE_BIN_PATH ${SAMPLE_ROOT_PATH}/bin)
SET(SAMPLE_EXEC_NAME sample)
SET(SAMPLE_TEST_EXEC_NAME sample_test)

SET(EXECUTABLE_OUTPUT_PATH ${SAMPLE_BIN_PATH})

FILE(GLOB_RECURSE SAMPLE_SOURCE_FILES ${SAMPLE_SOURCE_PATH}/*.cpp)
FILE(GLOB_RECURSE SAMPLE_TEST_SOURCE_FILES ${SAMPLE_TEST_SOURCE_PATH}/*.cpp)
SET(SAMPLE_TEST_SOURCE_FILES ${SAMPLE_TEST_SOURCE_FILES} ${SAMPLE_SOURCE_FILES}
)
LIST(REMOVE_ITEM SAMPLE_TEST_SOURCE_FILES ${SAMPLE_SOURCE_PATH}/main.cpp)

SET(CMAKE_CXX_FLAGS "-g -Wall")

ADD_EXECUTABLE(${SAMPLE_EXEC_NAME} ${SAMPLE_SOURCE_FILES})
ADD_EXECUTABLE(${SAMPLE_TEST_EXEC_NAME} ${SAMPLE_TEST_SOURCE_FILES})

这是make的输出

[  8%] Building CXX object CMakeFiles/sample.dir/src/KeyBuffer.cpp.obj
[ 12%] Building CXX object CMakeFiles/sample.dir/src/main.cpp.obj
[ 20%] Building CXX object CMakeFiles/sample.dir/src/Object.cpp.obj
[ 45%] Building CXX object CMakeFiles/sample.dir/src/World.cpp.obj
Linking CXX executable bin/sample.exe
[ 45%] Built target sample
[ 50%] Building CXX object CMakeFiles/sample_test.dir/test/KeyBufferTest.cpp.obj

[ 54%] Building CXX object CMakeFiles/sample_test.dir/test/ObjectTest.cpp.obj
[ 66%] Building CXX object CMakeFiles/sample_test.dir/src/KeyBuffer.cpp.obj
[ 75%] Building CXX object CMakeFiles/sample_test.dir/src/Object.cpp.obj
[100%] Building CXX object CMakeFiles/sample_test.dir/src/World.cpp.obj
Linking CXX executable bin/sample_test.exe

如您所见,Object.cppWorld.cppKeyBuffer.cpp 被编译了两次!我该如何预防?或者是否有更好的方法来使用 CMake 处理 CppUnit 测试?

最佳答案

每个目标可能配置了不同的编译器标志,因此如果您将一个源文件添加到两个目标,则需要从这个源文件为两个目标生成单独的目标文件。

通常的解决方案是将共享源文件编译成一个静态库,然后将其链接到两个应用程序目标。

add_library(base STATIC ${shared_SOURCES}) # except e.g. foo_main.cpp

add_executable(foo ${foo_only_SOURCES})
target_link_libraries(foo base)

add_executable(bar ${bar_only_SOURCES})
target_link_libraries(bar base)

关于c++ - CppUnit 和 CMake : . cpp 文件被编译两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11846833/

相关文章:

c++ - 编译器找不到jpeg和png库

c++ - 我可以创建一个文件来提及我要构建的所有文件 : c++

c - 如何使用curl发出HTTPS请求并传递json

c++ - CPPUNIT:如何使用名称创建 TestFixture 实例

c++ - fread() 无法读取 Dev-Cpp 中的文件数据

c++ - 对于 notepad++ 的 c++ 调试器有什么建议吗?

c++ - 等待调试器崩溃?

c++ - 最简单的解析电脑外网IP的方法?

c++ - 如何在 C++ 中从 git 设置外部库

c++ - std::unique_ptr 上的 CPPUNIT_ASSERT_EQUAL