问题描述
我正在处理一个按如下方式组织成库的 C++ 项目:
├── Lib_1
│ ├── ...
│ └── CMakeLists.txt
├── Lib_2
│ ├── ...
│ └── CMakeLists.txt
│ ...
├── Lib_N
│ ├── ...
│ └── CMakeLists.txt
├── Main.cpp
└── CMakeLists.txt
具有文件夹结构之外的主要可执行文件。主要的CMakeLists有以下内容:
cmake_minimum_required(VERSION 3.10)
project(MyConsoleApp VERSION 1.0)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_required True)
add_subdirectory(Lib_1)
add_subdirectory(Lib_2)
...
add_subdirectory(Lib_N)
add_executable(${PROJECT_NAME} Main.cpp)
target_link_libraries(${PROJECT_NAME}
Lib_1
Lib_2
...
Lib_N
)
和子文件夹中的 CMakeLists:
set(Lib_k_Src # k = 1,2,...,N
src1.h
src1.cpp
...
)
add_library(Lib_k ${Lib_k_Src})
我想将 BOOST(或任何其他)单元测试套件附加到每个库组件,并确保每次构建组件时它都运行。或者,或者,生成带有测试套件的可执行文件,可以与主执行程序分开运行。
到目前为止,我的所有尝试都未能将 Boost 和 CppUnit 与主要可执行文件集成,从而在附加第三方单元测试库时导致链接器错误(通常是 LNK1104)。我已经为 boost include 和 lib 目录创建了 Windows 环境变量,并尝试了一些 available examples with CMake,但这些甚至不会在 CMakeGUI 中配置。我唯一的运气是在单独的解决方案中使用 CppUnit,没有 CMake 生成的包装器,在运行时通过 Main.cpp 使用 CppTestRunner。
知道如何解决这个问题吗?
我花了几天时间试图解决这个问题,甚至考虑实现我自己的断言宏进行测试,以便在运行时从 main 调用它们。
可以在 here 中找到我的 Boost 设置。目前,我已经生成了一个测试库 Symplekt_GeometryBase_Tests 到 Symplekt_GeometryBase 作为原型。 感谢您提供任何有用的见解。
解决方法
你错过了很多东西。请务必重新阅读 Boost 的 extensive documentation,了解在构建期间可以使用单元测试库的不同使用变体。
- 在 CMake 配置期间使用
find_package(Boost REQUIRED)
到 find Boost。根据您使用的是仅标头版本还是库版本,在后一种情况下,您需要添加unit_test_framework
作为查找调用所需的组件。您可能希望在顶级CMakeLists.txt
中执行此操作。如果这无法自动找到 Boost,请尝试将Boost_ROOT
环境变量设置为计算机上 Boost 的安装目录,或查看 StackOverflow 上的众多其他答案,以使用 CMake 查找 Boost。 (提示:如果这一直无缘无故失败,您可能没有正确构建/安装 Boost)。 - 通过调用
target_link_libraries(mytest PUBLIC Boost::boost)
,让您的测试可执行目标作为依赖项引入 Boost。同样,如果您不使用仅标头设置,您还需要以相同的方式链接到Boost::unit_test_framework
。删除您当前使用的所有${BOOST_WHATEVER}
变量,您不需要任何这些。 - 您需要致电
enable_testing
。在包含任何测试之前,这应该 ideally 在根CMakeLists
中完成一次。 - 使用
add_test
向 CMake 的测试机制注册测试目标。您似乎已经在这样做了。
您的单元测试现在将在 CMake 的测试运行器中注册,并且可以通过构建相应的 CMake 元目标(如 RUN_TESTS
)或通过 ctest 来执行。
您可以通过 adding a custom build step that invokes the test runner 在构建期间自动执行测试。