В Libsourcey отсутствует ошибка компиляции ffic
Я пытаюсь запустить LibSourcey для использования потокового сервера Webrtc.
Дело в том, что я не могу заставить его работать. Я изо всех сил пытался создать проект на моем Ubuntu 16.04(Regexp в файлах cmake), но теперь он исправлен. Проблема, которую я на самом деле получил, это ошибка общего объекта во время компиляции:
usr/bin/ld: /home/kimmie/ffmpeg_build/lib/libswresample.a(options.o):
relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object;
recompile with -fPIC
/home/kimmie/ffmpeg_build/lib/libswresample.a: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
av/CMakeFiles/av.dir/build.make:783: recipe for target 'av/libscy_av.so.1.0.2' failed
Любая помощь будет очень ценится, так как я не знаю, что делать сейчас.
2 ответа
Я ударил эту же ошибку на Ubuntu 16.04
,
В итоге я перекомпилировал FFmpeg с флагами для создания общих библиотек. Следуя полям с примерами кода в Руководстве по компиляции FFmpeg, я добавил следующие два флага в строки./configure, где это применимо:
--enable-ПИК
--enable-общий
Я удалил --disable-shared
флаги тоже.
я добавил --enable-pic
а также --enable-shared
для каждого компонента и убрал флаг, если он вернул сообщение о том, что он не был распознан для этого компонента. По крайней мере для libx264, libfdk-acc и libmp3lame требуется --enable-shared. И затем для окончательного FFmpeg (скопируйте и вставьте из руководства 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" \
--bindir="$HOME/bin" \
--enable-gpl \
--enable-libass \
--enable-libfdk-aac \
--enable-libfreetype \
--enable-libmp3lame \
--enable-libopus \
--enable-libtheora \
--enable-libvorbis \
--enable-libvpx \
--enable-libx264 \
--enable-libx265 \
--enable-nonfree \
--enable-pic \
--enable-shared
Обратите внимание, что последние две строки в моем примере отличаются от руководства FFmpeg.
После того, как вы все это сделаете, вероятно, лучше всего удалить исходный код и папку сборки Libsourcey и начать все сначала.
У меня ушло около 4-5 дней, чтобы наконец скомпилировать и успешно собрать Libsourcey с зависимостями FFmpeg и WebRTC. Я также натолкнулся на некоторые другие препятствия, так что не забудьте отметить меня, если у вас есть другие вопросы. Примечание: я новичок в сборке Linux и не полностью разбираюсь во всех концепциях; это то, что сработало для меня, и, возможно, это сработает для вас.
У вас ошибка связи, а не ошибка компиляции. Вы не столкнулись с ошибкой, вы только что попытались установить связь, которая не может работать.
Вы пытаетесь создать общую библиотеку libscy_av.so
, Все объектные файлы, которые связаны в общей библиотеке, должны состоять из независимого от позиции кода. Чтобы создать такой объектный файл с помощью gcc, вы компилируете с опцией -fPIC
,
Компоновщик обнаруживает, что вашей общей библиотеке требуется объектный файл options.o
, который является членом статической библиотеки libswresample.a
, Затем он обнаруживает, что это options.o
не является PIC, и поэтому не может быть связан в общей библиотеке. Сбой связи, и компоновщик сообщает вам, что options.o
должен быть перекомпилирован с -fPIC
опция компилятора.
Чтобы следовать этому совету, вам необходимо перестроить статическую библиотеку. libswresample.a
из источника, с -fPIC
добавлены флаги компилятора.
Вы могли бы сделать это, но для объектных файлов в статической библиотеке нет ничего необычного, и есть более простой вариант. Ваша ошибка была связана со статической версией libswresample
(libswresample.a
), а не общая версия (libswresample.so
), который будет ПОС. Просто исправьте эту ошибку. Если вы установите libswresample.a
из пакета dev, предоставленного вашим менеджером пакетов, он также предоставит libswresample.so
, Если вы построили libswresample
Исходя из исходного кода, тогда система сборки также создаст оба.