
Benutzer1455085
Ich habe versucht, mein ffmpeg danach neu zu installieren führen, auf meinem ARM-Ubuntu-Rechner. 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 würde ich es gerne neu kompilieren -fPIC
wie der Compiler vorschlägt, aber ich habe keine Ahnung wie. Jede Hilfe ist willkommen.

zaufi
Kurz gesagt bedeutet der Fehler, dass Sie kann keine statische Bibliothek verwenden, die mit einer dynamischen verknüpft werden soll. Der richtige Weg ist, a zu haben libavcodec
zusammengestellt in ein .so
anstatt .a
also der andere .so
Bibliothek, die Sie erstellen möchten, lässt sich gut verknüpfen.
Der kürzeste Weg dazu ist das Hinzufügen --enable-shared
bei ./configure
Optionen. Oder Sie können sogar versuchen, gemeinsam genutzte (oder statische) Bibliotheken überhaupt zu deaktivieren … Sie wählen, was für Sie geeignet ist!

Kraiden
Schau mal rein diese Seite.
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 führen Sie make erneut aus. Mit anderen Worten -fPIC ist eine Compiler-Option, die irgendwo an den Compiler übergeben werden muss.
Ich hatte dieses Problem beim Erstellen von statischen FFMPEG-Bibliotheken (z. B. libavcodec.a) für die Zielplattform Android x86_64 (mit Android NDK Clang). Beim statischen Linken mit meiner Bibliothek trat das Problem 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.
Ursache dieses Problems ist das FFMPEG hat Assembler-Optimierungen für x86*-Plattformen B. die gemeldete Problemursache ist in libavcodec/h264_qpel_10bit.asm -> h264_qpel_10bit.o.
Beim Erstellen einer statischen X86-64-Bit-Bibliothek (z. B. libavcodec.a) sieht es aus wie Assembler-Dateien (z. B. libavcodec/h264_qpel_10bit.asm) verwendet einige x86 (32-Bit)-Assembler-Befehle, die beim statischen Linken mit x86-64-Bit-Zielbibliotheken nicht kompatibel sind da sie den erforderlichen Verschiebungstyp nicht unterstützen.
Mögliche Lösungen:
- kompilieren Sie alle ffmpeg-Dateien ohne Assembler-Optimierungen (für ffmpeg ist dies die Konfigurationsoption: –disable-asm)
- Erstellen Sie dynamische Bibliotheken (zB libavcodec.so) und binden Sie sie dynamisch in Ihre endgültige Bibliothek ein
Ich wählte 1) und es löste das Problem.
Referenz: https://tecnocode.co.uk/2014/10/01/dynamic-relocs-runtime-overflows-and-fpic/
Wenn Sie eine gemeinsam genutzte Bibliothek erstellen, aber verknüpfen müssen statischer libavcodec Linker-Flags hinzufügen:
-Wl,-Bsymbolic
Im Fall von cmake:
set(CMAKE_SHARED_LINKER_FLAGS "-Wl,-Bsymbolic")

JJJ
Ich bin auf dasselbe Problem gestoßen, als ich versucht habe, Dashcast auf Centos 7 zu installieren. Der Fix wurde hinzugefügt -fPIC
am Ende jedes CFLAGS im x264-Makefile. Dann musste ich laufen make distclean
für x264 und ffmpeg und Rebuild.

LFMekz
Zusätzlich zu den guten Antworten hier, insbesondere Robert Lujos.
Ich möchte in meinem Fall sagen, dass ich absichtlich versucht habe, eine Version von ffmpeg statisch zu kompilieren. Alle erforderlichen Abhängigkeiten und was sonst noch erforderlich war, habe ich statisch kompiliert.
Als ich rannte ./configure
für den ffmpeg-Prozess habe ich es nicht bemerkt --enable-shared
war auf der Kommandozeile. Ausbauen und laufen ./configure
Erst danach konnte ich korrekt kompilieren (alle 56 mbs einer ffmpeg-Binärdatei). Überprüfen Sie dies auch, wenn Ihre Absicht eine statische Kompilierung ist
9171100cookie-checkWie man mit -fPIC neu kompiliertyes