it-swarm.com.de

Probleme beim Kompilieren: crt1.o kann nicht gefunden werden

Ich habe ein virtuelles Debian-System, das ich zur Entwicklung benutze.

Heute wollte ich llvm/clang ausprobieren.

Nach der Installation von clang kann ich meine alten c-Projekte nicht kompilieren (mit gcc).

...
/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?

94
Stefan Keller

Debian/Ubuntu

Das Problem ist, dass Sie wahrscheinlich nur den gcc für Ihre aktuelle Architektur haben und dass das 64-Bit ist. Sie benötigen die 32-Bit-Unterstützungsdateien. Dafür müssen Sie sie installieren

Sudo apt install gcc-multilib
67
Dmitry Pavlenko

Was mir geholfen hat, ist die Erstellung eines symbolischen Links:

Sudo ln -s /usr/lib/x86_64-linux-gnu /usr/lib64
59
Karel Lenc

Es scheint, dass Sie (oder der Paketmanager), während Sie mit llvm/clang gespielt haben, ein bereits vorhandenes Standardentwicklungspaket für C-Bibliotheken ( eglibc unter Debian) entfernt haben oder es vielleicht gar nicht installiert haben Sie müssen es jetzt erneut installieren, nachdem Sie wieder auf gcc zurückgesetzt wurden.

Sie können dies auf Debian so machen:

aptitude show libc-dev

Ubuntu:

apt-get install libc-dev

Wenn Sie unter Ubuntu nicht über libc-dev verfügen, da ich es nicht unter packages.ubuntu.com finden kann, können Sie libc6-dev direkt installieren.

Oder auf Redhat-ähnlichen Systemen:

yum installiere glibc-devel

NB: Obwohl Sie in den Kommentaren kurz beantwortet wurden, finden Sie hier eine Antwort. Es ist eine Protokollierung für den Fall, dass jemand darauf trifft und möglicherweise nach einer Antwort sucht, die jedoch nicht in den Kommentaren steht, oder der Kommentar ist für sie nicht explizit genug .

31
Shinnok

Dies ist ein FEHLER , der im Launchpad gemeldet wurde, es gibt jedoch 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 der Variablen LIBRARY_PATH hinzu

$ export LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LIBRARY_PATH
25
Umair R

Wenn Sie die Testversion von Debian verwenden, die als "Wheezy" bezeichnet wird, wurden Sie möglicherweise von der Umstellung auf Multiarch gestochen. 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. Aus diesem Grund ist /usr/bin/ld verwirrt.

Sie finden crt1.o jetzt sowohl in /usr/lib64/ als auch in /usr/lib/i386-linux-gnu/ und Sie müssen Ihre Toolchain darüber informieren. Hier ist eine Dokumentation, wie das geht; http://wiki.debian.org/Multiarch/LibraryPathOverview

Wenn Sie lediglich einen Symlink erstellen, erhalten Sie nur eine one -Architektur, und Sie würden Multiarch grundsätzlich deaktivieren. Auch wenn Sie dies wünschen, ist es möglicherweise nicht die optimale Lösung.

17
jeremiah

Nach dem Lesen der http://wiki.debian.org/Multiarch/LibraryPathOverview , die jeremiah gepostet hat, habe ich die Gcc-Flagge gefunden, 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-gnu zur CFLAGS-Variablen in Ihrem Makefile hinzufügen.

13
alexm

Damit RHEL 7 64-Bit gcc 4.8 32-Bit-Programme kompilieren kann, müssen Sie zwei Schritte ausführen.

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

    Sudo yum install glibc-devel.i686 libgcc.i686 libstdc++-devel.i686 ncurses-devel.i686
    
  2. Kompilieren Sie Programme mit der Markierung -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.

7
bulltorious

Wie in crti.o Datei fehlt erläutert, ist es besser, "gcc -print-search-dirs" zu verwenden, um den gesamten Suchpfad zu ermitteln. Erstellen Sie dann einen Link wie oben unter "Sudo ln -s" beschrieben, um auf die Position von crt1.o zu verweisen 

5
tienping

./configure --disable-multilib

arbeitet dafür

2
Chunyang Kwok

Auf CentOs 5.4 in dieses Thema geraten. Beachten Sie, dass lib64 die crt * .o-Dateien enthielt, lib jedoch nicht. Installierte glibc-devel durch yum, das die i386-Bits installierte, und dies beendete mein Problem.

1
Shrinivas

Ich habe es wie folgt gelöst:

1) Versuchen Sie, die Dateien ctr1.o und ctri.o mit find -name ctr1.o zu finden.

Mein Computer enthält Folgendes: $/usr/lib/i386-linux/gnu

2) Fügen Sie diesen Pfad der Umgebungsvariablen PATH (auch LIBRARY_PATH) hinzu (um den Namen zu ermitteln: Geben Sie den Befehl env im Terminal ein):

$PATH=/usr/lib/i386-linux/gnu:$PATH
$export PATH
0
pac88

Ich hatte heute das gleiche Problem, ich habe es durch die Installation empfohlener Pakete gelöst: libc6-dev-mipsel-cross libc6-dev-mipsel-cross, libc-dev-mipsel-cross

Das hat funktioniert:

Sudo apt-get install libc6-dev-mipsel-cross
0
krusty

Das funktionierte für mich mit Ubuntu 16.04

$ LIBRARY_PATH=/usr/lib/x86_64-linux-gnu
$ export LIBRARY_PATH
0

Sogar ich bekam den gleichen Kompilierungsfehler, als ich i686-cm-linux-gcc kreuzte.

Die folgende Kompilierungsoption hat mein Problem gelöst

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

Hinweis: Das Verzeichnis sysroot sollte auf das Compilerverzeichnis zeigen, in dem usr/include verfügbar ist

In meinem Fall ist die Toolchain im Verzeichnis/opt/toolchain/i686-cm-linux-gcc installiert, und usr/include ist auch im selben Verzeichnis verfügbar

0
Bhagavan