Вопрос или проблема
Я пытаюсь скомпилировать последнюю версию FFMPEG (49726a922fd2b358feb7753488d415180da5121c
) на Fedora 41 с некоторыми библиотеками, включая библиотеки CUDA.
Всё работает хорошо при компиляции без CUDA, но я получаю 2 загадочные ошибки, когда пытаюсь выполнить команду configure
с NVCC:
nvcc -gencode arch=compute_60,code=sm_60 -O2 -std=c++11 -m64 -ptx -c -o /tmp/ffconf.q0uMcStN/test.o /tmp/ffconf.q0uMcStN/test.cu
nvcc warning : Support for offline compilation for architectures prior to '<compute/sm/lto>_75' will be removed in a future release (Use -Wno-deprecated-gpu-targets to suppress warning).
/usr/include/c++/14/type_traits(1610): error: "__is_nothrow_new_constructible" is not a function or static data member
constexpr bool __is_nothrow_new_constructible
^
/usr/include/c++/14/type_traits(1610): error: "constexpr" is not valid here
constexpr bool __is_nothrow_new_constructible
^
2 errors detected in the compilation of "/tmp/ffconf.q0uMcStN/test.cu".
ERROR: failed checking for nvcc.
Я пытался скомпилировать с использованием стандартного gcc (gcc (GCC) 14.2.1 20250110 (Red Hat 14.2.1-7)
), но моя версия NVCC (Build cuda_12.8.r12.8/compiler.35404655_0
), похоже, поддерживает только версию GCC 13.2: https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html.
Я скомпилировал и снова запустил команду configure
, но, похоже, у меня те же ошибки.
Вот команда configure
:
PKG_CONFIG_PATH="/usr/local/lib/pkgconfig" \
./configure \
--cc=gcc-13.2 \
--extra-libs=-lpthread --prefix="/usr/local" \
--extra-cflags="-I/usr/local/include -I/usr/local/cuda/include" \
--extra-ldflags="-L/usr/local/lib -L/usr/local/cuda/lib64" \
--pkg-config-flags="--static" --enable-gpl --enable-nonfree \
--enable-libfdk-aac --enable-libmp3lame --enable-libopus \
--enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 \
--enable-libvidstab --enable-libaom \
--enable-cuda-nvcc --enable-libnpp \
--disable-static --enable-shared
Если у вас есть какие-либо идеи или наводки по этому поводу, я был бы очень благодарен.
Я знаю, что это частично вопрос по программированию, но мой вопрос был закрыт на Stack Overflow, поэтому я спросил, куда мне его поместить, и люди ответили здесь.
Ответ или решение
Конфигурация и компиляция проектов, особенно таких сложных, как FFMPEG с поддержкой CUDA, может оказаться непростой задачей, особенно когда дело касается обеспечения совместимости версий инструментов, таких как компиляторы и библиотеки. В вашем случае проблема заключается в несоответствии версий GCC, используемых NVCC, и тех, что доступны в вашей операционной системе Fedora 41.
Теория
Начнем с теоретической части. NVCC (NVIDIA CUDA Compiler) является компонентом CUDA, который отвечает за компиляцию программ на языках CUDA C и CUDA C++. Это специализированный компилятор, который требует совместимости с определенными версиями GCC, для коректной компиляции и сборки CUDA-ядра вместе с другим C++ кодом. Обычно, спецификации совместимости перечисляются в документации к CUDA. Как отмечено в вашем случае, ваша версия NVCC поддерживает только GCC 13.2, в то время как у вас установлен GCC версии 14.2.1.
Ошибка, которую вы видите, исходит из несовместимости между этими версиями. Новые версии GCC могут содержать изменения в стандартной библиотеке C++, которые не поддерживаются текущей версией NVCC, в результате чего возникают такие синтаксические ошибки.
Пример
Вы пытаетесь использовать nvcc
для компиляции с GCC 14, что приводит к ошибкам, связанным с несовместимостью типов и спецификаторов, как в вашей ситуации с __is_nothrow_new_constructible
. GCC в версии 14 мог изменить C++-интерфейсы, которые не учтены в текущей версии NVCC которую вы используете.
Применение
Шаги по решению проблемы:
-
Проверка совместимости версий: Убедитесь, что у вас на системе установлен GCC версии 13.2 или совместимой с вашей версией NVCC. Лучше всего установить и использовать конкретно ту версию GCC, которая рекомендуется разработчиками CUDA.
-
Переключение версий компилятора: При установке нескольких версий GCC убедитесь, что вы используете правильную версию во время запуска конфигурационного скрипта. Вы можете использовать
update-alternatives
в Linux для управления версиями компиляторов и их переключения. -
Изоляция окружения: Используйте изоляцию окружения с помощью инструментов типа Docker или Conda для создания чистого окружения, где версии всех инструментов будут строго контролируемы.
-
Настройки конфигурационного скрипта: Исправьте команду конфигурации, чтобы явно указать нужный компилятор. Возможно, потребуется изменить часть
--cc=gcc-13.2
на прямой путь к нужной версии компилятора. Например:--cc=/usr/bin/gcc-13
. -
Установка и проверка альтернативных версий: Если необходимо, скомпилируйте и установите собственные версии GCC в отдельный каталог (например,
/opt/gcc-13.2
) и используйте их, изменив путь в параметре--cc
. Убедитесь, что все переменные среды такие какCXX
,CC
,CPP
,LD_LIBRARY_PATH
указывают на правильные версии инструментов и их библиотеки. -
Логирование и анализ ошибок: Всегда изучайте лог-файлы конфигурации и сборки, они могут содержать подсказки или более конкретные ошибки, которые помогут в решении проблемы.
-
Обратная связь и помощь от сообщества: Если, несмотря на все усилия, проблема не решается, рассмотрите возможность обратиться за помощью к сообществу, например, форумы CUDA Developer, где вы сможете найти специалистов, уже сталкивавшихся с подобными проблемами.
Следуя этим рекомендациям, вы должны быть в состоянии успешно скомпилировать FFMPEG с поддержкой CUDA на вашей системе. Удачи!