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


114

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 projets c (avec gcc). Voici 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 cela ne fonctionnait toujours pas.

Quelqu'un a-t-il une idée de la façon dont je peux résoudre ce problème?


6
Essayez d'installer libc0.1-dev.
Michas



Ceci est un BUG signalé dans le tableau de bord, il existe une solution de contournement: askubuntu.com/questions/251978/…
Roman

Réponses:


91

Debian / Ubuntu

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

sudo apt install gcc-multilib

2
Sur Ubuntu, cela a fonctionné sudo apt-get install gcc-multilibet a corrigé mon erreur degfortran -m32 ...
randwa1k

1
Question plus spécifique qui mentionne la cause 64 vs 32: stackoverflow.com/questions/21724540/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

62

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

sudo ln -s /usr/lib/x86_64-linux-gnu /usr/lib64

5
Cela fonctionne, mais cela ne vous donne en fait qu'un seul arc sur Debian multiarch.
jeremiah

2
J'ai eu le même problème en essayant de configurer une chaîne d'outils de compilation croisée que quelqu'un m'a donné sous forme de bundle tar. J'ai dû utiliser strace (c'est-à-dire "strace gcc <tous mes arguments> 2> & 1 | grep crt1.o") pour voir où gcc cherchait crt1.o, afin que je puisse déterminer quel lien symbolique créer.
Andrew Bainbridge

37

Il semble que pendant que vous jouiez avec llvm / clang, vous (ou le gestionnaire de paquets) avez supprimé le package de développement de bibliothèque C standard existant précédemment ( eglibc sur Debian) ou peut-être ne l'avez-vous pas installé en premier lieu, vous devez donc le réinstaller it, 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 le trouve pas sur packages.ubuntu.com, vous pouvez essayer d'installer directement libc6-dev.

Ou sur des systèmes comme Redhat:

yum installer glibc-devel

NB: Bien que l'on vous ait répondu brièvement dans les commentaires, voici une réponse juste pour qu'il y en ait une au cas où quelqu'un rencontre celle-ci et pourrait chercher une réponse, mais pas dans les commentaires ou le commentaire n'est pas assez explicite pour eux .


1
Ce n'est pas que le truc multiarch de Deian casse beaucoup de build, souvent avec cette erreur. export LD_LIBRARY_PATH peut faire l'affaire.
deadalnix

3
cela aide, pour linux alpinapk add libc-dev=0.7.1-r0
Yu Jiaao

27

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

Fonctionne le 14.04. C'est l'itinéraire préféré si vous ne voulez pas
modifier

17

Si vous utilisez la version Testing de Debian, appelée «wheezy», vous avez peut-être été mordu par le passage à multiarch. En savoir plus sur la multiarchitecture de Debian ici: http://wiki.debian.org/Multiarch

Fondamentalement, ce qui se passe, c'est que 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 crt1.o dans les deux /usr/lib64/et /usr/lib/i386-linux-gnu/maintenant et vous devrez en parler à votre chaîne d'outils. Voici une documentation sur la façon de procéder;http://wiki.debian.org/Multiarch/LibraryPathOverview

Notez que créer simplement un lien symbolique ne vous donnera qu'une seule architecture et que vous désactiveriez essentiellement multiarch. Bien que ce soit ce que vous voulez, ce n'est peut-être pas la solution optimale.


3
Un peu plus sur la façon de "parler de cela à votre chaîne d'outils" serait fantastique, car c'est exactement la situation dans laquelle je me trouve. Merci.
SullX

Tout d'abord, vous devez savoir pour quelle architecture vous construisez. Construisez-vous une application basée sur AMD64? Si c'est le cas, vous devrez indiquer à 'ld' où se trouvent les fichiers d'objets partagés basés sur AMD64, c'est-à-dire les fichiers .o dont vous avez besoin. Si vous travaillez sur un AMD64, ils devraient être dans / usr / lib64
jeremiah

16

Après avoir lu le http://wiki.debian.org/Multiarch/LibraryPathOverview que jeremiah a publié, j'ai trouvé le drapeau 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.


@DjDac, vous ne devriez avoir besoin d'aucun drapeau dans Ubuntu 16.04, AFAICT.
alexm

9

Pour que RHEL 7 64 bits compile les programmes gcc 4.8 32 bits, vous devez faire deux choses.

  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. Compilez des programmes en utilisant 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.


6

Comme expliqué dans le fichier crti.o manquant , il est préférable d'utiliser "gcc -print-search-dirs" pour trouver tous les chemins de recherche. Ensuite, créez un lien comme expliqué ci-dessus "sudo ln -s" pour pointer vers l'emplacement de crt1.o


3

Cela a fonctionné pour moi avec Ubuntu 16.04

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


1

Ran dans cela sur CentOs 5.4. Vous avez remarqué que lib64 contenait les fichiers crt * .o, mais pas lib. Installé glibc-devel via yum qui a installé les bits i386 et cela a résolu mon problème.


0

Même j'ai eu la même erreur de compilation 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 doit 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

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 les éléments suivants sur mon ordinateur: $/usr/lib/i386-linux/gnu

2) Ajoutez ce chemin à PATH(également LIBRARY_PATH) la variable d'environnement (afin de voir quelle est la envcommande name: type dans le terminal):

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

Pour éviter les confusions, la ligne $ PATH = / usr / lib / i386-linux / gnu: $ PATH $ export PATH est en réalité:
pac88

0

J'ai eu le même problème aujourd'hui, je l'ai résolu en installant les packages 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

-1

Dans mon cas, l'erreur crti.o était due à la configuration du chemin d'exécution de Matlab. Par exemple, vous ne pouvez pas exécuter un fichier si vous n'avez pas défini le chemin de votre répertoire d'exécution auparavant. Pour ce faire: File> setPath, ajoutez votre répertoire et enregistrez.



-2

Dans mon cas, Ubuntu 16.04je n'ai pas crti.odu tout:

$ find /usr/ -name crti*

J'installe donc le package du développeur libc 6 -dev:

sudo apt-get install libc6-dev
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.