Ошибка: #error Этот файл требует поддержки компилятором и библиотекой стандарта ISO C++ 2011

Вопрос или проблема

Я запускаю код на C++ с помощью TAU (инструмент для анализа и профилировки) на Ubuntu 20.04 LTS, используя некоторый кластер. Команда, которую я запускаю, выглядит так:

tau_cxx.sh -I$FFTW3_INC wrappingScript.cpp spectralFunctions.cpp arithmeticFunctions.cpp -optLinking="-lfftw3 -lm -g" -o ../../Datasim/TauTest.out

Однако это дает мне следующую ошибку:

Executing> /opt/apps/gcc/5.2.0/bin/g++ -I/opt/apps/gcc5_2/mvapich22_2/fftw/3.3.8/include wrappingScript.cpp spectralFunctions.cpp arithmeticFunctions.cpp -o ../../Datasim/TauTest.out
In file included from /arcapps/cascades-broadwell-slurm/opt/apps/gcc/5.2.0/include/c++/5.2.0/cstdint:35:0,
                 from arithmeticFunctions.cpp:8:
/arcapps/cascades-broadwell-slurm/opt/apps/gcc/5.2.0/include/c++/5.2.0/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
 #error This file requires compiler and library support for the \
  ^

make: *** [all] Error 1

Поэтому я попробовал скомпилировать с -std=c++11 вот так:

tau_cxx.sh -I$FFTW3_INC -std=c++11 wrappingScript.cpp spectralFunctions.cpp arithmeticFunctions.cpp -optLinking="-lfftw3 -lm -g" -o ../../Datasim/TauTest.out

Это как-то портит мой -I$FFTW3_INC и я получаю ошибки вроде:

undefined reference to `fftw_malloc'

Я также пытался связать это в своих опциях TAU вот так:

tau_cxx.sh -I$FFTW3_INC wrappingScript.cpp spectralFunctions.cpp arithmeticFunctions.cpp -optLinking="-lfftw3 -lm -std=c++11 -g" -o ../../Datasim/TauTest.out

Это не дало эффекта и выдало мне изначальную ошибку. Кто-нибудь может помочь, пожалуйста, я запутался.

После добавления (необходимого) флага -std=c++11 (странно, по умолчанию сейчас -std=gnu++17 –т.е. ISO C++ 2017 + GNU расширения– что должно включать предыдущее), код компилируется, но определение для fftw_malloc (предположительно в какой-то библиотеке) отсутствует. Проверьте страницу руководства для fftw_malloc, она должна указать правильную команду. Если это вызывается, например, из Makefile, проверьте строки LIB = или подобные.

.

Ответ или решение

Ошибка компиляции C++-кода, связанная с библиотеки и компиляторами для поддержки стандарта ISO C++ 2011, довольно распространенная проблема, особенно когда используется окружение, настраиваемое вручную или работа ведется в кластерной системе с различными версиями компиляторов. Рассмотрим теоретическую основу этой проблемы, приведем примеры и обсудим возможные решения.

Теория

Основой проблемы, с которой вы столкнулись, является несовместимость используемой версии компилятора GCC с требуемыми стандартами C++. В данном случае используется GCC версии 5.2.0, который по умолчанию может не включать поддержку стандартов C++11, что и становится причиной ошибки компиляции.

Стандарт C++11 (или его расширенная версия gnu++11, включающая расширения GNU) отражает значительные изменения в языке, такие как новые возможности работы с памятью, многопоточность, обобщенное программирование и многое другое. Для включения этой поддержки компилятору требуется явная директива в виде ключа -std=c++11 или -std=gnu++11.

Пример

Ваша команда компиляции выглядит следующим образом:

tau_cxx.sh -I$FFTW3_INC wrappingScript.cpp spectralFunctions.cpp arithmeticFunctions.cpp -optLinking="-lfftw3 -lm -g" -o ../../Datasim/TauTest.out

Ошибку, которую вы получаете, указывает на необходимость использования флага -std=c++11:

#error This file requires compiler and library support for the ISO C++ 2011 standard...

Попытка добавления флага -std=c++11 породила другие проблемы — ошибка, связанная с отсутствием определения функций библиотеки FFTW3, таких как fftw_malloc, что указывает на неправильную ссылку или отсутствие соответствующей библиотеки.

Применение

Первый шаг в решении этой проблемы — убедиться в правильной конфигурации сборочного окружения:

  1. Корректировка команды компиляции:

    • Убедитесь, что флаг -std=c++11 добавляется непосредственно к параметрам компилятора. Команда должна быть следующей:
      tau_cxx.sh -std=c++11 -I$FFTW3_INC wrappingScript.cpp spectralFunctions.cpp arithmeticFunctions.cpp -optLinking="-lfftw3 -lm -g" -o ../../Datasim/TauTest.out
  2. Проблемы с библиотекой FFTW: Чтобы устранить ошибку "undefined reference to fftw_malloc":

    • Проверьте переменную среды $FFTW3_INC, указывающую путь к заголовочным файлам библиотеки FFTW3. Она должна соответствовать пути, верному для вашей системной конфигурации.
    • Убедитесь, что компоновщику передается путь к библиотеке FFTW с помощью флага -L. Например:
      -L/path/to/fftw3/library -lfftw3
  3. Проверка конфигурации TAU: TAU может использовать собственные специфичные параметры, которые могут быть заданы в конфигурационных файлах. Проверьте, не конфликтуют ли они с текущими параметрами компиляции.

  4. Использование Makefile: Если сборка управляется Makefile, проверьте секции с определениями переменных LIB, убедитесь, что они включают пути как к заголовочным файлам, так и к библиотекам.

Если ваши текущие действия не приводят к решению, рассмотрите возможность обновления компилятора GCC до более свежей версии. Обычно в новых версиях по умолчанию используются современные стандарты C++, такие как C++14 или C++17, что решает множество подобных проблем.

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

Оцените материал
Добавить комментарий

Капча загружается...