我正在尝试尽可能无缝地将 GTest 与 CMake 集成。但我的测试项目的默认构建类型是/MDd
,GTest默认为/MTd
。我手动更改GTest项目属性以发出调试DLL。
但每次我对CMakeLists.txt
进行更改时,GTest都会默认返回/MTd
。我该如何阻止它?
答案 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)