我正在尝试尽可能无缝地将GTest与CMake集成。但是我的测试项目的默认构建类型是/MDd
GTest 默认为/MTd
. 我正在手动更改 GTest 项目属性以发出调试 DLL。
但每次我对我CMakeLists.txt
的/MTd
. 我该如何阻止这个?
我正在尝试尽可能无缝地将GTest与CMake集成。但是我的测试项目的默认构建类型是/MDd
GTest 默认为/MTd
. 我正在手动更改 GTest 项目属性以发出调试 DLL。
但每次我对我CMakeLists.txt
的/MTd
. 我该如何阻止这个?
您可以在包含 gtest 之前定义gtest_force_shared_crt
toON
来实现这一点。您可以通过命令行执行此操作:
cmake . -Dgtest_force_shared_crt=ON
或在您的CMakeLists.txt
:
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
我认为更好的选择是@Fraser 的答案——在这种情况下,cmake + gtest '只是工作'。
值得一提的是,为了覆盖内部 gtestoption
设置,您需要将变量放入 cmake 缓存中:
set( gtest_force_shared_crt ON CACHE BOOL "Always use msvcrt.dll" )
如果 Ted Middleton 的回答不起作用,请尝试使用 FORCE:
set( gtest_force_shared_crt ON CACHE BOOL "Always use msvcrt.dll" FORCE)
它对我有用
我们通过绕过 GTest 自己的构建系统并从其统一构建源文件将 GTest 编译为CMake 对象库gtest-all.cc
来解决了这个问题:
# 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)