我可以阻止 GoogleTest-build 修改全局 CMAKE_CXX_FLAGS 变量吗?

Posted

技术标签:

【中文标题】我可以阻止 GoogleTest-build 修改全局 CMAKE_CXX_FLAGS 变量吗?【英文标题】:Can I keep GoogleTest-build from modifying the global CMAKE_CXX_FLAGS variable? 【发布时间】: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 的构建脚本修改该全局变量?还是恢复了?

【问题讨论】:

【参考方案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?

【讨论】:

感谢纠正我对设定标准的内在态度;)

以上是关于我可以阻止 GoogleTest-build 修改全局 CMAKE_CXX_FLAGS 变量吗?的主要内容,如果未能解决你的问题,请参考以下文章

假设我不使用任何重载函数,有没有办法可以阻止所有名称修改? [复制]

电脑管家禁止程序修改文档后如何恢复权限

可以阻止 Uncrustify 修改某些代码部分吗?

我可以阻止 Apache Web 服务器上每个站点的搜索爬虫吗?

无法在 chrome 中编辑 CSS STYLE 属性(灰显并被阻止)

SQL Server阻止保存修改表结构的解决方法