如何使用CMake默认制作GTest build / MDd(而不是/ MTd)?

时间:2012-09-22 05:23:48

标签: visual-c++ cmake googletest

我正在尝试尽可能无缝地将 GTest CMake 集成。但我的测试项目的默认构建类型是/MDd,GTest默认为/MTd。我手动更改GTest项目属性以发出调试DLL。

但每次我对CMakeLists.txt进行更改时,GTest都会默认返回/MTd。我该如何阻止它?

4 个答案:

答案 0 :(得分:21)

在包含gtest实现此目的之前,您可以将gtest_force_shared_crt定义为ON。您可以通过命令行执行此操作:

cmake . -Dgtest_force_shared_crt=ON

或在CMakeLists.txt

set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)

答案 1 :(得分:13)

我认为更好的选择是@Fraser的答案 - 在这种情况下,cmake + gtest'只是工作'。

值得一提的是,为了覆盖内部gtest option设置,您需要将变量放在cmake缓存中:

set( gtest_force_shared_crt ON CACHE BOOL "Always use msvcrt.dll" )

答案 2 :(得分:5)

如果Ted Middleton的回答不起作用,请尝试使用FORCE:

set( gtest_force_shared_crt ON CACHE BOOL "Always use msvcrt.dll" FORCE)

它对我有用

答案 3 :(得分:0)

我们通过绕过GTest自己的构建系统并将GTest从其统一构建源文件gtest-all.cc编译为CMake object library来解决问题:

# compile Google Test as an object library
add_library(gtest OBJECT "${CMAKE_CURRENT_SOURCE_DIR}/gtest-1.6.0/src/gtest-all.cc")
set_property(TARGET gtest PROPERTY INCLUDE_DIRECTORIES
    "${CMAKE_CURRENT_SOURCE_DIR}/gtest-1.6.0"
    "${CMAKE_CURRENT_SOURCE_DIR}/gtest-1.6.0/include")

这样GTest将始终使用我们用于项目的相同选项进行编译。 然后可以使用以下方式构建使用GTest的测试可执行文件:

add_executable(test_executable ${TESTS_SRC} $<TARGET_OBJECTS:gtest>)
add_test(NAME test COMMAND test_executable)