Я хотел сам скомпилировать 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 ответ
Факты:
перед тем, как символ новой строки сообщает оболочке, что команда продолжается в следующей строке.
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 часов назад