GoogleTest 编译时出现 MT_StaticRelease 错误

Posted

技术标签:

【中文标题】GoogleTest 编译时出现 MT_StaticRelease 错误【英文标题】:GoogleTest compile with MT_StaticRelease errors 【发布时间】:2021-01-03 14:13:28 【问题描述】:

如何强制使用 /MT 选项进行 google 测试编译? 我看到谷歌测试试图用 MT 编译(internal_utils.cmake line 33):

  if (NOT BUILD_SHARED_LIBS AND NOT gtest_force_shared_crt)
    string(REPLACE "/MD" "-MT" $flag_var "$$flag_var")
  endif()

但它不起作用(BUILD_SHARED_LIBS 和 gtest_force_shared_crt 已禁用)。 当我的项目使用 MT 编译时出现错误:

gtest.lib(gtest-all.obj):错误 LNK2038:检测到不匹配 “RuntimeLibrary”:值“MD_DynamicRelease”与值不匹配 "MT_StaticRelease"

还有一些 LNK2005 和 LNK4217。 如果我尝试在没有 MT 的情况下编译我的项目,一切都可以编译。 我该如何解决?提前致谢!

【问题讨论】:

欢迎来到 Stack Overflow!在 CMake(3.15 及更高版本)中设置 MSVC 运行时的正确方法是使用 MSVC_RUNTIME_LIBRARY,如响应 here 所示。 @squareskittles,我需要为“gtest”目标执行此操作吗? 【参考方案1】:

if 是一个测试,实现了一个开关,允许之前配置它,包括 googletest。

manual中也提到过:

Visual Studio 动态与静态运行时

默认情况下,新的 Visual Studio 项目会动态链接 C 运行时 但 GoogleTest 静态链接它们。这将产生一个错误 看起来像下面这样: gtest.lib(gtest-all.obj) : error LNK2038:检测到“RuntimeLibrary”不匹配:值 'MTd_StaticDebug' 与 main.obj 中的值 'MDd_DynamicDebug' 不匹配

GoogleTest 已经为此提供了 CMake 选项:gtest_force_shared_crt

启用此选项将使 gtest 动态链接运行时 也,并匹配它所在的项目。

所以只需在您的项目中设置它,例如像这样:

set(gtest_force_shared_crt on)

include(FetchContent)
FetchContent_Declare(googletest
        GIT_REPOSITORY https://github.com/google/googletest.git
        GIT_TAG main)
FetchContent_MakeAvailable(googletest)

enable_testing()

【讨论】:

以上是关于GoogleTest 编译时出现 MT_StaticRelease 错误的主要内容,如果未能解决你的问题,请参考以下文章

为arm64交叉编译googletest

GoogleTest框架初识

GoogleTest框架初识

GoogleTest:CLang 错误编译 ASSERT_FALSE(false)

googletest安装与使用

为啥编译时出现多个定义错误?