GoogleTest使用MT_StaticRelease编译时出现错误

6

我如何强制使用/MT选项编译Google Test? 我注意到Google Test尝试使用MT进行编译(internal_utils.cmake第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) : error LNK2038: 发现“运行库”不匹配:值“MD_DynamicRelease”与值“MT_StaticRelease”不匹配

还有更多的LNK2005和LNK4217。

如果我尝试在没有MT的情况下编译我的项目,所有内容都可以编译。

如何解决这个问题?提前谢谢!


欢迎来到 Stack Overflow!在 CMake 中设置 MSVC 运行时(版本 3.15 及更高版本)的正确方法是使用 MSVC_RUNTIME_LIBRARY,可以参考这里的回答:https://dev59.com/G2kw5IYBdhLWcg3wJHGF#56776146。 - Kevin
@squareskittles,我需要为“gtest”目标执行此操作吗? - urbanzz
1个回答

6

这个if是一个测试,实现了一个转换开关,允许在包含googletest之前进行配置。

手册中也提到了:

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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接