【问题标题】:How to make GTest build /MDd (instead of /MTd) by default, using CMake?默认情况下,如何使用 CMake 使 GTest 构建 /MDd(而不是 /MTd)?
【发布时间】:2012-09-14 11:49:15
【问题描述】:

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

但是每次我对我的CMakeLists.txt 进行更改时,GTest 都会默认回到/MTd。我该如何阻止这种情况?

【问题讨论】:

    标签: visual-c++ cmake googletest


    【解决方案1】:

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

    cmake . -Dgtest_force_shared_crt=ON
    

    或在您的CMakeLists.txt

    set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
    

    【讨论】:

    • 您应该从下面添加 Ted Middleton 的更正。按照您的建议,添加 set() 行对 gtest 构建没有影响。
    【解决方案2】:

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

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

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

    【讨论】:

    【解决方案3】:

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

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

    它对我有用

    【讨论】:

    【解决方案4】:

    我们通过绕过 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)
    

    【讨论】:

    • 在 linux 上,GTest 依赖于 pthreads 库。如何将这种依赖关系与gtest 对象相关联?
    • 为此创建了separate question
    • 这样,您为每个单独的测试可执行文件重新编译 gtest 的整个源 - 效率不高。您还会丢失 gtest 自己的 CMakeLists.txt 中包含的所有检查和设置,其中一个影响是在 Linux 上缺少对 pthread 的依赖。
    • @Fraser gtest 源代码没有为每个测试可执行文件重新编译。对象库被精确地添加为一项功能,以便为许多目标重用已编译的对象文件。
    • @sakra - 是的,你是对的!对不起。我还是更喜欢使用 GTest 自己的构建文件。他们正是针对这种情况添加了gtest_force_shared_crt 选项。此外,我们使用相当高的警告级别并将警告视为错误,因此为第三方库提供一组不同的编译器选项很方便。
    猜你喜欢
    • 2022-07-15
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 2013-03-03
    相关资源
    最近更新 更多