
Wie kann ich einen älteren gcc (insbesondere 4.5.2) auf Ubuntu 11.10 erstellen und Fehler wie „/usr/bin/ld: crti.o kann nicht gefunden werden: Keine solche Datei oder kein solches Verzeichnis“ vermeiden?
Ich habe ein bisschen nachgeforscht und mehrere ähnliche Artikel gefunden, aber keiner löst mein Problem wirklich:
- Ich habe überprüft, dass alle meine Pakete (libc6-dev und dergleichen) neu installiert wurdendiese Frage
- Ich habe überprüft, dass crti.o in /usr/lib32 und /usr/lib/x86_64-linux-gnu vorhanden ist und dass meine ld.so.conf so konfiguriert ist, dass sie in diesen Verzeichnissen sucht.
- Ich habe überprüft, dass das Voranstellen meines Make-Aufrufs mit LIBRARY_PATH=/usr/lib/x86_64-linux-gnu funktioniert, möchte dies jedoch vermeiden (es wird zu einem divergierenden Punkt in Makefiles).
- Ich habe verschiedene Dinge mit --with-build-sysroot probiert, aber ohne Erfolg (lies: vielleicht weiß ich einfach nicht, welches Flag ich setzen muss)
Beim Ausführen mit strace (gemäßdiese Antwort), kann ich den bloßen Verweis auf crti.o erkennen:
13240 open("crti.o", O_RDONLY) = -1 ENOENT (Keine solche Datei oder kein solches Verzeichnis)
Danke!
Antwort1
Sogar sehr neue Versionen von GCC schlagen mit dieser Meldung fehl. Das liegt daran, dass die neuen Debian-/Ubuntu-Versionen Multiarch unterstützen (d. h. die Installation von Binärdateien für mehrere Maschinen in einem Dateisystem) und die Bibliotheken daher von den Standardorten weg verschoben wurden.
Es gibt GCC-Patches, um das Problem zu behebenHier(noch keine freigegebenen Endversionen, aber korrekt für Ubuntu), und sie sind wahrscheinlich ohne großen Aufwand auf ältere GCC anwendbar, vielleicht. Ich denke, Sie müssen GCC mit konfigurieren--enable-multiarch, oder so.
In der Zwischenzeit ist das Erstellen von Softlinks eine gute Lösung:
cd /usr/lib
ln -s x86_64-linux-gnu/crt*.o .
(bei 32-Bit-Installationen ist der Ordnername anders).
Hoffentlich hilft das.
Antwort2
Ich hatte das gleiche Problem. Das Erstellen symbolischer Links von /usr/libs/crt?.o
nach /usr/lib/x86_64-linux-gnu/crt?.o
hat das Problem für mich gelöst.
Antwort3
Ich habe dieses Problem mit einigen Workarounds gelöst, die für Sie nützlich sein könnten.
Erstellen Sie GCC zunächst mit LIBRARY_PATH=/usr/lib/x86_64-linux-gnu
, damit der Build-Bootstrap-Prozess weiß, wo die crt?.o
Startdateien zu finden sind.
Anstatt dann crt?.o
symbolische Links dort zu erstellen /usr/lib
, wo sie Ihr gesamtes System betreffen, können Sie diese drei Dateien in dem ${prefix}/lib/gcc/...
Verzeichnis symbolisieren ${prefix}/bin
, das dem Verzeichnis entspricht gcc
, in dem die ausführbare Datei installiert ist. Das ist eigentlich fast ganz oben im Suchpfad für die Startdateien, sodass sie gefunden werden – aber sie haben keine weiteren Auswirkungen.
In meinem Fall war das spezielle Verzeichnis, in das sie eingefügt werden sollten lib/gcc/x86_64-unknown-linux-gnu/4.3.2/
; Sie können das richtige finden, da es bereits andere Dateien wie enthält crtbegin.o
.
Antwort4
Ich habe GCC 4.1.2 auf Ubuntu precise x86_64 erstellt. Wie Sie habe ich mir den Strace des letzten Befehls „xgcc“ angesehen und nach einer 32-Bit-C-Runtime gesucht. Ich habe /32/ wie folgt grep-ped. Die C-Runtime in meinem befindet sich in /usr/lib32, das vom Paket libc6-dev-i386 bereitgestellt wird.
fgrep /32/ strace-output.txt | grep /usr/lib | head -1
access("/usr/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/32/crti.o", R_OK) = -1 ENOENT (No such file or directory)
Also habe ich die symbolischen Links zu crt?.o in dem von xgcc gesuchten Verzeichnis erstellt.
sudo mkdir -p /usr/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/32
cd /usr/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/32
sudo ln -s /usr/lib32/crt1.o
sudo ln -s /usr/lib32/crtn.o
sudo ln -s /usr/lib32/crti.o
Ich habe GCC 4.1.2 damit erfolgreich erstellt.