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) # <<<<<<<<<<<<< 这里
浙公网安备 33010602011771号