Ошибка конфигурации при настройке компиляции FFMPEG с NVCC/CUDA.

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

Я пытаюсь скомпилировать последнюю версию 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 которую вы используете.

Применение

Шаги по решению проблемы:

  1. Проверка совместимости версий: Убедитесь, что у вас на системе установлен GCC версии 13.2 или совместимой с вашей версией NVCC. Лучше всего установить и использовать конкретно ту версию GCC, которая рекомендуется разработчиками CUDA.

  2. Переключение версий компилятора: При установке нескольких версий GCC убедитесь, что вы используете правильную версию во время запуска конфигурационного скрипта. Вы можете использовать update-alternatives в Linux для управления версиями компиляторов и их переключения.

  3. Изоляция окружения: Используйте изоляцию окружения с помощью инструментов типа Docker или Conda для создания чистого окружения, где версии всех инструментов будут строго контролируемы.

  4. Настройки конфигурационного скрипта: Исправьте команду конфигурации, чтобы явно указать нужный компилятор. Возможно, потребуется изменить часть --cc=gcc-13.2 на прямой путь к нужной версии компилятора. Например: --cc=/usr/bin/gcc-13.

  5. Установка и проверка альтернативных версий: Если необходимо, скомпилируйте и установите собственные версии GCC в отдельный каталог (например, /opt/gcc-13.2) и используйте их, изменив путь в параметре --cc. Убедитесь, что все переменные среды такие как CXX, CC, CPP, LD_LIBRARY_PATH указывают на правильные версии инструментов и их библиотеки.

  6. Логирование и анализ ошибок: Всегда изучайте лог-файлы конфигурации и сборки, они могут содержать подсказки или более конкретные ошибки, которые помогут в решении проблемы.

  7. Обратная связь и помощь от сообщества: Если, несмотря на все усилия, проблема не решается, рассмотрите возможность обратиться за помощью к сообществу, например, форумы CUDA Developer, где вы сможете найти специалистов, уже сталкивавшихся с подобными проблемами.

Следуя этим рекомендациям, вы должны быть в состоянии успешно скомпилировать FFMPEG с поддержкой CUDA на вашей системе. Удачи!

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

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