Здравствуйте!
Устанавливаю ffmpeg из исходников. Делаю это потому, что в пакете из основного репозитория не подходят конфигурационные параметры. Кроме того, мне нужна версия библиотеки libavfilter (входящей в состав ffmpeg) не из основной ветки ffmpeg'а, а та, которая разрабатывается в рамках Google Summer of Code, и из которой время от времени добавляются новые фичи в основной ffmpeg. Скачиваю патч для libavfilter из репозитория FFmpeg SoC. В скачанном есть файл checkout.sh, который закачивает из SVN предназначенную для пропатчивания версию FFmpeg, обновляет в только что скачанных исходниках папку libswscale до нужной верси (тоже из SVN) (в этой папке находяться исходники библиотеки libswscale (входящей в состав ffmpeg)) и собственно патчит FFmpeg, добавляя новые возможности libavfilter. Выполняю этот скрипт, далее конфигурирую нужным образом, компилирую и устанавливаю. Вот точный набор команд, которые я выполняю:
cd ~/src
svn checkout svn://svn.ffmpeg.org/soc/libavfilter
cd ~/src/libavfilter
./checkout.sh
mv ./ffmpeg ..
cd ../ffmpeg
rm -r ../libavfilter
./version.sh . version.h
./configure --disable-static --enable-shared --enable-gpl --enable-postproc --enable-x11grab --enable-libmp3lame --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libxvid
make
sudo make install
sudo ldconfig
make clean
Последняя на момент написания этого сообщения версия FFmpeg SoC - r5888 от 02.08.2010 20:18:10 UTC+4, причём последнее изменение в libavfilter было сделано в ревизии r5873 от 27.07.2010 20:28:44 UTC+4. Последняя версия патча libavfilter предназначена для версии FFmpeg r24545 и версии libswscale r31782. Вот содержимое файла checkout.sh из этой версии, который делает пропатчивание:
#! /bin/sh
echo "checking out pristine ffmpeg"
svn checkout svn://svn.ffmpeg.org/ffmpeg/trunk/ ffmpeg -r24545
echo "downloading the corresponding version of swscale"
cd ffmpeg/libswscale
svn up -r31782
cd ../..
echo "patching ffmpeg"
for diff in $(ls $(pwd)/diffs/*.diff); do patch -d ffmpeg -p0 -i $diff; done
echo "copying files to libavfilter"
cp \
vf_clone.c \
vf_concatenate.c \
vf_drawbox.c \
vf_drawtext.c \
vf_fade.c \
vf_fifo.c \
vf_fps.c \
vf_hflip.c \
vf_negate.c \
vf_overlay.c \
vf_rotate.c \
vf_setpts.c \
vf_split.c \
vf_transpose.c \
vsrc_movie.c \
ffmpeg/libavfilter
Собственно, проблема в том, что установка из исходников в общем-то заканчивается успешно, но на одном компьютере ffmpeg после установки работает нормально, а на втором при запуске выдаётся ошибка: ffmpeg: relocation error: /usr/local/lib/libavfilter.so.1: symbol sws_isSupportedInput, version LIBSWSCALE_0 not defined in file libswscale.so.0 with link time reference. В обоих случаях набор действий абсолютно одинаковый (приведён выше), набор ПО в системе практически одинаковый, но на втором архитектура x86, а на первом x86-64. Что в общем означает эта ошибка? Насколько я понял, она означает, что libavfilter.so.1 исползует функцию sws_isSupportedInput версии LIBSWSCALE_0 из библиотеки libswscale.so.0, но её в такой версии там нет. Обе библиотеки компилируются в процессе установки ffmpeg. И на первом, и на втором компьютере для установки используется абсолютно идентичный набор действий, компилируется один и тот же исходный код. Как может на первом компьютере эта функция иметься в такой версии, а на втором нет? Перекомпилировал несколько раз, поведение сохраняется. Исходники в SVN не меняются с 27.07.10 (то есть скачивается и компилируется одно и то же).
Версии ПО, о котором идёт речь: Ubuntu 10.04, ffmpeg SVN-r24545, libswscale SVN-r31782, libavfilter-soc SVN-r5873 -- SVN-r5888 (они все одинаковые).