web-dev-qa-db-de.com

Neukompilieren mit -fPIC

Ich habe versucht, mein ffmpeg auf meinem ARM Ubuntu-Rechner neu zu installieren, indem ich diesem Leitfaden gefolgt bin. Leider erhalte ich beim Kompilieren eines Programms, das diese Bibliothek verwendet, den folgenden Fehler:

/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

Jetzt möchte ich es mit -fPIC Neu kompilieren, wie es der Compiler vorschlägt, aber ich habe keine Ahnung, wie. Jede Hilfe wird geschätzt.

55
user1455085

kurz gesagt bedeutet der Fehler, dass Sie keine statische Bibliothek zum Verknüpfen mit einer dynamischen verwenden können. Der richtige Weg ist, einen libavcodec in .so anstelle von .a kompilieren zu lassen, damit die andere .so-Bibliothek, die Sie erstellen möchten, eine gute Verbindung herstellt.

der kürzeste Weg ist das Hinzufügen von --enable-shared beim ./configure Optionen. oder Sie können sogar versuchen, gemeinsam genutzte (oder statische) Bibliotheken zu deaktivieren ... Sie wählen, was für Sie geeignet ist!

61
zaufi

Schauen Sie sich diese Seite an .

sie können versuchen, das Flag global hinzuzufügen, indem Sie Folgendes verwenden: export CXXFLAGS="$CXXFLAGS -fPIC"

15
Kraiden

Nach dem Konfigurationsschritt haben Sie wahrscheinlich ein Makefile. Suchen Sie in diesem Makefile nach CFLAGS (oder ähnlichem). puf -fPIC am Ende und starte make erneut. Mit anderen Worten: -fPIC ist eine Compileroption, die irgendwo an den Compiler übergeben werden muss.

6
dmaij

Ich habe das gleiche Problem beim Versuch, Dashcast auf Centos 7 zu installieren. Das Update fügte am Ende jeder CFLAGS im x264-Makefile -fPIC Hinzu. Dann musste ich make distclean Für x264 und ffmpeg ausführen und neu erstellen.

1
Tony Pavick

Ich hatte dieses Problem beim Erstellen von statischen FFMPEG-Bibliotheken (z. B. libavcodec.a) für die Android x86_64-Zielplattform (mit Android NDK-Clang)) Bibliothek Das Problem trat auf, obwohl alle FFMPEG C -> Objektdateien (* .o) mit der Kompilierungsoption -fPIC kompiliert wurden:

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

Das Problem trat nur bei libavcodec.a und libswscale.a auf.

Die Ursache für dieses Problem ist, dass FFMPEG Assembler-Optimierungen für x86 * -Plattformen aufweist , z. Die Ursache für das gemeldete Problem ist libavcodec/h264_qpel_10bit.asm -> h264_qpel_10bit.o.

Bei der Erstellung einer statischen X86-64-Bit-Bibliothek (z. B. libavcodec.a) sieht es so aus, als ob Assemblerdateien (z. B. libavcodec/h264_qpel_10bit.asm) einige x86-Assemblerbefehle (32 Bit) verwenden, die beim statischen Verknüpfen nicht kompatibel sind mit x86-64-Bit-Zielbibliothek , da sie den erforderlichen Verlagerungstyp nicht unterstützen.

Mögliche Lösungen :

  1. kompilieren Sie alle ffmpeg-Dateien ohne Assembler-Optimierungen (für ffmpeg ist dies die Option configure: --disable-asm).
  2. erstellen Sie dynamische Bibliotheken (z. B. libavcodec.so) und verknüpfen Sie sie dynamisch in Ihrer endgültigen Bibliothek

Ich wählte 1) und es löste das Problem.

Referenz: https://tecnocode.co.uk/2014/10/01/dynamic-relocs-runtime-overflows-and-fpic/

0
Robert Lujo