Ошибка компиляции gtest 'is_tribuly_copy_constructible' не является членом 'std'
1. Описание проблемы
На новой виртуальной машине Linux Redhat7.6 после компиляции клона gtest сообщается о куче ошибок:
/opt/googletest/googletest/include/gtest/gtest-matchers.h: In static member function ‘static constexpr bool testing::internal::MatcherBase<T>::IsInlined()’:
/opt/googletest/googletest/include/gtest/gtest-matchers.h:434:12: error: ‘is_trivially_copy_constructible’ is not a member of ‘std’
std::is_trivially_copy_constructible<M>::value &&
^
/opt/googletest/googletest/include/gtest/gtest-matchers.h:434:50: error: expected primary-expression before ‘>’ token
std::is_trivially_copy_constructible<M>::value &&
^
/opt/googletest/googletest/include/gtest/gtest-matchers.h:434:51: error: ‘::value’ has not been declared
2. Анализ причин
Перейдите на официальный сайт GoogleTest, чтобы проверить минимальные требования GoogleTest, требуемая версия компилятора gcc не ниже 5.0.
Проверьте локальную версию gcc и обнаружите, что это версия 4.8, что должно быть вызвано низкой версией gcc.
[root@192 rh]# gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
3. Обновите версию gcc
Есть много способов обновить версию gcc, вы можете напрямую загрузить последний исходный код gcc для компиляции, но этот метод очень проблематичен, и вы можете столкнуться с различными странными ошибками в процессе компиляции. А после использования новой версии gcc какой-то старый код может не скомпилироваться. Ради стабильности и совместимости мы часто не хотим полностью отказываться от старого gcc, но надеемся, что сможем свободно переключать версии gcc в соответствии с нашими потребностями.
В Redhat предусмотрен специальный инструментарий для управления версией gcc, с помощью которого версию gcc можно переключить в любое время, не разрушая исходную среду gcc. Например:
gcc-toolset-12对应gcc12.x.x版本
gcc-toolset-11对应gcc11.x.x版本
gcc-toolset-10对应gcc10.x.x版本
gcc-toolset-9对应gcc9.x.x版本
以此类推
Примечание о наборе инструментов разработчика Red Hat:
Red Hat Developer Toolset delivers the latest stable versions of essential GCC C, C++, Fortran, and supporting development tools to enhance developer productivity and improve deployment times.
Официальная документация Red Hat Developer Toolset отсюда для входа
Возьмем в качестве примера последнюю версию Red Hat Developer Toolset 12.0, и мы увидим, что она содержит множество инструментов:
Для простоты мы устанавливаем весь набор инструментов прямо здесь, а соответствующую версию gcc12 можно использовать после завершения установки.
yum install devtoolset-12
Следует отметить, что если вы выполните указанную выше команду напрямую, скорее всего, появится сообщение о том, что склад не найден. Поскольку вы хотите установить devtoolset на RHEL, вам потребуется ряд приготовлений. Эта часть более сложная. Для получения дополнительной информации, пожалуйста, обратитесь к двум другим моим сообщениям в блоге.
Подготовка:
-
Чтобы зарегистрироваться в качестве разработчика Red Hat, см.
Общие команды Redhat rpm и как настроить репозиторий программного обеспечения yum с помощью yum install. -
Установите devtoolset для переключения версий gcc и g++, см.:
Установите Red Hat Developer Toolset на Redhat7 и свободно переключайтесь между версиями gcc и g++
4. Проверка
Предполагая, что вы завершили установку devtoolset на этом этапе, возьмите в качестве примера установленный devtoolset-12,
Выполните следующую команду, чтобы gcc12 временно вступил в силу в текущей оболочке.
scl enable devtoolset-12 'bash'
Или сделайте gcc12 постоянным, настроив переменные среды.
echo "source /opt/rh/devtoolset-12/enable" >>/etc/profile
source /etc/profile
Проверьте, является ли текущая версия gcc более высокой версией gcc12.
gcc --version
После успешного обновления версии gcc просто перекомпилируйте.
Еще одна вещь, которую следует отметить, это то, что файлы в каталоге сборки должны быть очищены, а затем повторно выполнить cmake для создания make-файла, в противном случае будет использоваться более низкая версия gcc.
su - root
cd /opt/googletest/build
rm -rf *
cmake ..
make
make install
Пока что проблема решена.