Tun Sie, was der Compiler Ihnen sagt, d. h. mit -fPIC
neu kompilieren . Um zu erfahren, was dieses Flag bewirkt und warum Sie es in diesem Fall benötigen, lesen Sie die Optionen zur Codegenerierung des GCC-Handbuchs.
Kurz gesagt, der Begriff positionsunabhängiger Code (PIC) bezieht sich auf den generierten Maschinencode, der speicheradressenunabhängig ist, d. h. keine Annahmen darüber trifft, wo er in den RAM geladen wurde. Nur positionsunabhängiger Code soll in gemeinsam genutzte Objekte (SO) aufgenommen werden, da sie in der Lage sein sollten, ihre Position im RAM dynamisch zu ändern.
Schließlich können Sie darüber auf Wikipedia lesen auch.
In meinem Fall trat dieser Fehler auf, weil ein make
Befehl erwartete, gemeinsam genutzte Bibliotheken abzurufen (*.so
Dateien) aus einem entfernten Verzeichnis, das durch LDFLAGS
gekennzeichnet ist Umgebungsvariable. Dort waren fälschlicherweise nur statische Bibliotheken verfügbar (*.la
oder *.a
Dateien).
Daher lag mein Problem nicht bei dem Programm, das ich kompilierte, sondern bei den entfernten Bibliotheken, die es abzurufen versuchte. Daher musste ich kein Flag hinzufügen (z. B. -fPIC
) zur Kompilierung, die durch den Verschiebungsfehler unterbrochen wurde. Vielmehr habe ich die Remote-Bibliothek neu kompiliert, damit die gemeinsam genutzten Objekte verfügbar waren.
Im Grunde war es ein getarnter Datei-nicht-gefunden-Fehler.
In meinem Fall musste ich einen falsch platzierten --disable-shared
entfernen Schalten Sie die configure
ein Aufruf für das erforderliche Programm, da gemeinsam genutzte und statische Bibliotheken beide standardmäßig erstellt wurden.
Mir ist aufgefallen, dass die meisten Programme beide Arten von Bibliotheken gleichzeitig erstellen, also ist meine wahrscheinlich ein Eckfall. Generell kann es sein, dass Sie je nach Voreinstellung lieber Shared Libraries aktivieren müssen.
Um Ihre spezielle Situation mit Kompilierungsschaltern und Standardwerten zu untersuchen, würde ich die Zusammenfassung vorlesen, die mit ./configure --help | less
angezeigt wird , normalerweise im Abschnitt Optionale Funktionen. Ich habe oft festgestellt, dass diese Lektüre zuverlässiger ist als Installationsanleitungen, die nicht aktualisiert werden, während sich Abhängigkeitsprogramme weiterentwickeln.
Mit -no-pie
behoben Option in der Linker-Phase:
g++-8 -L"/home/pedro/workspace/project/lib" -no-pie ...