Problemas de compilación: no se puede encontrar crt1.o

114

Tengo un sistema Debian virtual que utilizo para desarrollar.

Hoy quería probar llvm / clang.

Después de instalar clang no puedo compilar mis viejos proyectos C (con gcc). Este es el error:

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

Desinstalé clang y todavía no funcionó.

¿Alguien tiene alguna idea de cómo puedo solucionar esto?

Stefan Keller
fuente
6
Intente instalar libc0.1-dev.
Michas
1
Para Mac, consulte: stackoverflow.com/questions/1365211/…
kenorb
posible duplicado de Missing CRT1 y crtI cuando compilación cruzada
user2284570
Este es un ERROR informado en Launchpad, pero hay una solución alternativa: askubuntu.com/questions/251978/…
Roman

Respuestas:

91

Debian / Ubuntu

El problema es que probablemente solo tenga el gcc para su arquitectura actual y eso es de 64 bits. Necesita los archivos de soporte de 32 bits. Para eso, necesitas instalarlos

sudo apt install gcc-multilib
Dmitry Pavlenko
fuente
2
En Ubuntu esto funcionó sudo apt-get install gcc-multiliby solucionó mi error degfortran -m32 ...
randwa1k
1
Pregunta más específica que menciona la causa 64 vs 32: stackoverflow.com/questions/21724540/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
62

Lo que me ayudó fue crear un vínculo simbólico:

sudo ln -s /usr/lib/x86_64-linux-gnu /usr/lib64
Karel Lenc
fuente
5
Esto funciona, sin embargo, le brinda efectivamente un solo arco en Debian multiarch.
jeremías
2
Tuve el mismo problema al intentar configurar una cadena de herramientas de compilación cruzada que alguien me dio como un paquete de alquitrán. Tuve que usar strace (es decir, "strace gcc <todos mis argumentos> 2> & 1 | grep crt1.o") para ver dónde estaba buscando gcc crt1.o, para poder averiguar qué enlace simbólico crear.
Andrew Bainbridge
37

Parece que mientras jugaba con llvm / clang, usted (o el administrador de paquetes) eliminó el paquete de desarrollo de la biblioteca C estándar previamente existente ( eglibc en Debian) o tal vez no lo tenía instalado en primer lugar, por lo que debe reinstalar , ahora que volvió a gcc.

Puede hacerlo así en Debian:

aptitude show libc-dev

Ubuntu:

apt-get install libc-dev

En Ubuntu, si no tiene libc-dev, ya que no puedo encontrarlo en packages.ubuntu.com, puede intentar instalar libc6-dev directamente.

O en sistemas similares a Redhat:

yum instalar glibc-devel

NB: Aunque recibió una breve respuesta en los comentarios, aquí hay una respuesta solo para que haya una registrada en caso de que alguien se encuentre con esta y pueda estar buscando una respuesta, pero no en los comentarios o el comentario no es lo suficientemente explícito para ellos. .

Shinnok
fuente
1
No es que las cosas multiarca de Debian rompan mucho la construcción, a menudo con este error. exportar LD_LIBRARY_PATH puede hacer el truco.
deadalnix
3
esto ayuda, para linux alpinoapk add libc-dev=0.7.1-r0
Yu Jiaao
27

Este es un ERROR informado en Launchpad, pero hay una solución alternativa:

Ejecute esto para ver dónde se encuentran estos archivos

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

luego agregue esta ruta a la variable LIBRARY_PATH

$ export LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LIBRARY_PATH
Umair R
fuente
Funciona el 14.04. Esta es la ruta preferida si no desea
alterar
17

Si está utilizando la versión de prueba de Debian, llamada 'wheezy', es posible que haya sido mordido por el cambio a multiarch. Más sobre la multiarca de Debian aquí: http://wiki.debian.org/Multiarch

Básicamente, lo que está sucediendo es que varias bibliotecas específicas de arquitectura se están moviendo de lugares tradicionales en el sistema de archivos a lugares específicos de nuevas arquitecturas. Por eso /usr/bin/ldestá confundido.

Encontrará crt1.o en ambos /usr/lib64/y /usr/lib/i386-linux-gnu/ahora y tendrá que informar a su cadena de herramientas sobre eso. Aquí hay documentación sobre cómo hacer eso; http://wiki.debian.org/Multiarch/LibraryPathOverview

