【发布时间】: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