Wie man mit -fPIC neu kompiliert

Lesezeit: 4 Minuten

Wie man mit fPIC neu kompiliert
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.

1646262606 345 Wie man mit fPIC neu kompiliert
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 .aalso 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!

  • Du hast mich gerade vor starken Kopfschmerzen bewahrt --enable-shared. Danke!

    – BenMorel

    5. Februar 2016 um 14:41 Uhr

  • Danke dafür! Ich möchte auch hinzufügen, dass ich auch tun musste make distclean beim erneuten Ausführen von make, um einige Dateien loszuwerden, die bereits statisch kompiliert wurden.

    – Harald Nordgren

    25. März 2016 um 20:51 Uhr


Wie man mit fPIC neu kompiliert
Kraiden

Schau mal rein diese Seite.

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

  • Dadurch wurde ein Installationsprogramm für Knotenpakete (für node-swipl) behoben, das node-gyp verwendete und denselben Fehler erzeugte. Danke 🙂

    Benutzer1598467

    29. Oktober 2014 um 1:37 Uhr

  • Ich habe einen Ersatz für den toten Link in archive.org hinzugefügt

    – rubo77

    8. August 2015 um 23:29 Uhr

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:

  1. kompilieren Sie alle ffmpeg-Dateien ohne Assembler-Optimierungen (für ffmpeg ist dies die Konfigurationsoption: –disable-asm)
  2. 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")

Wie man mit fPIC neu kompiliert
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.

1646262609 975 Wie man mit fPIC neu kompiliert
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

917110cookie-checkWie man mit -fPIC neu kompiliert

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy