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

Windows下单元测试缺失DLL问题排查求助

Windows下CMake单元测试缺失依赖DLL的解决方案
  • 强制静态链接第三方库
    在CMake配置里明确指定spdlog、pmp等依赖使用静态版本,编译时会把依赖代码直接打包进测试可执行文件,避免运行时依赖DLL。示例配置:

    set(SPDLOG_BUILD_SHARED_LIBS OFF CACHE BOOL "Build shared libraries" FORCE)
    find_package(spdlog REQUIRED)
    
    # 对pmp做同样设置
    set(PMP_BUILD_SHARED_LIBS OFF CACHE BOOL "Build shared libraries" FORCE)
    find_package(pmp REQUIRED)
    
  • 自动复制依赖DLL到测试目录
    如果必须使用动态库,在测试模块的CMakeLists.txt中添加自定义命令,把依赖的DLL自动拷贝到测试可执行文件所在目录:

    add_custom_command(TARGET your_test_target POST_BUILD
      COMMAND ${CMAKE_COMMAND} -E copy_if_different
      # 根据当前编译配置选择对应DLL
      $<$<CONFIG:Debug>:${SPDLOG_LIBRARY_DEBUG}>
      $<$<CONFIG:Release>:${SPDLOG_LIBRARY_RELEASE}>
      $<TARGET_FILE_DIR:your_test_target>
    )
    
    # 复制pmp的DLL
    add_custom_command(TARGET your_test_target POST_BUILD
      COMMAND ${CMAKE_COMMAND} -E copy_if_different
      $<$<CONFIG:Debug>:${PMP_LIBRARY_DEBUG}>
      $<$<CONFIG:Release>:${PMP_LIBRARY_RELEASE}>
      $<TARGET_FILE_DIR:your_test_target>
    )
    

    注意将your_test_target替换为实际的测试目标名称,确保CMake能正确定位到依赖DLL的路径。

  • 统一项目输出目录
    在根目录的CMakeLists.txt中统一设置所有目标的输出路径,保证动态库和测试可执行文件生成在同一目录:

    # 设置运行时文件输出目录
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/bin/Debug)
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/bin/Release)
    
    # 设置动态库输出目录
    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/bin/Debug)
    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/bin/Release)
    
  • 匹配依赖库的编译配置
    Windows下Debug和Release版本的DLL不能混用,要确保spdlog、pmp等依赖的编译配置(Debug/Release)和你的项目完全一致。如果是自行构建这些依赖,需在对应配置下编译,并让CMake正确识别对应版本的库文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 11:21:06