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

