You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt5项目接入Catch2单元测试的目录结构与CMake配置问题

解决方案

核心调整思路

你遇到的核心问题是src目录的业务代码直接编译成了主程序可执行文件,可执行文件的符号和头文件路径不会对外暴露,因此测试目标无法引用。只要把业务代码抽离为独立静态库,主程序和测试都链接这个静态库,两个问题就能同时解决。


各层级CMakeLists.txt修改示例

1. 根目录顶层CMakeLists.txt

cmake_minimum_required(VERSION 3.16)
# 替换为你的项目名
project(YourQtProject VERSION 1.0.0 LANGUAGES CXX)

# 全局基础配置
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Qt相关全局配置
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

# 引入CTest模块,自动提供BUILD_TESTING编译选项,默认开启
include(CTest)

# 全局依赖头文件路径配置
include_directories(${PROJECT_SOURCE_DIR}/external/linux/Qt/include)
include_directories(${PROJECT_SOURCE_DIR}/external/linux/ArcGis/include)

# 编译源码目录
add_subdirectory(src)

# 仅开启测试选项时编译tests目录
if(BUILD_TESTING)
    add_subdirectory(tests)
endif()

2. src目录下的CMakeLists.txt

# 收集所有业务代码,排除主入口main.cpp
file(GLOB_RECURSE CORE_SRCS
    Gui/*.cpp
    Models/*.cpp
    DataSources/*.cpp
)

# 将业务代码编译为独立静态库
add_library(${PROJECT_NAME}_core STATIC ${CORE_SRCS})

# 给静态库配置公开头文件路径,所有链接该库的目标会自动继承该包含路径
target_include_directories(${PROJECT_NAME}_core PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

# 链接Qt、ArcGis等依赖到静态库
target_link_libraries(${PROJECT_NAME}_core
    Qt5::Widgets
    # 在此补充你的ArcGis、其他第三方依赖库
)

# 主程序仅保留main.cpp入口,链接业务静态库即可
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} PRIVATE ${PROJECT_NAME}_core)

3. tests目录下的CMakeLists.txt

find_package(Catch2 REQUIRED)

# Reader模块测试配置
add_executable(ReaderTest DataSources/Usb/ReaderTest.cpp)
target_link_libraries(ReaderTest PRIVATE
    ${PROJECT_NAME}_core
    Catch2::Catch2WithMain
)
# 注册到CTest,可通过ctest命令批量运行
add_test(NAME ReaderTest COMMAND ReaderTest)

# 后续新增测试只需复用上述格式即可,示例:
# add_executable(SectionModelTest Models/SectionModelTest.cpp)
# target_link_libraries(SectionModelTest PRIVATE ${PROJECT_NAME}_core Catch2::Catch2WithMain)
# add_test(NAME SectionModelTest COMMAND SectionModelTest)

构建目标使用说明

  • 默认全量构建:执行cmake -B build && cmake --build build,会同时生成主程序可执行文件和所有测试用例
  • 仅构建主程序:执行cmake -B build -DBUILD_TESTING=OFF && cmake --build build
  • 单独构建某个目标:可通过cmake --build build --target 目标名单独构建主程序或指定测试用例
  • 运行测试:构建完成后执行cd build && ctest批量运行所有测试,也可直接运行tests目录下生成的测试可执行文件单步调试

注意事项

  • 代码中引用头文件请使用相对于src目录的路径,比如引用Reader.h写#include "DataSources/Usb/Reader.h",不要用相对路径跳转
  • Catch2建议使用v3.x版本,v2版本链接参数需改为Catch2::Catch2,且需要自己写测试入口main函数

内容的提问来源于stack exchange,提问作者Arron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 05:18:02