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

Windows下CMake搭配GTest构建时测试找不到共享库该如何处理

方案1:统一全局运行时产物输出目录(最推荐)

这个是最通用的解决方案,在项目顶层CMakeLists.txt的最开头(所有add_subdirectory调用之前)添加如下配置:

# 统一所有EXE、DLL的输出目录到构建根目录下的bin文件夹
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

Windows下共享库(DLL)属于运行时产物,和EXE会输出到同一个目录,测试发现阶段运行unittest时自然可以找到所有依赖的DLL,同时也解决了后期手动运行二进制找不到依赖的问题。

方案2:构建后自动拷贝依赖DLL到测试二进制目录

如果不想修改全局输出目录,可以用CMake 3.21及以上版本提供的$<TARGET_RUNTIME_DLLS>生成器表达式,自动拷贝测试目标依赖的所有DLL到自身目录,在你测试目录的CMakeLists.txt里add_executable(unittest)之后添加如下配置:

if(WIN32)
  add_custom_command(TARGET unittest POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
    $<TARGET_RUNTIME_DLLS:unittest>
    $<TARGET_FILE_DIR:unittest>
    COMMAND_EXPAND_LISTS
  )
endif()

这个表达式会自动识别unittest依赖的所有动态库(包括你自己的子项目库、Boost等第三方动态库),构建完成后自动拷贝到unittest所在目录,不需要手动指定每个库的路径。

临时解决测试发现的备选方案

如果只需要解决测试发现阶段的报错,不需要后续手动运行测试二进制,可以给gtest_discover_tests添加环境变量配置,把所有依赖DLL的目录加到测试发现阶段的PATH里:

gtest_discover_tests(unittest
  DISCOVERY_ENVIRONMENT "PATH=${CMAKE_BINARY_DIR}/path/to/your/subproject/dir;$ENV{PATH}"
)

如果子项目较多不推荐这个方案,维护成本较高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:06:07