From 96a33a9035b8fcbc263a73a14d4d3e8897101499 Mon Sep 17 00:00:00 2001 From: Charles Giessen Date: Wed, 26 Nov 2025 11:35:52 -0600 Subject: [PATCH] Deprecate gtest_force_shared_crt CMake 3.15 added MSVC_RUNTIME_LIBRARY, an official mechanism to configure the runtime library used by targets. Setting the property will properly set the MSVC runtime library. With MSVC_RUNTIME_LIBRARY available, gtest_force_shared_crt is no longer necessary and is deprecated, with a notice given. --- googletest/CMakeLists.txt | 10 ++++------ googletest/README.md | 12 +++++++++--- googletest/cmake/internal_utils.cmake | 22 +++++++++++++--------- 3 files changed, 26 insertions(+), 18 deletions(-) diff --git a/googletest/CMakeLists.txt b/googletest/CMakeLists.txt index 2e5388945..722f3128f 100644 --- a/googletest/CMakeLists.txt +++ b/googletest/CMakeLists.txt @@ -8,12 +8,10 @@ # ctest. You can select which tests to run using 'ctest -R regex'. # For more options, run 'ctest --help'. -# When other libraries are using a shared version of runtime libraries, -# Google Test also has to use one. -option( - gtest_force_shared_crt - "Use shared (DLL) run-time lib even when Google Test is built as static lib." - OFF) +if (DEFINED gtest_force_shared_crt) + message(DEPRECATION + "gtest_force_shared_crt is deprecated and ignored. Use `CMAKE_MSVC_RUNTIME_LIBRARY` to configure the MSVC runtime library") +endif() option(gtest_build_tests "Build all of gtest's own tests." OFF) diff --git a/googletest/README.md b/googletest/README.md index 26e48d174..93f586450 100644 --- a/googletest/README.md +++ b/googletest/README.md @@ -117,10 +117,16 @@ something like the following: gtest.lib(gtest-all.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in main.obj -GoogleTest already has a CMake option for this: `gtest_force_shared_crt` +This is resolved by forcing googletest to dynamically link to the C runtimes. +CMake 3.15 added the variable `CMAKE_MSVC_RUNTIME_LIBRARY` as the way to +select the C runtime used by projects. + +To do this, either add +`set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>DLL")` +to the project's CMakeLists.txt before including googletest, or set it +on the command line with +`-DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreaded$<$:Debug>DLL"`. -Enabling this option will make gtest link the runtimes dynamically too, and -match the project in which it is included. #### C++ Standard Version diff --git a/googletest/cmake/internal_utils.cmake b/googletest/cmake/internal_utils.cmake index 7ca256a76..6f5af62f0 100644 --- a/googletest/cmake/internal_utils.cmake +++ b/googletest/cmake/internal_utils.cmake @@ -28,15 +28,6 @@ macro(fix_default_compiler_settings_) CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) if (NOT BUILD_SHARED_LIBS AND NOT gtest_force_shared_crt) - # When Google Test is built as a shared library, it should also use - # shared runtime libraries. Otherwise, it may end up with multiple - # copies of runtime library data in different modules, resulting in - # hard-to-find crashes. When it is built as a static library, it is - # preferable to use CRT as static libraries, as we don't have to rely - # on CRT DLLs being available. CMake always defaults to using shared - # CRT libraries, so we override that default here. - string(REPLACE "/MD" "-MT" ${flag_var} "${${flag_var}}") - # When using Ninja with Clang, static builds pass -D_DLL on Windows. # This is incorrect and should not happen, so we fix that here. string(REPLACE "-D_DLL" "" ${flag_var} "${${flag_var}}") @@ -70,6 +61,19 @@ macro(config_compiler_and_linker) endif() fix_default_compiler_settings_() + + # When Google Test is built as a shared library, it should also use + # shared runtime libraries. Otherwise, it may end up with multiple + # copies of runtime library data in different modules, resulting in + # hard-to-find crashes. When it is built as a static library, it is + # preferable to use CRT as static libraries, as we don't have to rely + # on CRT DLLs being available. CMake defaults to using shared + # CRT libraries, so we change that here. + if (NOT BUILD_SHARED_LIBS AND NOT DEFINED CMAKE_MSVC_RUNTIME_LIBRARY) + set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + endif() + + if (MSVC) # Newlines inside flags variables break CMake's NMake generator. # TODO(vladl@google.com): Add -RTCs and -RTCu to debug builds.