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
相关产品推荐
相关产品推荐

