«Неизвестный вариант» ПУТЬ =[…]«» При следовании официальному руководству по компиляции ffmpeg

Я хотел сам скомпилировать ffmpeg, чтобы получить исполняемый файл меньшего размера, который я затем мог бы распространять с моей программой. Следуя официальному Руководство по компиляции ffmpeg для Ubuntu Я получаю сообщение об ошибке, когда дело доходит до компиляции ffmpeg, как описано в разделе Компиляция и установка -> FFmpeg. Дается следующая длинная составная команда.

cd ~/ffmpeg_sources && 
wget -O ffmpeg-snapshot.tar.bz2 https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2 && 
tar xjvf ffmpeg-snapshot.tar.bz2 && 
cd ffmpeg && 
PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure 
  --prefix="$HOME/ffmpeg_build" 
  --pkg-config-flags="--static" 
  --extra-cflags="-I$HOME/ffmpeg_build/include" 
  --extra-ldflags="-L$HOME/ffmpeg_build/lib" 
  --extra-libs="-lpthread -lm" 
  --ld="g++" 
  --bindir="$HOME/bin" 
  --enable-gpl 
  --enable-gnutls 
  --enable-libaom 
  --enable-libass 
  --enable-libfdk-aac 
  --enable-libfreetype 
  --enable-libmp3lame 
  --enable-libopus 
  --enable-libsvtav1 
  --enable-libdav1d 
  --enable-libvorbis 
  --enable-libvpx 
  --enable-libx264 
  --enable-libx265 
  --enable-nonfree && 
PATH="$HOME/bin:$PATH" make && 
make install && 
hash -r

Я хочу только включить кодировщик libvpx, а не устанавливать ffmpeg, а только скомпилировать его. Это оставляет мне эту немного более короткую команду.

cd ~/ffmpeg_sources && 
wget -O ffmpeg-snapshot.tar.bz2 https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2 && 
tar xjvf ffmpeg-snapshot.tar.bz2 && 
cd ffmpeg && 
PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure 
  --prefix="$HOME/ffmpeg_build" 
  --pkg-config-flags="--static" 
  --extra-cflags="-I$HOME/ffmpeg_build/include" 
  --extra-ldflags="-L$HOME/ffmpeg_build/lib" 
  --extra-libs="-lpthread -lm" 
  --ld="g++" 
  --bindir="$HOME/bin" 
  --enable-libvpx 
PATH="$HOME/bin:$PATH" make && 
hash -r

Эта составная команда состоит из 6 отдельных команд. При выполнении самой длинной 5-й команды

PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure 
  --prefix="$HOME/ffmpeg_build" 
  --pkg-config-flags="--static" 
  --extra-cflags="-I$HOME/ffmpeg_build/include" 
  --extra-ldflags="-L$HOME/ffmpeg_build/lib" 
  --extra-libs="-lpthread -lm" 
  --ld="g++" 
  --bindir="$HOME/bin" 
  --enable-libvpx 
PATH="$HOME/bin:$PATH" make

Я получаю эту ошибку

Unknown option "PATH=/home/joker/bin:/home/joker/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin".
See ./configure --help for available options.

где joker — мое имя пользователя на этой виртуальной машине.

Я использую Ubuntu Groovy Gorilla x64 со всеми последними обновлениями.

Что я делаю не так?

1 ответ
1

Факты:

  • перед тем, как символ новой строки сообщает оболочке, что команда продолжается в следующей строке.
  • foo=bar baz бежит baz с foo переменная в среде.
  • baz && qux бежит qux если только baz возвращает успех (статус выхода 0).

Исходная команда была похожа на

… && 
PATH=… PKG_CONFIG_PATH=… ./configure 
  … 
  --enable-nonfree && 
PATH=… make && 
…

Эквивалентно

… && PATH=… PKG_CONFIG_PATH=… ./configure … --enable-nonfree && PATH=… make && …

Итак, структура была похожа на

… && ./configure … && PATH=… make && …

Вы превратили это во что-то вроде

… && ./configure … PATH=… make && …

и PATH=… теперь есть возможность ./configure. Это не правильно.

Другими словами, вы не должны были удалять && от до PATH="$HOME/bin:$PATH" make. Ваш новый фрагмент можно исправить, добавив && В правильном месте (--enable-libvpx && ).

Это было бы менее запутанно, если бы исходный код имел следующую форму:

… 
&& PATH=… PKG_CONFIG_PATH=… ./configure 
  … 
  --enable-nonfree 
&& PATH=… make 
&& …

Теперь, если вы удалите все --enable-nonfree линия, то необходимая && перед PATH=… make выживет.


Боковое примечание: некоторые обратные косые черты в исходном коде избыточны, потому что && в самом конце линии может быть просто &&. Если вы решили разместить && вместо этого в начале следующей строки, затем в текущей строке не может быть пропущено.

  • Аааа, я только что вырезал &&. Что ж, глупая ошибка. Я не знал магии bash переменной ‘foo = bar baz’, спасибо за ввод!

    — Плавающая точка
    10 часов назад

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *