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?

Stefan Keller
fonte
6
Tente instalar libc0.1-dev.
Michas
1
Para Mac, consulte: stackoverflow.com/questions/1365211/…
kenorb
possível duplicata de crt1 e crti ausentes durante a compilação cruzada
user2284570
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
Dmitry Pavlenko
fonte
2
No Ubuntu isso funcionou sudo apt-get install gcc-multilibe corrigiu meu erro degfortran -m32 ...
randwa1k
1
Pergunta mais específica que menciona a causa 64 vs 32: stackoverflow.com/questions/21724540/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
62

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

sudo ln -s /usr/lib/x86_64-linux-gnu /usr/lib64
Karel Lenc
fonte
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 .

Shinnok
fonte
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
Umair R
fonte
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.

jeremias
fonte
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.

alexm
fonte
@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.

bulltorious
fonte
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

tienping
fonte
3

Isso funcionou para mim com o Ubuntu 16.04

$ LIBRARY_PATH=/usr/lib/x86_64-linux-gnu
$ export LIBRARY_PATH
Niklas R.
fonte
3

./configure --disable-multilib

trabalha para isso

Chunyang Kwok
fonte
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.

Srinivas
fonte
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

Bhagavan
fonte
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
pac88
fonte
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
Krusty
fonte
-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.

Kuro
fonte
-1

usar gcc -B lib_path_containing_crt?.o

James Chan
fonte
-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
Eugen Konkov
fonte