c++ - remix - smart contracts ethereum
Si clang++ y g++ son incompatibles con ABI, ¿qué se usa para las bibliotecas compartidas en binario? (3)
clang ++ y g ++ son incompatibles con ABI, incluso para cosas tan básicas como contenedores estándar, según, por ejemplo, el sitio web de clang ++.
Debian incluye bibliotecas compartidas de C ++, es decir, libboost, etc ... que se compilan con ~ algo y los programas de usuario que usan ambos compiladores generalmente funcionan, y los nombres de las bibliotecas no se dañan con el compilador que se usó para ellos. Cuando instala clang, debian no va y saca versiones duplicadas de todas las bibliotecas de C ++ instaladas en su sistema.
¿Cual es el trato? ¿Es la capacidad de clang para vincularse con las bibliotecas de C ++ proporcionadas por la distribución simplemente más fuerte que lo que los desarrolladores del compilador (afortunadamente cautelosos) describen como?
incluso para cosas tan básicas como contenedores estándar
Los contenedores estándar no son todo lo que "núcleo". (Para implementaciones típicas) se implementan completamente en C ++ válido en los encabezados, y si compilas los mismos encabezados con G ++ y Clang ++ obtendrás resultados compatibles con ABI. Solo debe obtener incompatibilidades "incluso para cosas tan básicas como contenedores estándar" si usa diferentes versiones de los encabezados de contenedores, no solo usando Clang en lugar de GCC.
Tanto GCC como Clang se ajustan a un ABI de C ++ multiplataforma y multiplataforma (originalmente desarrollado para la arquitectura Itanium, pero también se usa para x86, x86_64, SPARC, etc.) Las cosas realmente básicas, como el diseño de clase, la manipulación de nombres, el manejo de excepciones , vtables, etc. están especificados por ABI y Clang y GCC lo siguen.
En otras palabras, si compilas la misma fuente con GCC y Clang obtendrás binarios compatibles con ABI.
Si quieres entender mejor estas cosas, mira mi ¿Qué es un ABI y por qué es tan complicado? diapositivas
Esto probablemente no responderá a la pregunta exacta correctamente:
Hace algún tiempo traté de compilar algunos archivos de objetos con gcc, otros archivos de objetos con clang. Finalmente uní todo y funcionó correctamente.
Creo que las distribuciones de Linux usan gcc, porque examiné algunos Makefile de Ubuntu y CentOS y usaron gcc.
G ++ y Clang son para la gran mayoría completamente compatibles con ABI. Además, las incompatibilidades ABI para los contenedores estándar son propiedades de la implementación de la biblioteca estándar (libstdc ++ o libc ++), no del compilador. Por lo tanto, no hay necesidad de ninguna re-compilación.
Clang nunca podría haber despegado si no fuera compatible con ABI con g ++, ya que sería básicamente inutilizable sin un gran número de seguidores preexistentes. De hecho, Clang es tan compatible con GCC, que simulan prácticamente la totalidad de la interfaz de línea de comandos de g ++, los intrínsecos del compilador, los errores, etc., por lo que literalmente puedes soltar Clang en lugar de G ++ y la gran mayoría de las veces, todo solo trabajo.