对于问题 1 和 2,我建议从除 main.cpp 之外的非测试文件中创建一个库(在本例中只是 src/sqr.cpp 和 src/sqr.h),然后您可以避免列出(更重要的是重新编译)所有源代码两次。
对于问题 3,这些命令添加一个名为“MyTest”的测试,该测试调用您的可执行文件“test”,不带任何参数。但是,由于您已将这些命令添加到 test/CMakeLists.txt 而不是顶级 CMakeLists.txt,因此您只能从构建树的“test”子目录中调用测试(尝试cd test && ctest -N
)。如果您希望测试可以从顶级构建目录运行,您需要调用add_test
来自顶级 CMakeLists.txt。这也意味着您必须使用更详细的形式add_test https://cmake.org/cmake/help/latest/command/add_test.html因为您的测试 exe 未在同一 CMakeLists.txt 中定义
就您而言,由于您在根文件夹中运行 cmake,因此您的构建树和源树是一棵相同的。这称为源内构建,并不理想,这导致了问题 4。
生成构建树的首选方法是进行源外构建,即在源树之外的某个位置创建一个目录并从那里执行 cmake。甚至在项目的根目录中创建一个“build”目录并执行cmake ..
将提供一个干净的结构,不会干扰您的源代码树。
最后一点是避免调用可执行文件“test”(区分大小写)。原因请参见这个答案 https://stackoverflow.com/a/736838/424459.
为了实现这些改变,我会做以下事情:
CMakeLists.txt:
cmake_minimum_required (VERSION 2.8)
project (TEST)
add_subdirectory (src)
add_subdirectory (test)
enable_testing ()
add_test (NAME MyTest COMMAND Test)
src/CMakeLists.txt:
add_library (Sqr sqr.cpp sqr.h)
add_executable (demo main.cpp)
target_link_libraries (demo Sqr)
test/CMakeLists.txt:
find_package (Boost COMPONENTS system filesystem unit_test_framework REQUIRED)
include_directories (${TEST_SOURCE_DIR}/src
${Boost_INCLUDE_DIRS}
)
add_definitions (-DBOOST_TEST_DYN_LINK)
add_executable (Test test.cpp)
target_link_libraries (Test
Sqr
${Boost_FILESYSTEM_LIBRARY}
${Boost_SYSTEM_LIBRARY}
${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}
)