¿Por qué es tan complicado usar las bibliotecas de C ++?

14

En primer lugar, quiero señalar que amo C ++ y soy una de esas personas que piensa que es más fácil codificar en C ++ que Java. Excepto por una pequeña cosa: bibliotecas.

En Java, simplemente puede agregar un poco de jar a la ruta de compilación y listo.

En C ++, generalmente tiene que establecer varias rutas para los archivos de encabezado y la biblioteca misma. En algunos casos, incluso tiene que usar banderas especiales de compilación. Principalmente he usado Visual Studio, Code Blocks y ningún IDE. Las 3 opciones no difieren mucho cuando se habla de usar bibliotecas externas.

Me pregunto por qué no se hizo una alternativa más simple para esto. Como tener un archivo .zip especial que tiene todo lo que necesita en un solo lugar para que el IDE pueda hacer todo el trabajo por usted configurando los indicadores de compilación. ¿Hay alguna barrera técnica para esto?

Pijusn
fuente

Respuestas:

15

C ++ fue diseñado para mejorar el lenguaje C al hacer un lenguaje más fácil y más automatizado con soporte para programación orientada a objetos. Pero no hizo nada para cambiar o mejorar la forma en que C maneja las bibliotecas externas y los archivos de encabezado. C ++ no tiene un sistema de módulos como los lenguajes más modernos: todavía utiliza el preprocesador C y el sistema de enlace. Dado que uno de los objetivos establecidos de C ++ era la compatibilidad con el código C, esto no es realmente sorprendente. Cualquier sistema de módulos C ++ tendría que funcionar junto con el antiguo sistema de archivo / encabezado C de enlace. El comité de estándares de C ++ simplemente no ha logrado diseñar un sistema de módulos más moderno. (Aunque están trabajando en ello, vea el comentario de Klaim a continuación).

Charles Salvia
fuente
8
La última línea no es totalmente correcta: el sistema de módulos ha estado funcionando desde 2004 (primer documento) pero implicaba tanto trabajo que ni siquiera se podía prever para el último estándar, ya que habría habido una falta de implementación para apoyar la propuesta Esa implementación ha estado en wortk (junto con otros borradores) para crear el próximo estándar C ++. No es que no sea una prioridad para los diseñadores de C ++, es solo una de estas características que no puede equivocarse, tiene que mantener la retrocompatibilidad (con la mayoría del código C y C ++ 11) y es increíblemente difícil de corregir. Por lo tanto, lleva mucho tiempo.
Klaim
Increíble. Gracias, Klaim, por la información. Definitivamente le echaré un vistazo. Eso es muy emocionante :)
Pijusn
La mayoría de los idiomas quedan fuera del negocio de estandarizar enlaces porque el mecanismo puede variar entre sistemas operativos. La naturaleza de ejecución en cualquier lugar de Java requiere un enlace particular y un formato de biblioteca. No hay nada de malo en eso, pero trae algunos gastos generales que pueden no ser deseables en todos los casos.
Blrfl
Francamente, me da mucho miedo leer que el comité de estándares de C ++ está trabajando en un sistema de módulos para el lenguaje en sí. C ++ ya es un lenguaje enorme y complejo y tratar de agregarle una característica tan sensible puede ser muy arriesgado. Como señaló Karl Bielefeldt a continuación, este problema ya encontró una buena solución a nivel de plataforma (sistema de paquete Linux) y probablemente la mayoría de los IDE podrían abordarlo muy bien con poco esfuerzo. Eche un vistazo a cómo la Biblioteca Qt y Qt Creator manejan este problema, por ejemplo.
AlexBottoni
1
@AlexBottoni, realmente dudo que se les ocurra un sistema de módulos estandarizado en cualquier momento de este siglo. Ni siquiera incluyeron conceptos en C ++ 11 porque no podían ponerse de acuerdo sobre la implementación precisa. Un sistema de módulos que funciona junto con el sistema de encabezado / enlazador es aún más complicado, y probablemente no lo veremos por mucho tiempo.
Charles Salvia
2

No es una barrera técnica. En Linux, su "archivo zip especial" es un paquete de desarrollo de biblioteca que instala con un administrador de paquetes, y configurar las marcas de inclusión y enlace es tan simple como agregar un par de líneas a su archivo configure.acque usa pkg-config para configurar las cosas.

Pkg-config también está disponible para Windows, pero las barreras culturales han impedido su adopción generalizada. Unix tiene una sólida historia de permitir la portabilidad mediante la distribución de código fuente, por lo que incluyen las herramientas de desarrollo de forma gratuita. Windows tiene una sólida historia de alentar solo la distribución binaria y cobrar a los desarrolladores por herramientas. Cuando gana dinero vendiendo bibliotecas, no tiene sentido facilitar que terceros las proporcionen.

Karl Bielefeldt
fuente