GNU/Linux >> Tutoriales Linux >  >> Linux

¿Puede Clang compilar código con GCC compilado .a libs?

Al menos para la biblioteca Crypto++ esto no funciona (verificado :-()). Por lo tanto, para el código c++ es menos probable que funcione, mientras que el código c puro probablemente enlazaría bien.

EDITAR:El problema comenzó a aparecer con Mac OS X 10.9 Mavericks y Xcode-5, que cambiaron la biblioteca C++ predeterminada para clang de libstdc++ a libc++. No existía en Mac OS X 10.8 y anteriores.

La solución parece ser:si necesita compilar código C ++ con clang y vincularlo a una biblioteca compilada con gcc, use "clang ++ -stdlib =libstdc ++". La vinculación es exitosa y el binario resultante se ejecuta correctamente.

ADVERTENCIA:No parece funcionar al revés:aunque puede crear una biblioteca compilada con "clang ++ -stdlib =libstdc ++" y vincular el código compilado con gcc, este código fallará con SEGV. Hasta ahora, encontré que la única forma de vincular con una biblioteca compilada con clang es compilar su código con clang, no con gcc.

EDITAR2 :GCC-12 parece incluir -stdlib= bandera. Compilando con g++ -stdlib=libc++ crea Clang++ -archivos de objetos compatibles. Muy bonito.


Sí, usualmente puede usar clang con bibliotecas compiladas de GCC (y viceversa, use gcc con bibliotecas compiladas de CLANG), porque de hecho no es la compilación sino la vinculación lo que es relevante. Puede que tengas mala suerte y te lleves sorpresas desagradables.

En principio, podría tener algunas dependencias en la versión de libstdc++ se utiliza para vincular las bibliotecas relevantes (si están codificadas en C++). En realidad, eso normalmente no importa mucho.

En C++, la manipulación de nombres podría, en teoría, ser un problema (puede haber algunos casos extremos, incluso incompatibilidades entre dos versiones diferentes de g++ ). Una vez más, en la práctica no suele ser un problema.

Por lo general, puede mezclar CLANG (incluso versiones diferentes pero cercanas) con GCC, pero puede tener sorpresas desagradables. Lo que se debe esperar de cualquier compilador de C++ (ya sea CLANG o GCC) es poder compilar y vincular un software completo (y todas las bibliotecas) usando el mismo compilador y versión. (y eso incluye la misma implementación de la biblioteca estándar de C++ ). Esta es la razón por la cual actualizar un compilador en una distribución es mucho trabajo:los creadores de la distribución deben asegurarse de que todos los paquetes se compilen bien (¡y reciben sorpresas!).

Tenga en cuenta que la versión de libstdc++ sí importa. Tanto las comunidades de Clang como las de GCC trabajan arduamente para que su ABI sea compatible con las actualizaciones del compilador, pero hay casos de esquina sutiles. Lea la documentación de su implementación de biblioteca estándar de C++ particular y específica. Estos casos extremos podrían explicar fallas misteriosas al usar un buen binario de biblioteca C++ (compilado con GCC 5) en su código compilado con GCC 8. El error no está en la biblioteca, pero el ABI evolucionó de manera incompatible.


Linux
  1. Cómo compilar un binario de 32 bits en una máquina Linux de 64 bits con gcc/cmake

  2. luchando con c ++ IDE en linux

  3. ¿Cómo obtener un seguimiento de pila para C ++ usando gcc con información de número de línea?

  4. C/C++ con GCC:agrega estáticamente archivos de recursos al ejecutable/biblioteca

  5. Vincular una biblioteca compartida con otra biblioteca compartida en Linux

Soporte de vida de 32 bits:compilación cruzada con GCC

¿Puedes usar anclas ^ $ con Ls?

¿Cómo puedo perfilar el código C++ que se ejecuta en Linux?

VS Code no compilará programas C++ con varios archivos fuente .ccp

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

No se puede llamar a la función de biblioteca estándar de C en Linux de 64 bits desde el código ensamblador (yasm)