【发布时间】:2012-09-14 11:49:15
【问题描述】:
我正在尝试将 GTest 与 CMake 尽可能无缝地集成。但我的测试项目的默认构建类型是/MDd,GTest 默认为/MTd。我正在手动更改 GTest 项目属性以发出调试 DLL。
但是每次我对我的CMakeLists.txt 进行更改时,GTest 都会默认回到/MTd。我该如何阻止这种情况?
【问题讨论】:
标签: visual-c++ cmake googletest
我正在尝试将 GTest 与 CMake 尽可能无缝地集成。但我的测试项目的默认构建类型是/MDd,GTest 默认为/MTd。我正在手动更改 GTest 项目属性以发出调试 DLL。
但是每次我对我的CMakeLists.txt 进行更改时,GTest 都会默认回到/MTd。我该如何阻止这种情况?
【问题讨论】:
标签: visual-c++ cmake googletest
您可以在包含 gtest 之前将gtest_force_shared_crt 定义为ON 以实现此目的。您可以通过命令行执行此操作:
cmake . -Dgtest_force_shared_crt=ON
或在您的CMakeLists.txt:
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
【讨论】:
我认为@Fraser 的回答是更好的选择 - 在这种情况下,cmake + gtest '正常工作'。
值得一提的是,为了覆盖gtest内部的option设置,需要将变量放入cmake缓存中:
set( gtest_force_shared_crt ON CACHE BOOL "Always use msvcrt.dll" )
【讨论】:
FORCE 也应该被指定,参见github.com/google/googletest/blob/master/googletest/README.md。
如果 Ted Middleton 的回答不起作用,请尝试使用 FORCE:
set( gtest_force_shared_crt ON CACHE BOOL "Always use msvcrt.dll" FORCE)
它对我有用
【讨论】:
我们通过绕过 GTest 自己的构建系统并从其统一构建源文件 gtest-all.cc 将 GTest 编译为 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)
【讨论】:
pthreads 库。如何将这种依赖关系与gtest 对象相关联?
gtest_force_shared_crt 选项。此外,我们使用相当高的警告级别并将警告视为错误,因此为第三方库提供一组不同的编译器选项很方便。