Как перекомпилировать с -fPIC

Я пытался переустановить свой ffmpeg, следуя этому руководству, на моем компьютере с ARM Ubuntu. К сожалению, когда я компилирую программу, которая использует эту библиотеку, я получаю следующую ошибку:

/usr/bin/ld: /usr/local/lib/libavcodec.a(amrnbdec.o): relocation R_ARM_MOVW_ABS_NC against `a local symbol' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libavcodec.a: could not read symbols: Bad value
collect2: ld returned 1 exit status

Теперь я хотел бы перекомпилировать его с -fPIC как предлагает компилятор, но я понятия не имею, как. Любая помощь приветствуется.

9 ответов

Решение

Вкратце, ошибка означает, что вы не можете использовать статическую библиотеку для связи с динамической. Правильный способ - это скомпилировать libavcodec в.so вместо.a, так что другая библиотека.so, которую вы пытаетесь собрать, будет хорошо связываться.

самый короткий способ сделать это добавить --enable-shared в ./configure опции. или даже вы можете попытаться отключить общие (или статические) библиотеки вообще... вы выбираете то, что подходит именно вам!

Посмотрите на эту страницу.

Вы можете попробовать глобально добавить флаг, используя: export CXXFLAGS="$CXXFLAGS -fPIC"

У меня была эта проблема при создании статических библиотек FFMPEG (например, libavcodec.a) для целевой платформы Android x86_64 (с использованием Android NDK clang). При статическом связывании с моей библиотекой проблема возникла, хотя все FFMPEG C -> объектные файлы (*.o) были скомпилированы с опцией компиляции -fPIC:

x86_64/libavcodec.a(h264_qpel_10bit.o): 
requires dynamic R_X86_64_PC32 reloc against 'ff_pw_1023' 
which may overflow at runtime; recompile with -fPIC

Проблема возникла только для libavcodec.a и libswscale.a.

Источником этой проблемы является то, что FFMPEG имеет оптимизацию на ассемблере для платформ x86*, например, причина проблемы - в libavcodec / h264_qpel_10bit.asm -> h264_qpel_10bit.o.

При создании битовой статической библиотеки X86-64 (например, libavcodec.a) это выглядит как файлы ассемблера (например, libavcodec/h264_qpel_10bit.asm), использующие некоторые команды ассемблера x86 (32bit), которые несовместимы при статическом связывании с целевой библиотекой x86-64, поскольку они не поддерживает требуемый тип перемещения.

Возможные решения:

  1. компилировать все файлы ffmpeg без оптимизации на ассемблере (для ffmpeg это опция конфигурации: --disable-asm)
  2. создавать динамические библиотеки (например, libavcodec.so) и динамически связывать их в окончательной библиотеке

Я выбрал 1) и это решило проблему.

Ссылка: https://tecnocode.co.uk/2014/10/01/dynamic-relocs-runtime-overflows-and-fpic/

После этапа настройки у вас, вероятно, есть make-файл. Внутри этого make-файла ищите CFLAGS (или аналогичные). puf -fPIC в конце и снова запустить make. Другими словами -fPIC - это опция компилятора, которая должна быть где-то передана компилятору.

Если вы создаете общую библиотеку, но вам нужно связать ее с помощью статического libavcodec, добавьте флаги компоновщика:

      -Wl,-Bsymbolic

В случае cmake:

      set(CMAKE_SHARED_LINKER_FLAGS "-Wl,-Bsymbolic")

Я столкнулся с этой же проблемой, пытаясь установить Dashcast на Centos 7. Исправление добавляло -fPIC в конце каждого из CFLAGS в Makefile x264. Тогда мне пришлось бежать make distclean как для x264, так и для ffmpeg и пересобрать.

В дополнение к хорошим ответам здесь, в частности, Роберту Луджо.

Я хочу сказать, что в моем случае я сознательно пытался статически скомпилировать версию ffmpeg. Все необходимые зависимости и все, что до сих пор требовалось, я выполнил статическую компиляцию.

Когда я бежал ./configure для процесса ffmpeg я не заметил --enable-sharedбыл в командной строке. Удаление и запуск./configureтолько тогда я смог правильно скомпилировать (все 56 МБ двоичного файла ffmpeg). Также проверьте это, если вы хотите статической компиляции

Я собираю ffmpeg 5.1.2 на CentOS7 с помощью gcc4.8.5.

Как указано в ${ffmpegRoot}/doc/platform.texi:

1)настроить с опцией

"--включить-изображение"

2) добавьте следующую опцию в свой проект LDFLAGS

"-Wl,-Bсимволический"

Перед компиляцией убедитесь, что файл "rules.mk" правильно включен в Makefile или включите его явно:

"source rules.mk"

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