Problemas de compilação: não é possível encontrar crt1.o


114

Eu tenho um sistema Debian virtual que uso para desenvolver.

Hoje eu queria experimentar llvm / clang.

Depois de instalar o clang, não consigo compilar meus antigos c-projetos (com gcc). Este é o erro:

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

Desinstalei o clang e ainda não funcionou.

Alguém tem ideia de como posso consertar isso?


6
Tente instalar libc0.1-dev.
Michas



Este é um BUG relatado no launchpad, mas há uma solução alternativa: askubuntu.com/questions/251978/…
Romano

Respostas:


91

Debian / Ubuntu

O problema é que provavelmente você só tem o gcc para sua arquitetura atual e isso é 64 bits. Você precisa dos arquivos de suporte de 32 bits. Para isso, você precisa instalá-los

sudo apt install gcc-multilib

2
No Ubuntu isso funcionou sudo apt-get install gcc-multilibe corrigiu meu erro degfortran -m32 ...
randwa1k


62

O que me ajudou foi criar um link simbólico:

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

5
Isso funciona, no entanto, dá a você efetivamente apenas um arch no multiarch do Debian.
jeremiah

2
Tive o mesmo problema ao tentar configurar um conjunto de ferramentas de compilação cruzada que alguém me deu como um pacote tar. Tive que usar strace (ou seja, "strace gcc <all my arguments> 2> & 1 | grep crt1.o") para ver onde o gcc estava procurando crt1.o, para que eu pudesse descobrir qual link simbólico criar.
Andrew Bainbridge

37

Parece que enquanto você estava jogando com llvm / clang você (ou o gerenciador de pacotes) removeu o pacote de desenvolvimento de biblioteca C padrão existente ( eglibc no Debian) ou talvez você não o tivesse instalado em primeiro lugar, portanto, você precisa reinstalar agora que você voltou ao gcc.

Você pode fazer isso assim no Debian:

aptitude show libc-dev

Ubuntu:

apt-get install libc-dev

No Ubuntu, se você não tiver o libc-dev, já que não consigo encontrá-lo em packages.ubuntu.com, você pode tentar instalar o libc6-dev diretamente.

Ou em sistemas semelhantes ao Redhat:

yum install glibc-devel

NB: Embora você tenha recebido uma resposta breve nos comentários, aqui está uma resposta para que haja uma registrada caso alguém encontre esta e possa estar procurando uma resposta, mas não nos comentários ou o comentário não é explícito o suficiente para eles .


1
Não que o multiarch do debian quebre muito a construção, geralmente com este erro. export LD_LIBRARY_PATH pode resolver o problema.
deadalnix

3
isso ajuda, para linux alpinoapk add libc-dev=0.7.1-r0
Yu Jiaao

27

Este é um BUG relatado no launchpad, mas há uma solução alternativa:

Execute para ver onde esses arquivos estão localizados

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

em seguida, adicione este caminho à variável LIBRARY_PATH

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

Funciona em 14.04. Esta é a rota preferida se você não quiser
danificar

17

Se você estiver usando a versão de teste do Debian, chamada 'wheezy', então você pode ter sido mordido pela mudança para multiarch. Mais sobre o multiarch do Debian aqui: http://wiki.debian.org/Multiarch

Basicamente, o que está acontecendo é que várias bibliotecas específicas de arquitetura estão sendo movidas de locais tradicionais no sistema de arquivos para novos locais específicos de arquitetura. É por isso que /usr/bin/ldestá confuso.

Você encontrará crt1.o em ambos /usr/lib64/e /usr/lib/i386-linux-gnu/agora e precisará informar seu conjunto de ferramentas sobre isso. Aqui está alguma documentação sobre como fazer isso; http://wiki.debian.org/Multiarch/LibraryPathOverview

Observe que apenas criar um link simbólico fornecerá apenas uma arquitetura e você essencialmente desativará o multiarch. Embora isso possa ser o que você deseja, pode não ser a solução ideal.


