¿Debo usar libc ++ o libstdc ++? [cerrado]

91

Estoy desarrollando ejecutables de interfaz de línea de comandos para osx y linux usando c / c ++. El proyecto se vinculará con opencv. ¿Debo usar libc ++ o libstdc ++?

Loozie
fuente
1
No lo sé, pero puede encontrar esto de interés: clang-developers.42468.n3.nabble.com/…
DarenW
3
Esta respuesta puede ser útil.
Yantao Xie
2
si enlaza con opencv, utilice libstdc ++.
he

Respuestas:

89

Usaría la biblioteca nativa para cada sistema operativo, es decir, libstdc ++ en GNU / Linux y libc ++ en Mac OS X.

libc ++ no está 100% completo en GNU / Linux, y no hay una ventaja real en usarlo cuando libstdc ++ es más completo. Además, si desea vincular a otras bibliotecas escritas en C ++, es casi seguro que se hayan creado con libstdc ++, por lo que también deberá vincularlas para usarlas.

Más información aquí sobre la integridad de libc ++ en varias plataformas.

Jonathan Wakely
fuente
3
¿Podría elaborar / proporcionar enlaces sobre el estado de integridad de libc ++ en Linux? No entiendo muy bien por qué esto sería específico de la plataforma, ya que libc ++ es solo un montón de encabezados de biblioteca estándar. ¿O quiere decir que es necesario compilar Clang wrt en bibliotecas de tiempo de ejecución LLVM que no son compatibles con Linux?
TemplateRex
1
@TemplateRex, no sé el estado actual, puede buscar en libcxx.llvm.org . No sigo libc ++, por lo que está preguntando a la persona equivocada, pero ¿está sugiriendo que "un montón de encabezados de biblioteca estándar" nunca tendrán ningún código específico de la plataforma?
Jonathan Wakely
Bueno, dado que puede instalar Linux en prácticamente el mismo hardware de Apple que ejecuta Mac OS X, me pregunto de dónde vendría la dependencia de la plataforma en los encabezados de C ++. Tal vez algunos envoltorios alrededor de los elementos intrínsecos de CPU incorporados o IO y el manejo de excepciones dependen del sistema, pero tengo entendido que tales cosas se manejan en el tipo librcxxrt de capas binarias. ¿No se supone que los encabezados de la biblioteca estándar son más o menos conectables?
TemplateRex
4
No estoy hablando de hardware. Una vez más, no tengo ni idea de libc ++, pero la mayoría de las bibliotecas estándar de C ++ se implementan sobre la biblioteca C del sistema operativo y, por ejemplo, la asignación de std::ctype_base::maskvalores a <ctype.h>constantes depende completamente de la plataforma. (Los elementos intrínsecos de la CPU los proporciona el compilador, el manejo de excepciones lo realiza una capa ABI de bajo nivel, pero la E / S normalmente se realiza por completo en las bibliotecas C ++ y C, no en las de bajo nivel).
Jonathan Wakely
1
@abergmeier, ese es un argumento falso, porque (cuando se usa con GCC u otros procesos de compilación elegibles) libstdc ++ no impone ninguna restricción sobre el código que lo usa, ya sea que esté vinculado de forma dinámica o estática. No es la LGPL. Por favor, no difunda FUD. gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.license.what
Jonathan Wakely
30

Las principales distribuciones de Linux no proporcionan LLVM libc ++ porque:

  1. A diferencia de Apple y FreeBSD, GPL + 3 no es un problema, por lo que no es necesario implementar otra pila aquí.
  2. Los componentes de Linux se han desarrollado alrededor de GNU libstd ++ durante años. Algunos de ellos no se basan en nada más.
  3. Si bien libc ++ es fuerte en nuevas características, tiene algunos problemas con el código heredado.

Si finalmente libc ++ se convirtió en parte de las distribuciones, será como un componente opcional. vincular contra él probablemente requerirá opciones adicionales.

Como dijo Jonathan, debes usar cualquier herramienta que se incluya por defecto. Clang es seguro de usar en Linux ya que está configurado como un reemplazo de GCC, por lo que en ese aspecto no tiene que preocuparse por 2 compiladores. Además, dado que está apuntando a dos plataformas, debería echar un vistazo a cmake.

Mario Vázquez
fuente
2
Clang no es un reemplazo de GCC ... Solo otro compilador.
Isaac Pascual
4
@IsaacPascual Lo que Mario quiso decir es que clang tiene oficialmente en sus objetivos de diseño ser un reemplazo directo del prominente compilador en la plataforma en la que lo ejecuta (por ejemplo, gcc cuando se ejecuta en linux). Lo mismo ocurre con el compilador afaik de Intel. Es su forma de conseguir una adopción más amplia.
Johan Boulé