Kompilierungsprobleme: crt1.o kann nicht gefunden werden

114

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?

Stefan Keller
quelle
6
Versuchen Sie zu installieren libc0.1-dev.
Michas
1
Für Mac siehe: stackoverflow.com/questions/1365211/…
Kenorb
Mögliches Duplikat von Missing crt1 und crti beim Crosscompiling
user2284570
Dies ist ein Fehler, der im Launchpad gemeldet wurde. Es gibt jedoch eine Problemumgehung
Roman

Antworten:

91

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

sudo apt install gcc-multilib
Dmitry Pavlenko
quelle
2
Unter Ubuntu funktionierte dies sudo apt-get install gcc-multilibund es wurde mein Fehler vongfortran -m32 ...
randwa1k
1
Spezifischere Frage, die 64 vs 32 Ursache erwähnt: stackoverflow.com/questions/21724540/…
Ciro Santilli 法轮功 冠状 病 六四 事件 24
62

Was mir geholfen hat, ist eine symbolische Verbindung herzustellen:

sudo ln -s /usr/lib/x86_64-linux-gnu /usr/lib64
Karel Lenc
quelle
5
Dies funktioniert, aber es gibt Ihnen effektiv nur einen Bogen auf Debian Multiarch.
Jeremiah
2
Ich hatte das gleiche Problem beim Versuch, eine Cross-Compiling-Toolchain einzurichten, die mir jemand als Teerbündel gegeben hat. Ich musste strace verwenden (dh "strace gcc <alle meine Argumente> 2> & 1 | grep crt1.o"), um zu sehen, wo gcc nach crt1.o suchte, damit ich herausfinden konnte, welche symbolische Verknüpfung erstellt werden sollte.
Andrew Bainbridge
37

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:

aptitude show libc-dev

Ubuntu:

apt-get install libc-dev

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:

yum installieren glibc-devel

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 .

Shinnok
quelle
1
Nicht, dass Debians Multiarch-Zeug viel Build bricht, oft mit diesem Fehler. export LD_LIBRARY_PATH kann den Trick machen.
Deadalnix
3
Dies hilft, für alpine Linuxapk add libc-dev=0.7.1-r0
Yu Jiaao
27

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

$ find /usr/ -name crti*
/usr/lib/x86_64-linux-gnu/crti.o

Fügen Sie diesen Pfad dann zur Variablen LIBRARY_PATH hinzu

$ export LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LIBRARY_PATH
Umair R.
quelle
Funktioniert am 14.04. Dies ist die bevorzugte Route, wenn Sie die Bibliotheken Ihres Systems nicht
beschädigen
17

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/LibraryPathOverview

Beachten 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.

jeremiah
quelle
3
Ein bisschen mehr darüber, wie man "Ihrer Toolchain davon erzählt", wäre fantastisch, da dies genau die Situation ist, in der ich mich befinde. Danke.
SullX
Zunächst müssen Sie wissen, für welche Architektur Sie bauen. Erstellen Sie eine AMD64-basierte Anwendung? In diesem Fall müssen Sie 'ld' mitteilen, wo sich die AMD64-basierten gemeinsam genutzten Objektdateien befinden, dh die von Ihnen benötigten .o-Dateien. Wenn Sie an einem AMD64 arbeiten, sollten sie in / usr / lib64
jeremiah
16

Nachdem ich die von jeremiah gepostete http://wiki.debian.org/Multiarch/LibraryPathOverview gelesen hatte, fand ich die gcc-Flagge, die ohne den Symlink funktioniert:

gcc -B/usr/lib/x86_64-linux-gnu hello.c

Sie können also einfach -B/usr/lib/x86_64-linux-gnudie CFLAGS-Variable in Ihrem Makefile hinzufügen .

alexm
quelle
@DjDac Sie sollten in Ubuntu 16.04, AFAICT kein Flag benötigen.
Alexm
9

Damit RHEL 7 64-Bit 32-Bit-Programme von gcc 4.8 kompilieren kann, müssen Sie zwei Dinge tun.

  1. Stellen Sie sicher, dass alle 32-Bit-Entwicklungstools von gcc 4.8 vollständig installiert sind:

    sudo yum install glibc-devel.i686 libgcc.i686 libstdc++-devel.i686 ncurses-devel.i686
  2. Kompilieren Sie Programme mit dem Flag -m32

    gcc pgm.c -m32 -o pgm

von hier gestohlen: Wie kompiliere ich 32-Bit-Apps auf 64-Bit-RHEL? - Ich musste nur Schritt 1 machen.

bulltorious
quelle
6

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

tienping
quelle
3

Dies funktionierte bei mir mit Ubuntu 16.04

$ LIBRARY_PATH=/usr/lib/x86_64-linux-gnu
$ export LIBRARY_PATH
Niklas R.
quelle
3

./configure --disable-multilib

arbeitet dafür

Chunyang Kwok
quelle
1

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.

Shrinivas
quelle
0

Sogar ich habe den gleichen Kompilierungsfehler erhalten, als ich i686-cm-linux-gcc kreuzkompiliert habe.

Die folgende Kompilierungsoption hat mein Problem gelöst

$ i686-cm-linux-gcc a.c --sysroot=/opt/toolchain/i686-cm-linux-gcc

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

Bhagavan
quelle
0

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(auch LIBRARY_PATH) Umgebungsvariablen hinzu (um zu sehen, welcher Name envim Terminal lautet: Typbefehl):

$PATH=/usr/lib/i386-linux/gnu:$PATH
$export PATH
pac88
quelle
Um Verwirrungen zu vermeiden, lautet die Zeile $ PATH = / usr / lib / i386-linux / gnu: $ PATH $ export PATH wirklich:
pac88
0

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:

sudo apt-get install libc6-dev-mipsel-cross
krusty
quelle
-1

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.

Kuro
quelle
-1

verwenden gcc -B lib_path_containing_crt?.o

James Chan
quelle
-2

In meinem Fall habe Ubuntu 16.04ich überhaupt keine crti.o:

$ find /usr/ -name crti*

Also installiere ich Entwickler libc 6 -dev Paket:

sudo apt-get install libc6-dev
Eugen Konkov
quelle