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

Can I keep GoogleTest-build from modifying the global CMAKE_CXX_FLAGS variable?

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

我通过下载 GoogleTest 并将其构建为我自己的测试项目 includes/links 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.

的代码时

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

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

...它应该是这样的:

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

有没有办法防止 GoogleTest 的构建脚本修改该全局变量?或者可能已经恢复了?

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

target_compile_features(${name} PUBLIC cxx_std_11)

因此,每当您 link 使用 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?