GNU/Linux >> Tutoriales Linux >  >> Linux

¿Por qué clang todavía necesita libgcc.a para compilar mi código?

Debes compilar con la opción -nodefaultlib o -nostdlibs .

Aquí una cita de la documentación de GCC (la interfaz clang es igual):

Una de las bibliotecas estándar omitidas por -nostdlib y -nodefaultlibs es libgcc.a , una biblioteca de subrutinas internas que GCC utiliza para superar las deficiencias de determinadas máquinas o las necesidades especiales de algunos lenguajes.

Es posible que deba ejecutar rutinas de inicialización estáticas de c ++ y/o usar lo que proporcionan los archivos de objetos crt<x>.o en el directorio lib. Estos archivos son parte de libc y proporciona un punto de entrada ejecutable.


Clang no viene con un enlazador, se basa en ld en cambio. Y ld depende de libgcc.a y/o libgcc.so en su sistema (independientemente de que este sea el enlazador LLVM ld.lld o GNU ld). Esta es la razón por la que aparece este mensaje de error.

Así que la respuesta es en realidad:

(a) el enlazador requiere que libgcc haga su propio trabajo de enlace

Muchos más detalles sobre esto están disponibles aquí en omniprog.info:

Si queremos deshacernos de GCC y usar clang como nuestro compilador predeterminado en el sistema, es posible que tengamos que hacer algunos ajustes en algunos sistemas basados ​​en RPM. Clang no proporciona un enlazador, sino que se basa en el enlazador del sistema, normalmente ld, para enlazar ejecutables. Este es el caso incluso en los sistemas FreeBSD y Mac OS X donde Clang es el compilador predeterminado. Podemos ver esto usando la opción -v de clang++. Ahora, ld no funcionará sin los siguientes archivos:

libgcc.a
libgcc_s.so
[...]


Linux
  1. Hashing de contraseñas y por qué lo necesitamos

  2. ¿Por qué el usuario raíz necesita permiso de Sudo?

  3. ¿Por qué Sudo ignora los alias?

  4. ¿El cambio de The Swappiness necesita un reinicio?

  5. ¿Por qué necesitamos mktemp?

¿Por qué Rsync falla con tubería rota (32), error en el zócalo Io (código 10) en Io.c (820)?

¿Por qué Ubuntu necesita dos núcleos?

¿Qué pasa si [[ $? -ne 0 ]]; significa en .ksh

¿Por qué necesitamos el archivo .so.1 en Linux?

¿Por qué clang genera texto ininteligible cuando se redirige?

¿Por qué el usuario 'bin' necesita un shell de inicio de sesión?