2010-07-10 17 views
27

Si construyo una biblioteca estática con llvm-gcc, luego lo vinculo con un programa compilado usando mingw gcc, ¿funcionará el resultado?¿Ilvm-gcc y clang binary son compatibles con gcc? - particularmente mingw gcc en Windows

El mismo para otras combinaciones de llvm-gcc, sonido metálico y gcc normal. Estoy interesado en cómo funciona esto en Linux (usando gcc no estándar de mingw, por supuesto) y otras plataformas también, pero el énfasis está en Windows.

También estoy interesado en todos los idiomas, pero con un fuerte énfasis en C y C++, obviamente, el clang no es compatible con Fortran, etc., pero creo que llvm-gcc sí.

supongo que todos utilizan el formato ELF archivo, pero ¿qué pasa con las convenciones de llamada, disposición de las mesas virtuales, etc?

Respuesta

22

Sí, para el código C Clang y GCC son compatibles (ambos usan GNU Toolchain para vincular, de hecho). Solo tienes que asegurarte de decir clang para crear objetos compilados y no objetos de bitcode intermedios. C ABI está bien definido, por lo que el único problema es el formato de almacenamiento.

C++ no es portátil entre los compiladores en lo más mínimo; diferentes compiladores utilizan diferentes llamadas a tablas virtuales, constructores, destrucción, creación de nombres, implementaciones de plantillas, etc. Como regla general, debe suponer que los objetos de un compilador C++ no funcionarán con otro.

Sin embargo, al momento de escribir Clang ++ también puede usar las librerías compiladas de GCC/C++; Recientemente monté una plataforma para compilar programas C++ con clang usando la biblioteca de tiempo de ejecución estándar de G ++ y compila + enlaces muy bien.

+0

"... en el momento de escribir Clang ++ también puede usar bibliotecas compiladas en GCC/C++": esto debe haber cambiado mientras tanto, tuve que recompilar Boost (V1.54) con Clang ++ (V3.3) antes ser capaz de vincular Clang ++ - código compilado contra él. Ver también: http://stackoverflow.com/questions/11081818/linking-troubles-with-boostprogram-options-on-osx-using-llvm/19429798#19429798 –

+3

Olvidé decir que tienes que hacer esto si quieres use Clang ++ en modo C++ 11. Debe especificar la biblioteca estándar compatible con clang/LLVM C++ 11, la lib estándar de gcc no es buena. –

+1

Aceptar cambiado según la opinión popular. Por lo que recuerdo, realmente no obtuve una respuesta con la que estaba completamente feliz, así que simplemente acepté cualquier cosa que no fuera mi propia falta de respuesta. Como esta respuesta parece más útil para otros, sin embargo, probablemente debería ser aceptada. – Steve314

1

Lo sentimos - Me iba a volver a llvm después de una pausa, y nunca han hecho mucho más que el tutorial. La primera vez, me quemé un poco después de la lucha para conseguir que LLVM 2.6 construyera MinGW GCC, afortunadamente no es un problema con LLVM 2.7. Repasando hoy el tutorial noté en el Capítulo 5 del tutorial no solo una declaración clara de que LLVM usa ABI (Application Binary Interface) de la plataforma, sino también que el compilador tutorial depende de esto para permitir el acceso a funciones externas como sin y cos.

todavía no saben si la ABI compatible extiende a C++, sin embargo. Eso no es un problema de convenciones de llamadas sino de manipulación de nombres, diseño de estructuras y diseño de vtable.

Ser capaz de realizar la función C llama es suficiente para la mayoría de las cosas, todavía hay unas cuantas cuestiones en las que me importa C++.

-2

Afortunadamente lo arreglaron pero evito llvm-gcc porque (también) uso llvm como un compilador cruzado y cuando utilizas llvm-gcc -m32 en una máquina de 64 bits, se ignora -m32 y obtienes 64 bittsts que tienen que ser falsificados en su máquina de destino de 32 bits. Clang no tiene ese error ni lo hace gcc. Además, cuanto más uso el clang, más me gusta. En cuanto a su pregunta directa, no lo sé, en teoría estos días los objetivos tienen convenciones de llamadas bien conocidas o usadas. Y esperarías que tanto gcc como llvm cumplan con lo mismo pero nunca se sabe. La forma más simple de descubrir esto es escribir un par de funciones simples, compilar y desmontar usando ambos conjuntos de herramientas y ver cómo pasan los operandos a las funciones.

+9

Lo siento, tuve que rechazar esto porque en realidad no responde la pregunta, y el consejo dado (para examinar y comparar el resultado del código) no me parece un buen consejo. Hay más en un ABI que en cómo se pasan los parámetros a las funciones, especialmente si se trata de C++ y no solo de C, y solo confiaría en un experto para evaluar la compatibilidad de dos compiladores. –

2

No sé la respuesta, pero la diapositiva 10 en this presentation parece implicar que los archivos ".o" producidos por llvmgcc contienen un código de bytes LLVM (.bc) en lugar del código de objeto específico de destino habitual, por lo que ese enlace -tiempo de optimización es posible. Sin embargo, el enlazador LLVM debería poder vincular el código LLVM con el código producido por GCC "normal", ya que la siguiente diapositiva dice "enlace en archivos .o nativos y bibliotecas aquí".

LLVM es una herramienta de Linux, a veces he encontrado que los compiladores de Linux no funcionan del todo bien en Windows. Me gustaría saber si lo haces funcionar o no.

+0

Creo que han estado presionando para hacer todo lo posible y tal vez descuidar la calidad ... Explicaría cómo estoy en Linux y ahora solo estoy obteniendo un compilador de trabajo del proyecto llvm. – 0b1100110

+0

LLVM no es "una herramienta de Linux". También es la herramienta de compilación preferida en el sistema operativo OS X de Apple, que es Unix. –

2

Utilizo -m i386pep al enlazar los archivos .o de clang por ld. La dedicación de llvm a la integración con gcc se ve abiertamente en http://dragonegg.llvm.org/, por lo que es muy intuitivo suponer que la familia llvm será muy compatible con la cadena de herramientas gcc.

Cuestiones relacionadas