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

CMake+Qt+GTest项目文件链接问题技术问询

我来帮你搞定这个CMake+Qt+GTest项目的链接问题!先把你的项目结构理清楚:

.
├── CMakeLists.txt
├── src
│   ├── CMakeLists.txt
│   ├── main.cpp
│   └── utils
│       ├── calculator.cpp
│       └── calculator.h
└── tests
    ├── calculator_test.cpp
    └── CMakeLists.txt

你的根目录CMakeLists.txt目前有两处明显问题:一是CMAKE_LIBRARY_OUTPUT_DIRECTORY的路径没写完,二是缺少Qt和GTest的核心配置,也没处理好子项目的依赖关联。我给你补全并修正所有CMake配置,确保编译和链接完全正常:


根目录 CMakeLists.txt

cmake_minimum_required(VERSION 3.5)
project(random_project)

# 按照GNU标准放置二进制文件和库
include(GNUInstallDirs)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})

# 引入Qt模块,根据你的实际需求调整(比如需要Widgets就加上Widgets)
find_package(Qt5 REQUIRED COMPONENTS Core)
# 启用Qt的自动MOC/RCC/UIC处理
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

# 引入GTest(用FetchContent自动拉取,也可以用find_package如果本地已安装)
include(FetchContent)
FetchContent_Declare(
  googletest
  URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip
)
# Windows下强制使用动态CRT,避免编译冲突
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)

# 添加子目录,让CMake处理src和tests的配置
add_subdirectory(src)
add_subdirectory(tests)

关键说明:

  • 补全了输出目录配置,确保可执行文件和库文件按标准路径存放
  • 配置Qt的自动工具链,处理Qt特有的元对象编译逻辑
  • 用FetchContent自动获取GTest,避免手动安装的麻烦

src目录 CMakeLists.txt

# 将utils模块编译为静态库,方便测试代码直接链接
add_library(utils STATIC
    utils/calculator.cpp
    utils/calculator.h
)

# 链接Qt Core库给utils模块
target_link_libraries(utils PRIVATE Qt5::Core)

# 生成主程序可执行文件
add_executable(main_app main.cpp)

# 主程序链接utils库和Qt Core
target_link_libraries(main_app PRIVATE utils Qt5::Core)

# 让主程序能找到utils的头文件
target_include_directories(main_app PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/utils)

关键说明:

  • 把utils封装成静态库是解决链接问题的核心:测试代码需要调用calculator的接口,直接链接这个库就可以,不用重复编译源码
  • 明确指定依赖的Qt库,避免编译时出现符号缺失

tests目录 CMakeLists.txt

# 生成测试可执行文件
add_executable(calculator_test calculator_test.cpp)

# 链接GTest框架和我们的utils库
target_link_libraries(calculator_test PRIVATE
    GTest::gtest_main
    utils
)

# 让测试代码能找到utils的头文件
target_include_directories(calculator_test PRIVATE ${CMAKE_SOURCE_DIR}/src/utils)

# 启用GTest的自动测试发现
include(GoogleTest)
gtest_discover_tests(calculator_test)

关键说明:

  • 直接链接utils库,确保测试代码能调用calculator的所有接口
  • 用gtest_discover_tests自动识别测试用例,不用手动添加测试条目

配置完成后,你只需要常规的CMake构建流程就能正常编译主程序和测试:

  1. 创建build目录:mkdir build && cd build
  2. 生成构建文件:cmake ..
  3. 编译:make(或者ninja,取决于你选的生成器)
  4. 运行测试:./lib/calculator_test(或者对应路径下的测试可执行文件)

内容的提问来源于stack exchange,提问作者Ugnius Malūkas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:42:51