3
Um pouco mais sobre como "contar ao seu conjunto de ferramentas sobre isso" seria fantástico, pois esta é exatamente a situação em que estou. Obrigado.
SullX

Em primeiro lugar, você precisa saber para qual arquitetura está construindo. Você está construindo um aplicativo baseado em AMD64? Nesse caso, você precisará dizer ao 'ld' onde estão os arquivos de objetos compartilhados baseados em AMD64, ou seja, os arquivos .o de que você precisa. Se você estiver trabalhando em um AMD64, eles devem estar em / usr / lib64
jeremiah

16

Depois de ler o http://wiki.debian.org/Multiarch/LibraryPathOverview que jeremiah postou, encontrei o sinalizador gcc que funciona sem o link simbólico:

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

Então, você pode apenas adicionar -B/usr/lib/x86_64-linux-gnuà variável CFLAGS em seu Makefile.


@DjDac você não deve precisar de nenhum sinalizador no Ubuntu 16.04, AFAICT.
alexm

9

Para obter o RHEL 7 de 64 bits para compilar programas gcc 4.8 de 32 bits, você precisará fazer duas coisas.

  1. Certifique-se de que todas as ferramentas de desenvolvimento gcc 4.8 de 32 bits estejam completamente instaladas:

    sudo yum install glibc-devel.i686 libgcc.i686 libstdc++-devel.i686 ncurses-devel.i686
  2. Compilar programas usando o sinalizador -m32

    gcc pgm.c -m32 -o pgm

roubado daqui: Como compilar aplicativos de 32 bits no RHEL de 64 bits? - Eu só tive que fazer o passo 1.


6

Conforme explicado no arquivo crti.o ausente , é melhor usar "gcc -print-search-dirs" para descobrir todo o caminho de pesquisa. Em seguida, crie um link conforme explicado acima "sudo ln -s" para apontar para a localização de crt1.o


3

Isso funcionou para mim com o Ubuntu 16.04

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


1

Corri para isso no CentOs 5.4. Observe que lib64 continha os arquivos crt * .o, mas lib não. Instalei o glibc-devel através do yum que instalou os bits i386 e isso resolveu meu problema.


0

Até eu recebi o mesmo erro de compilação quando estava compilando i686-cm-linux-gcc.

A opção de compilação abaixo resolveu meu problema

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

Nota: O sysroot deve apontar para o diretório do compilador onde usr / include disponível

No meu caso, o conjunto de ferramentas está instalado no diretório / opt / toolchain / i686-cm-linux-gcc e usr / include também está disponível no mesmo diretório


0

Eu resolvi da seguinte maneira:

1) tente localizar os arquivos ctr1.o e ctri.o usando find -name ctr1.o

Tenho o seguinte no meu computador: $/usr/lib/i386-linux/gnu

2) Adicione esse caminho à PATH(também LIBRARY_PATH) variável de ambiente (para ver qual é o nome: digite o envcomando no Terminal):

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

Para evitar confusões, a linha $ PATH = / usr / lib / i386-linux / gnu: $ PATH $ export PATH é realmente:
pac88

0

Tive o mesmo problema hoje, resolvi-o instalando os pacotes recomendados: libc6-dev-mipsel-cross libc6-dev-mipsel-cross, libc-dev-mipsel-cross

Isso funcionou:

sudo apt-get install libc6-dev-mipsel-cross

-1

No meu caso, o erro crti.o foi causado pela configuração do caminho de execução do Matlab. Por exemplo, você não pode executar um arquivo se não tiver definido o caminho do diretório de execução anteriormente. Para fazer isso: Arquivo> setPath, adicione seu diretório e salve.



-2

No meu caso, Ubuntu 16.04não tenho nenhum crti.o:

$ find /usr/ -name crti*

Então, eu instalo o pacote de desenvolvedor libc 6 -dev:

sudo apt-get install libc6-dev
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.