googletest 的编译选项

    今天编译googletest进项目,发现错误,是动态库和静态库的冲突问题. 根据提示,强制项目使用静态运行库:

# 强制 GoogleTest 使用静态运行时库
set(gtest_force_shared_crt OFF CACHE BOOL "" FORCE)
# 设置使用静态运行时库
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")

结果问题依旧, 然后又用了:

if (MSVC)
    set(CompilerFlags
        CMAKE_CXX_FLAGS
        CMAKE_CXX_FLAGS_DEBUG
        CMAKE_CXX_FLAGS_RELEASE
        CMAKE_C_FLAGS
        CMAKE_C_FLAGS_DEBUG
        CMAKE_C_FLAGS_RELEASE
    )
    foreach(CompilerFlag ${CompilerFlags})
        string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}")
        string(REPLACE "/MDd" "/MTd" ${CompilerFlag} "${${CompilerFlag}}")
    endforeach()
endif(MSVC)

才勉强让项目编译通过.可是,我将使用的项目有很多动态库,这样子蛮干肯定有问题.

CMakelists.txt 文本如下:

cmake_minimum_required (VERSION 3.14)

project(my_project)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 设置 GoogleTest 版本号
set(GOOGLETEST_VERSION 1.16.0)

# 强制 GoogleTest 使用静态运行时库
set(gtest_force_shared_crt OFF CACHE BOOL "" FORCE)
# 设置使用静态运行时库
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")


if (MSVC)
    set(CompilerFlags
        CMAKE_CXX_FLAGS
        CMAKE_CXX_FLAGS_DEBUG
        CMAKE_CXX_FLAGS_RELEASE
        CMAKE_C_FLAGS
        CMAKE_C_FLAGS_DEBUG
        CMAKE_C_FLAGS_RELEASE
    )
    foreach(CompilerFlag ${CompilerFlags})
        string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}")
        string(REPLACE "/MDd" "/MTd" ${CompilerFlag} "${${CompilerFlag}}")
    endforeach()
endif(MSVC)

enable_testing()

add_subdirectory(googletest) # 将googeltest 项目里的这个目录copy到项目下了. 

add_executable(my_project hello_test.cc)

set_property(TARGET my_project PROPERTY CXX_STANDARD 20)

target_link_libraries(my_project gtest_main)

add_test(NAME my_project_test COMMAND my_project)

 

打开googletest下的readme.md, 看到如下文字,懊恼得直拍大腿:

##### Visual Studio Dynamic vs Static Runtimes

By default, new Visual Studio projects link the C runtimes dynamically but
GoogleTest links them statically. This will generate an error that looks
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`

Enabling this option will make gtest link the runtimes dynamically too, and
match the project in which it is included.

原来只要将 googletest/CMakeList.txt 里 `gtest_force_shared_crt` 设置根据项目类型设置为on就好. 

option(
  gtest_force_shared_crt
  "Use shared (DLL) run-time lib even when Google Test is built as static lib."
  ON)  # <<<<<<<<<<<<< 这里

 

posted on 2025-03-02 12:00  金凯旋  阅读(57)  评论(0)    收藏  举报

导航