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构建流程就能正常编译主程序和测试:
- 创建build目录:
mkdir build && cd build - 生成构建文件:
cmake .. - 编译:
make(或者ninja,取决于你选的生成器) - 运行测试:
./lib/calculator_test(或者对应路径下的测试可执行文件)
内容的提问来源于stack exchange,提问作者Ugnius Malūkas
相关产品推荐
相关产品推荐

