В 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 Исходя из исходного кода, тогда система сборки также создаст оба.

Другие вопросы по тегам