我可以阻止 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 测试项目指定其目标(gtest
和 gtest_main
)需要使用至少 C++11 功能进行编译。这是通过target_compile_features
命令(googletest/cmake/internal_utils.cmake#L193)完成的:
target_compile_features($name PUBLIC cxx_std_11)
因此,每当您与gtest
或gtest_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 变量吗?的主要内容,如果未能解决你的问题,请参考以下文章
假设我不使用任何重载函数,有没有办法可以阻止所有名称修改? [复制]
我可以阻止 Apache Web 服务器上每个站点的搜索爬虫吗?