Tenga en cuenta que la mera creación de un enlace simbólico solo le proporcionará una arquitectura y, básicamente, estaría deshabilitando multiarch. Si bien esto puede ser lo que desea, puede que no sea la solución óptima.

Jeremías
fuente
3
Un poco más sobre cómo "contarle a su cadena de herramientas acerca de eso" sería fantástico, ya que esta es exactamente la situación en la que me encuentro. Gracias.
SullX
En primer lugar, necesitará saber para qué arquitectura está construyendo. ¿Está creando una aplicación basada en AMD64? Si es así, deberá indicarle a 'ld' dónde están los archivos de objetos compartidos basados ​​en AMD64, es decir, los archivos .o que necesita. Si está trabajando en un AMD64, deberían estar en / usr / lib64
jeremiah
16

Después de leer http://wiki.debian.org/Multiarch/LibraryPathOverview que publicó jeremiah, encontré la bandera gcc que funciona sin el enlace simbólico:

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

Entonces, puede simplemente agregar -B/usr/lib/x86_64-linux-gnua la variable CFLAGS en su Makefile.

alexm
fuente
@DjDac, no debería necesitar ningún indicador en Ubuntu 16.04, AFAICT.
alexm
9

Para que RHEL 7 de 64 bits compile programas gcc 4.8 de 32 bits, deberá hacer dos cosas.

  1. Asegúrese de que todas las herramientas de desarrollo gcc 4.8 de 32 bits estén completamente instaladas:

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

    gcc pgm.c -m32 -o pgm

robado de aquí: ¿Cómo compilar aplicaciones de 32 bits en RHEL de 64 bits? - Solo tuve que hacer el paso 1.

bulltorious
fuente
6

Como se explica en el archivo crti.o que falta , es mejor usar "gcc -print-search-dirs" para averiguar toda la ruta de búsqueda. Luego cree un enlace como se explica arriba "sudo ln -s" para apuntar a la ubicación de crt1.o

tendiendo
fuente
3

Esto funcionó para mí con Ubuntu 16.04

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

./configure --disable-multilib

funciona para eso

Chunyang Kwok
fuente
1

Me encontré con esto en CentOs 5.4. Noté que lib64 contenía los archivos crt * .o, pero lib no. Instalé glibc-devel a través de yum que instaló los bits i386 y esto resolvió mi problema.

Shrinivas
fuente
0

Incluso obtuve el mismo error de compilación cuando estaba compilando de forma cruzada i686-cm-linux-gcc.

La siguiente opción de compilación resolvió mi problema

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

Nota: El sysroot debe apuntar al directorio del compilador donde usr / include disponible

En mi caso, la cadena de herramientas está instalada en el directorio / opt / toolchain / i686-cm-linux-gcc y usr / include también está disponible en el mismo directorio

Bhagavan
fuente
0

Lo resolví de la siguiente manera:

1) intente localizar archivos ctr1.o y ctri.o usando find -name ctr1.o

Tengo lo siguiente en mi computadora: $/usr/lib/i386-linux/gnu

2) Agregue esa ruta a PATH(también LIBRARY_PATH) la variable de entorno (para ver cuál es el nombre: escriba el envcomando en la Terminal):

$PATH=/usr/lib/i386-linux/gnu:$PATH
$export PATH
pac88
fuente
Para evitar confusiones, la línea $ PATH = / usr / lib / i386-linux / gnu: $ PATH $ export PATH es realmente:
pac88
0

Tuve el mismo problema hoy, lo resolví instalando los paquetes recomendados: libc6-dev-mipsel-cross libc6-dev-mipsel-cross, libc-dev-mipsel-cross

Esto funcionó:

sudo apt-get install libc6-dev-mipsel-cross
krusty
fuente
-1

En mi caso, el error crti.o se debió a la configuración de la ruta de ejecución de Matlab. Por ejemplo, no puede realizar un archivo si no ha establecido anteriormente la ruta de su directorio de ejecución. Para hacer esto: Archivo> setPath, agregue su directorio y guarde.

Kuro
fuente
-1

utilizar gcc -B lib_path_containing_crt?.o

James Chan
fuente
-2

En mi caso Ubuntu 16.04no tengo nada crti.o:

$ find /usr/ -name crti*

Así que instalo el paquete desarrollador libc 6 -dev:

sudo apt-get install libc6-dev
Eugen Konkov
fuente