【问题标题】:Can I keep GoogleTest-build from modifying the global CMAKE_CXX_FLAGS variable?我可以阻止 GoogleTest-build 修改全局 CMAKE_CXX_FLAGS 变量吗?
【发布时间】:2020-07-10 01:28:50
【问题描述】:

我的 C++ 项目是用 CMake 构建的,并且包括使用 GoogleTest 的测试。为了避免不同项目和安装/编译的 GoogleTest 版本之间的兼容性问题,我曾经决定让 GoogleTest 在我的项目目录中始终位于本地。

我通过将 GoogleTest 下载并构建为我自己的测试项目的一部分来实现这一点,其中包括/链接 gtest。这在各自的CMakeLists.txt 中看起来像这样:

# Download and unpack googletest at configure time
configure_file(CMakeLists.txt.in googletest-download/CMakeLists.txt)
execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
    WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/googletest-download"
)
execute_process(COMMAND "${CMAKE_COMMAND}" --build .
    WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/googletest-download"
)

为了使这项工作正常运行,CMakeLists.txt.in 中定义了一个外部项目:

cmake_minimum_required(VERSION 2.8.2)
project(googletest-download NONE)

include(ExternalProject)
ExternalProject_Add(googletest
    GIT_REPOSITORY https://github.com/google/googletest.git
    GIT_TAG master
    SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/googletest-src"
    BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/googletest-build"
    CONFIGURE_COMMAND ""
    BUILD_COMMAND ""
    INSTALL_COMMAND ""
    TEST_COMMAND ""
)

到目前为止一切顺利!

这对我来说很有效,但我遇到了一些麻烦,因为我在最近的项目中开始使用 C++17 功能。这是一个问题,因为我的测试项目在包含使用 C++17 的代码时拒绝编译。

原因是,运行 GoogleTest 的 CMake 构建会在全球范围内修改 CMAKE_CXX_FLAGS 变量。事实上它覆盖了我对编译器模式的定义:

CXX_FLAGS =  -Wall -pedantic -std=c++17   -std=gnu++11

...它应该看起来像这样:

CXX_FLAGS =  -Wall -pedantic -std=c++17

有没有办法防止 GoogleTest 的构建脚本修改该全局变量?还是恢复了?

【问题讨论】:

    标签: cmake c++17 googletest


    【解决方案1】:

    Google 测试项目指定其目标(gtestgtest_main)需要使用至少 C++11 功能进行编译。这是通过target_compile_features 命令(googletest/cmake/internal_utils.cmake#L193)完成的:

    target_compile_features(${name} PUBLIC cxx_std_11)
    

    因此,每当您与gtestgtest_main 目标链接时,CMake 都会检查调用者是否已经提供了 C++11,如果没有,则添加相应的编译器标志(-std=gnu++11 用于 gcc)。

    您似乎已将-std=c++17 直接添加到CMAKE_CXX_FLAGS 变量中。这是指定标准的不好的方式:CMake 从不检查 CMAKE_CXX_FLAGS 以检测当前启用了哪些编译器功能。

    c++17的正确设置意味着要么设置CMAKE_CXX_STANDARD变量:

    set(CMAKE_CXX_STANDARD 17)
    

    或为您的目标致电target_compile_features

    target_compile_features(my_exe PUBLIC cxx_std_17)
    

    在该问题中查看有关在 CMake 中设置 C/C++ 标准的更多信息:How do I activate C++ 11 in CMake?

    【讨论】:

    • 感谢纠正我对设定标准的内在态度;)
    猜你喜欢
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多