web-dev-qa-db-fra.com

Problèmes de compilation: impossible de trouver crt1.o

J'ai un système Debian virtuel que je développe.

Aujourd'hui, je voulais essayer llvm/clang.

Après l'installation de clang, je ne peux pas compiler mes anciens projets c (avec 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
...

J'ai désinstallé Clang et cela ne fonctionnait toujours pas.

Quelqu'un at-il une idée de comment je peux résoudre ce problème?

94
Stefan Keller

Debian/Ubuntu

Le problème est que vous n'avez probablement que le gcc pour votre architecture actuelle, c'est 64 bits. Vous avez besoin des fichiers de support 32 bits. Pour cela, vous devez les installer

Sudo apt install gcc-multilib
67
Dmitry Pavlenko

Ce qui m'a aidé, c'est de créer un lien symbolique:

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

Il semble que pendant que vous jouiez avec llvm/clang, vous (ou le gestionnaire de paquets) avez supprimé le paquet de développement de bibliothèque C standard existant ( eglibc sur Debian) ou vous l’avez peut-être pas installé au départ, vous devez le réinstaller, maintenant que vous êtes revenu à gcc.

Vous pouvez le faire comme ceci sur Debian:

aptitude show libc-dev

Ubuntu:

apt-get install libc-dev

Sous Ubuntu, si vous n’avez pas libc-dev, car je ne le trouve pas sur packages.ubuntu.com, vous pouvez essayer d’installer libc6-dev directement.

Ou sur des systèmes comme Redhat:

miam installe glibc-devel

NB: Bien que les commentaires vous aient brièvement répondu, voici une réponse, afin qu’il en existe une au cas où quelqu'un le rencontrerait et chercherait peut-être une réponse, mais pas dans les commentaires ou le commentaire n’est pas assez explicite pour eux. .

31
Shinnok

Ceci est un BUG signalé dans le tableau de bord, mais il existe une solution de contournement:

Exécutez ceci pour voir où se trouvent ces fichiers

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

puis ajoutez ce chemin à la variable LIBRARY_PATH

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

Si vous utilisez la version de test de Debian, appelée 'wheezy', vous avez peut-être été mordu par le passage au multiarch. Plus d'informations sur l'archive multiple de Debian ici: http://wiki.debian.org/Multiarch

Fondamentalement, diverses bibliothèques spécifiques à l'architecture sont déplacées des emplacements traditionnels du système de fichiers vers de nouveaux emplacements spécifiques à l'architecture. C'est pourquoi /usr/bin/ld est confus.

Vous trouverez maintenant crt1.o dans /usr/lib64/ et /usr/lib/i386-linux-gnu/ et vous devrez en informer votre chaîne d'outils. Voici de la documentation sur la façon de le faire. http://wiki.debian.org/Multiarch/LibraryPathOverview

Notez que la création d’un lien symbolique ne vous donnera que l’architecture one et que vous désactiverez l’architecture multiple. Bien que cela puisse être ce que vous voulez, il se peut que ce ne soit pas la solution optimale.

17
jeremiah

Après avoir lu le http://wiki.debian.org/Multiarch/LibraryPathOverview que jeremiah a posté, j'ai trouvé le drapeau gcc qui fonctionne sans lien symbolique:

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

Donc, vous pouvez simplement ajouter -B/usr/lib/x86_64-linux-gnu à la variable CFLAGS dans votre Makefile.

13
alexm

Pour que RHEL 7 64 bits compile les programmes gcc 4.8 32 bits, vous devez effectuer deux opérations.

  1. Assurez-vous que tous les outils de développement 32 bits gcc 4.8 sont complètement installés:

    Sudo yum install glibc-devel.i686 libgcc.i686 libstdc++-devel.i686 ncurses-devel.i686
    
  2. Compiler des programmes à l'aide de l'indicateur -m32

    gcc pgm.c -m32 -o pgm
    

volé d'ici: Comment compiler des applications 32 bits sur RHEL 64 bits? - Je n'avais qu'à faire l'étape 1.

7
bulltorious

Comme expliqué dans le fichier crti.o manquant , il est préférable d'utiliser "gcc -print-search-dirs" pour connaître l'intégralité du chemin de recherche. Créez ensuite un lien comme expliqué ci-dessus "Sudo ln -s" pour indiquer l'emplacement de crt1.o 

5
tienping

./configure --disable-multilib

travaille pour cela

2
Chunyang Kwok

Couru dans ce sur CentOs 5.4. A remarqué que lib64 contenait les fichiers crt * .o, mais pas lib. Glibc-devel installé par yum qui a installé les bits i386 et cela a résolu mon problème.

1
Shrinivas

Je l'ai résolu comme suit:

1) essayez de localiser les fichiers ctr1.o et ctri.o en utilisant find -name ctr1.o

J'ai le suivant sur mon ordinateur: $/usr/lib/i386-linux/gnu

2) Ajoutez ce chemin à la variable d’environnement PATH (ainsi que LIBRARY_PATH) (afin de voir quel est le nom: tapez _ commande env dans le terminal):

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

J'ai eu le même problème aujourd'hui, je l'ai résolu en installant les paquets recommandés: libc6-dev-mipsel-cross libc6-dev-mipsel-cross, libc-dev-mipsel-cross

Cela a fonctionné:

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

Cela a fonctionné pour moi avec Ubuntu 16.04

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

Même la même erreur de compilation s’est produite lors de la compilation croisée de i686-cm-linux-gcc.

L'option de compilation ci-dessous a résolu mon problème

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

Remarque: Le sysroot devrait pointer vers le répertoire du compilateur où usr/include est disponible

Dans mon cas, la chaîne d'outils est installée dans le répertoire/opt/toolchain/i686-cm-linux-gcc et usr/include est également disponible dans le même répertoire

0
Bhagavan