Ошибка компиляции gtest 'is_tribuly_copy_constructible' не является членом 'std'

Ошибка компиляции 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.

20221225212542

Проверьте локальную версию 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 отсюда для входа

20221225213728

Возьмем в качестве примера последнюю версию Red Hat Developer Toolset 12.0, и мы увидим, что она содержит множество инструментов:
20221225214048

Для простоты мы устанавливаем весь набор инструментов прямо здесь, а соответствующую версию gcc12 можно использовать после завершения установки.

yum install devtoolset-12

Следует отметить, что если вы выполните указанную выше команду напрямую, скорее всего, появится сообщение о том, что склад не найден. Поскольку вы хотите установить devtoolset на RHEL, вам потребуется ряд приготовлений. Эта часть более сложная. Для получения дополнительной информации, пожалуйста, обратитесь к двум другим моим сообщениям в блоге.

Подготовка:

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

Пока что проблема решена.

20221226015751

Guess you like

Origin blog.csdn.net/hubing_hust/article/details/128439751