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