Ich versuche, diesen Quellcode aus dem Makefile in einem VPS zu kompilieren, aber es funktioniert nicht. Das VPS ist ein 64-Cent-Betriebssystem
Hier ist der vollständige Fehler
# make
gcc -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/amx/*.c
g++ -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/*.cpp
g++ -c -O3 -w -DLINUX -I../SDK/amx/ *.cpp
g++ -O2 -fshort-wchar -shared -o "TCP_V1.so" *.o
/usr/bin/ld: TCP-LINUX_V1.o: relocation R_X86_64_32 against `.rodata.str1.8' can not be used when making a shared object; recompile with -fPIC
TCP-LINUX_V1.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
make: *** [all] Error 1
Hier ist mein Makefile:
GPP=g++
GCC=gcc
OUTFILE="TCP_V1.so"
COMPILE_FLAGS=-c -O3 -w -DLINUX -I../SDK/amx/
all:
$(GCC) $(COMPILE_FLAGS) ../SDK/amx/*.c
$(GPP) $(COMPILE_FLAGS) ../SDK/*.cpp
$(GPP) $(COMPILE_FLAGS) *.cpp
$(GPP) -O2 -fshort-wchar -shared -o $(OUTFILE) *.o
Weiß jemand was los ist?
recompile with -fPIC
?COMPILE_FLAGS=-c -O3 -w -DLINUX -fPIC -I../SDK/amx/
Antworten:
Tun Sie, was der Compiler Ihnen sagt, dh kompilieren Sie mit
-fPIC
. Informationen dazu, was dieses Flag bewirkt und warum Sie es in diesem Fall benötigen, finden Sie unter Codegenerierungsoptionen im GCC-Handbuch.Kurz gesagt bezieht sich der Begriff positionsunabhängiger Code (PIC) auf den erzeugten Maschinencode, der speicheradressenunabhängig ist, dh keine Annahmen darüber macht, wo er in den RAM geladen wurde. In gemeinsam genutzten Objekten (SO) sollte nur positionsunabhängiger Code enthalten sein, da diese in der Lage sein sollten, ihren Speicherort im RAM dynamisch zu ändern.
Schließlich können Sie auch auf Wikipedia darüber lesen .
quelle
-fPIC
zu allen Compiler-Aufrufen für alle Quelldateien (Übersetzungseinheiten, z. B.*.cpp
Dateien) der Bibliothek hinzu. Die konkrete Vorgehensweise hängt von dem von Ihnen verwendeten Build-System ab. In CMake könnten Sie beispielsweise Probleme verursachenset_target_properties(${LIBRARY_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON)
. Im Falle dieses Typen (mit einfachem altem Make) müsste er dies tun,COMPILE_FLAGS+=-fPIC
da er diese Variable verwendet, um den Satz von Kompilierungsflags für alle Quelldateien seiner Bibliothek zu kennzeichnen.In meinem Fall trat dieser Fehler auf, weil ein
make
Befehl erwartete, gemeinsam genutzte Bibliotheken (*.so
Dateien) aus einem Remote-Verzeichnis abzurufen, das durch eineLDFLAGS
Umgebungsvariable angegeben wird. Aus Versehen waren dort nur statische Bibliotheken (*.la
oder*.a
Dateien) verfügbar .Daher lag mein Problem nicht bei dem Programm, das ich kompilierte, sondern bei den Remote-Bibliotheken, die es abzurufen versuchte. Daher musste ich
-fPIC
der Kompilierung, die durch den Verschiebungsfehler unterbrochen wurde , kein Flag (z. B. ) hinzufügen . Vielmehr habe ich die Remote-Bibliothek neu kompiliert, sodass die freigegebenen Objekte verfügbar waren.Grundsätzlich handelt es sich um einen nicht gefundenen Fehler in der Verkleidung.
In meinem Fall musste ich einen falsch platzierten
--disable-shared
Schalter imconfigure
Aufruf für das erforderliche Programm entfernen , da sowohl gemeinsam genutzte als auch statische Bibliotheken standardmäßig erstellt wurden.Mir ist aufgefallen, dass die meisten Programme beide Arten von Bibliotheken gleichzeitig erstellen, daher ist meine wahrscheinlich ein Eckfall. Im Allgemeinen kann es vorkommen, dass Sie gemeinsam mit den Standardeinstellungen gemeinsam genutzte Bibliotheken aktivieren müssen.
Um Ihre spezielle Situation mit Kompilierungsschaltern und Standardeinstellungen zu untersuchen, würde ich die Zusammenfassung vorlesen, die
./configure --help | less
normalerweise im Abschnitt Optionale Funktionen angezeigt wird. Ich habe oft festgestellt, dass dieses Lesen zuverlässiger ist als Installationshandbücher, die nicht aktualisiert werden, während sich Abhängigkeitsprogramme weiterentwickeln.quelle
Es geht nicht immer um die Kompilierungsflags, ich habe den gleichen Fehler bei gentoo bei der Verwendung von distcc.
Der Grund ist, dass auf dem distcc-Server ein nicht gehärtetes Profil verwendet wird und auf dem Client das Profil gehärtet ist. Überprüfen Sie diese Diskussion: https://forums.gentoo.org/viewtopic-p-7463994.html
quelle
Es wurde mit der
-no-pie
Option in der Linker-Phase behoben:g++-8 -L"/home/pedro/workspace/project/lib" -no-pie ...
quelle
Durch einfaches Reinigen des Projekts wurde es für mich gelöst.
Mein Projekt ist eine C ++ - Anwendung (keine gemeinsam genutzte Bibliothek). Ich habe diesen Fehler nach vielen erfolgreichen Builds zufällig erhalten.
quelle
Ich hatte das gleiche Problem. Versuchen Sie, mit
-fPIC
flag neu zu kompilieren .quelle
Ich erhalte die gleiche Lösung wie @ caminos Kommentar zu https://stackoverflow.com/a/19365454/10593190 und die Antwort von XavierStuvw .
Ich habe es zum Laufen gebracht (für die Installation von ffmpeg), indem ich das Ganze einfach von Anfang an neu installiert habe, wobei alle Instanzen von
$ ./configure
ersetzt wurden$ ./configure --enable-shared
(lösche zuerst alle Ordner und Dateien einschließlich der .so-Dateien aus dem vorherigen Versuch).Anscheinend funktioniert dies, weil https://stackoverflow.com/a/13812368/10593190 .
quelle