Мой проект C ++ построен с использованием CMake и включает тесты с использованием GoogleTest . Чтобы уберечь меня от проблем совместимости между разными проектами и установленной / скомпилированной версией GoogleTest , я однажды решил, что GoogleTest всегда будет локальным в моих каталогах проектов.
Я добился этого, загрузив и построив GoogleTest как часть моего собственного тестового проекта, который включает / 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 .
Причина в том, что запущен GoogleTest Сборка CMake изменяет переменную CMAKE_CXX_FLAGS
в глобальном масштабе. Фактически, это отменяет мое определение режима компилятора:
CXX_FLAGS = -Wall -pedantic -std=c++17 -std=gnu++11
... где это должно выглядеть так:
CXX_FLAGS = -Wall -pedantic -std=c++17
Есть ли способ сохранить GoogleTest сценарий сборки от изменения этой глобальной переменной? А может восстановили?