Problèmes de compilation: impossible de trouver crt1.o
j'ai un système Debian virtuel que j'utilise pour développer.
Aujourd'hui je voulais essayer llvm/clang.
après avoir installé clang, Je ne peux pas compiler mes anciens C-projects (avec gcc). C'est l'erreur:
...
/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 il n'a toujours pas fonctionné.
quelqu'un sait comment je peux réparer ça?
17 réponses
Debian / Ubuntu
le problème est que vous n'avez probablement le gcc que pour votre architecture actuelle et c'est 64bit. Vous avez besoin des fichiers 32bit. Pour cela, vous devez installer
sudo apt install gcc-multilib
ce qui m'a aidé est de créer un lien symbolique:
sudo ln -s /usr/lib/x86_64-linux-gnu /usr/lib64
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 standard C existant ( eglibc sur Debian) ou peut-être que vous ne l'avez pas installé en premier lieu, donc 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
sur Ubuntu, si vous n'avez pas libc-dev, puisque je ne peux pas le trouver sur packages.ubuntu.com, vous pouvez essayer d'installer libc6-dev directement.
ou sur des systèmes similaires à Redhat:
yum install glibc-devel
NB: bien que vous avez été brièvement répondu dans les commentaires, voici une réponse juste pour qu'il y ait un enregistrement dans le cas où quelqu'un rencontre celui-ci et pourrait être à la recherche d'une réponse, mais pas dans les commentaires ou le commentaire est pas assez explicite pour eux.
C'est un BUG rapporté dans launchpad, mais il y a une solution:
exécutez ceci pour voir où ces fichiers sont situés
$ find /usr/ -name crti*
/usr/lib/x86_64-linux-gnu/crti.o
puis ajouter ce chemin à la variable LIBRARY_PATH
$ export LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LIBRARY_PATH
si vous utilisez la version de test de Debian, appelée "wheezy", vous avez peut-être été mordu par le passage à multiarchitecture. Plus d'informations sur le multiarchiv de Debian ici: http://wiki.debian.org/Multiarch
essentiellement, ce qui se passe est diverses bibliothèques spécifiques à l'architecture sont déplacés des endroits traditionnels dans le système de fichiers à de nouveaux endroits spécifiques à l'architecture. C'est pourquoi /usr/bin/ld
est confus.
vous trouverez crt1.o dans les deux /usr/lib64/
et /usr/lib/i386-linux-gnu/
maintenant et vous aurez besoin de dire à votre chaîne. Voici quelques documents sur la façon de faire cela; http://wiki.debian.org/Multiarch/LibraryPathOverview
notez que la simple création d'un lien symbolique ne vous donnera qu'une architecture et que vous désactiverez essentiellement le multiarchiv. Même si cela peut être ce que vous voulez, il peut ne pas être la solution optimale.
après la lecture du http://wiki.debian.org/Multiarch/LibraryPathOverview que jeremiah a posté, j'ai trouvé le drapeau de gcc qui fonctionne sans le lien symbolique:
gcc -B/usr/lib/x86_64-linux-gnu hello.c
ainsi, vous pouvez simplement ajouter -B/usr/lib/x86_64-linux-gnu
à la variable CFLAGS dans votre Makefile.
pour obtenir RHEL 7 64-bit pour compiler les programmes gcc 4.8 32-bit, vous aurez besoin de faire deux choses.
-
assurez-vous que tous les outils de développement gcc 4.8 32 bits sont complètement installés:
sudo yum install glibc-devel.i686 libgcc.i686 libstdc++-devel.i686 ncurses-devel.i686
-
compiler des programmes en utilisant le drapeau-m32
gcc pgm.c -m32 -o pgm
volé d'ici: comment compiler des applications 32 bits sur du RHEL 64 bits? - I n'avait qu'à faire l'étape 1.
comme expliqué dans IRTC.o fichier manquant , il est préférable d'utiliser des "gcc-imprimer-rechercher-dirs" pour trouver tous les le chemin de recherche. Puis créer un lien comme expliquer ci-dessus "sudo ln -s" pour pointer vers l'emplacement de crt1.o
est tombé là-dessus sur CentOs 5.4. J'ai remarqué que lib64 contenait le crt*.o dossiers, mais lib ne l'a pas fait. Installé glibc-devel par yum qui a installé les bits i386 et cela a résolu mon problème.
même moi j'ai eu la même erreur de compilation quand je compilais en cross 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
Note: Le systroot devrait pointer vers le répertoire du compilateur où usr / include disponible
dans mon cas, la chaîne d'outils est installée dans /opt / chaîne d'outils/i686-cm-linux-gcc directory et usr/include est également disponible dans le même répertoire
cela a fonctionné pour moi avec Ubuntu 16.04
$ LIBRARY_PATH=/usr/lib/x86_64-linux-gnu
$ export LIBRARY_PATH
j'ai eu le même problème aujourd'hui, je l'ai résolu en installant les paquets recommandés: libc6-dev-mipsel-croix libc6-dev-mipsel-croix, libc-dev-mipsel-croix
cela a fonctionné:
sudo apt-get install libc6-dev-mipsel-cross
dans mon cas, l'IRTC.o une erreur a été provoquée par la configuration du chemin d'exécution à partir de Matlab. Par exemple, vous ne pouvez pas effectuer un fichier si vous n'avez pas défini le chemin de votre répertoire d'exécution plus tôt. Pour ce faire: Fichier > setPath, ajoutez votre répertoire et sauvegardez.
je l'ai résolu comme suit:
1) Essayez de localiser ctr1.o et ctri.o fichiers en utilisant find -name ctr1.o
j'ai eu ce qui suit dans mon ordinateur: $/usr/lib/i386-linux/gnu
2) ajouter ce chemin à PATH
(aussi LIBRARY_PATH
) variable d'environnement (afin de voir qui est le nom: type env
commande dans le Terminal):
$PATH=/usr/lib/i386-linux/gnu:$PATH
$export PATH
dans mon cas Ubuntu 16.04
Je n'ai pas de crti.o
du tout:
$ find /usr/ -name crti*
J'installe donc developer libc 6 - dev package:
sudo apt-get install libc6-dev