Вопрос или проблема
Я запускаю код на 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
, что указывает на неправильную ссылку или отсутствие соответствующей библиотеки.
Применение
Первый шаг в решении этой проблемы — убедиться в правильной конфигурации сборочного окружения:
-
Корректировка команды компиляции:
- Убедитесь, что флаг
-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
- Убедитесь, что флаг
-
Проблемы с библиотекой FFTW: Чтобы устранить ошибку "undefined reference to
fftw_malloc
":- Проверьте переменную среды
$FFTW3_INC
, указывающую путь к заголовочным файлам библиотеки FFTW3. Она должна соответствовать пути, верному для вашей системной конфигурации. - Убедитесь, что компоновщику передается путь к библиотеке FFTW с помощью флага
-L
. Например:-L/path/to/fftw3/library -lfftw3
- Проверьте переменную среды
-
Проверка конфигурации TAU: TAU может использовать собственные специфичные параметры, которые могут быть заданы в конфигурационных файлах. Проверьте, не конфликтуют ли они с текущими параметрами компиляции.
-
Использование Makefile: Если сборка управляется
Makefile
, проверьте секции с определениями переменныхLIB
, убедитесь, что они включают пути как к заголовочным файлам, так и к библиотекам.
Если ваши текущие действия не приводят к решению, рассмотрите возможность обновления компилятора GCC до более свежей версии. Обычно в новых версиях по умолчанию используются современные стандарты C++, такие как C++14 или C++17, что решает множество подобных проблем.
Подводя итог, вам необходимо акцентировать внимание как на правильной конфигурации компиляции и линковки, так и на актуальности используемых инструментов и библиотек. Применение данных корректировок и обучение особенностям различных стандартов программирования позволит существенно упростить процесс решения подобных задач в будущем.