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.
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!
Schauen Sie sich diese Seite an .
sie können versuchen, das Flag global hinzuzufügen, indem Sie Folgendes verwenden: export CXXFLAGS="$CXXFLAGS -fPIC"
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.
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.
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 :
Ich wählte 1) und es löste das Problem.
Referenz: https://tecnocode.co.uk/2014/10/01/dynamic-relocs-runtime-overflows-and-fpic/