Ich habe ein virtuelles Debian-System, mit dem ich entwickle.
Heute wollte ich llvm / clang ausprobieren.
Nach der Installation von clang kann ich meine alten c-Projekte (mit gcc) nicht kompilieren. Dies ist der Fehler:
...
/usr/bin/ld: cannot find crt1.o: No such file or directory
/usr/bin/ld: cannot find crti.o: No such file or directory
collect2: ld returned 1 exit status
...
Ich habe clang deinstalliert und es hat immer noch nicht funktioniert.
Hat jemand eine Idee, wie ich das beheben kann?
libc0.1-dev
.Antworten:
Debian / Ubuntu
Das Problem ist, dass Sie wahrscheinlich nur die gcc für Ihre aktuelle Architektur haben und das ist 64bit. Sie benötigen die 32-Bit-Unterstützungsdateien. Dafür müssen Sie sie installieren
quelle
sudo apt-get install gcc-multilib
und es wurde mein Fehler vongfortran -m32 ...
Was mir geholfen hat, ist eine symbolische Verbindung herzustellen:
quelle
Es scheint, dass Sie (oder der Paketmanager) während des Spielens mit llvm / clang zuvor vorhandene Standard-C-Bibliotheksentwicklungspakete ( eglibc unter Debian) entfernt haben oder dass Sie es möglicherweise gar nicht erst installiert haben, sodass Sie es neu installieren müssen es, jetzt, wo Sie zu gcc zurückgekehrt sind.
Sie können dies auf Debian folgendermaßen tun:
Ubuntu:
Wenn Sie unter Ubuntu kein libc-dev haben, können Sie versuchen, libc6-dev direkt zu installieren, da ich es auf packages.ubuntu.com nicht finden kann.
Oder auf Redhat-ähnlichen Systemen:
NB: Obwohl Sie in den Kommentaren kurz beantwortet wurden, ist hier eine Antwort, nur damit eine aufgezeichnet ist, falls jemand auf diese trifft und möglicherweise nach einer Antwort sucht, aber nicht in den Kommentaren oder der Kommentar ist nicht explizit genug für sie .
quelle
apk add libc-dev=0.7.1-r0
Dies ist ein Fehler , der im Launchpad gemeldet wurde, aber es gibt eine Problemumgehung:
Führen Sie dies aus, um zu sehen, wo sich diese Dateien befinden
Fügen Sie diesen Pfad dann zur Variablen LIBRARY_PATH hinzu
quelle
Wenn Sie Debians Testversion verwenden, die als "keuchend" bezeichnet wird, wurden Sie möglicherweise von der Umstellung auf Multiarch gebissen. Mehr über Debians Multiarch hier: http://wiki.debian.org/Multiarch
Grundsätzlich werden verschiedene architekturspezifische Bibliotheken von traditionellen Stellen im Dateisystem an neue architekturspezifische Stellen verschoben. Deshalb
/usr/bin/ld
ist verwirrt.Sie finden crt1.o in beiden
/usr/lib64/
und/usr/lib/i386-linux-gnu/
jetzt und müssen Ihre Toolchain darüber informieren . Hier finden Sie eine Dokumentation dazu. http://wiki.debian.org/Multiarch/LibraryPathOverviewBeachten Sie, dass Sie durch einfaches Erstellen eines Symlinks nur eine Architektur erhalten und Multiarch im Wesentlichen deaktivieren. Dies ist möglicherweise das, was Sie möchten, aber möglicherweise nicht die optimale Lösung.
quelle
Nachdem ich die von jeremiah gepostete http://wiki.debian.org/Multiarch/LibraryPathOverview gelesen hatte, fand ich die gcc-Flagge, die ohne den Symlink funktioniert:
Sie können also einfach
-B/usr/lib/x86_64-linux-gnu
die CFLAGS-Variable in Ihrem Makefile hinzufügen .quelle
Damit RHEL 7 64-Bit 32-Bit-Programme von gcc 4.8 kompilieren kann, müssen Sie zwei Dinge tun.
Stellen Sie sicher, dass alle 32-Bit-Entwicklungstools von gcc 4.8 vollständig installiert sind:
Kompilieren Sie Programme mit dem Flag -m32
von hier gestohlen: Wie kompiliere ich 32-Bit-Apps auf 64-Bit-RHEL? - Ich musste nur Schritt 1 machen.
quelle
Wie in der fehlenden Datei crti.o erläutert , ist es besser, "gcc -print-search-dirs" zu verwenden, um den gesamten Suchpfad herauszufinden. Erstellen Sie dann einen Link wie oben erläutert "sudo ln -s", um auf die Position von crt1.o zu verweisen
quelle
Dies funktionierte bei mir mit Ubuntu 16.04
quelle
./configure --disable-multilib
arbeitet dafür
quelle
Ist auf CentOs 5.4 darauf gestoßen. Es wurde festgestellt, dass lib64 die Dateien crt * .o enthielt, lib jedoch nicht. Installierte glibc-devel über yum, das die i386-Bits installierte, und dies löste mein Problem.
quelle
Sogar ich habe den gleichen Kompilierungsfehler erhalten, als ich i686-cm-linux-gcc kreuzkompiliert habe.
Die folgende Kompilierungsoption hat mein Problem gelöst
Beachten Sie das Sysroot sollte auf das Compiler-Verzeichnis verweisen, in dem usr / include verfügbar ist
In meinem Fall wird die Toolchain im Verzeichnis / opt / toolchain / i686-cm-linux-gcc installiert, und usr / include ist auch im selben Verzeichnis verfügbar
quelle
Ich habe es wie folgt gelöst:
1) Versuchen Sie, die Dateien ctr1.o und ctri.o mithilfe von zu suchen
find -name ctr1.o
Ich habe folgendes auf meinem Computer:
$/usr/lib/i386-linux/gnu
2) Fügen Sie diesen Pfad zur
PATH
(auchLIBRARY_PATH
) Umgebungsvariablen hinzu (um zu sehen, welcher Nameenv
im Terminal lautet: Typbefehl):quelle
Ich hatte heute das gleiche Problem, ich habe es gelöst, indem ich empfohlene Pakete installiert habe: libc6-dev-mipsel-cross libc6-dev-mipsel-cross, libc-dev-mipsel-cross
Das hat funktioniert:
quelle
In meinem Fall wurde der Fehler crti.o durch die Konfiguration des Ausführungspfads von Matlab verursacht. Beispielsweise können Sie keine Datei ausführen, wenn Sie den Pfad Ihres Ausführungsverzeichnisses nicht zuvor festgelegt haben. Gehen Sie dazu folgendermaßen vor: Datei> setPath, fügen Sie Ihr Verzeichnis hinzu und speichern Sie es.
quelle
verwenden
gcc -B lib_path_containing_crt?.o
quelle
In meinem Fall habe
Ubuntu 16.04
ich überhaupt keinecrti.o
:Also installiere ich Entwickler libc 6 -dev Paket:
quelle