Pregunta

¿Cuáles son los beneficios de una cabecera única biblioteca y ¿por qué escribir de esa manera se oponen a poner la aplicación en archivo aparte?

¿Fue útil?

Solución

Hay situaciones en las que una biblioteca de solo cabecera es la única opción, por ejemplo, cuando se trata de plantillas.

Tener una biblioteca de solo encabezado también significa que no tiene que preocuparse por las diferentes plataformas donde se puede usar la biblioteca.Cuando separa la implementación, generalmente lo hace para ocultar los detalles de la implementación, y distribuir la biblioteca como una combinación de encabezados y bibliotecas (lib, dll's o GeneracodiCode) archivos).Por supuesto, estos, por supuesto, deben ser compilados para todos los diferentes sistemas operativos / versiones que ofrece soporte.

También podría distribuir los archivos de implementación, pero eso significaría un paso adicional para el usuario, compilando su biblioteca antes de usarla.

Por supuesto, esto se aplica en una base caso por caso .Por ejemplo, las bibliotecas de solo encabezado a veces aumentan los tiempos de compilación.

Otros consejos

Beneficios de encabezado de la biblioteca sólo:

  • Simplifica el proceso de construcción.Usted no necesita construir la biblioteca, y no es necesario especificar la biblioteca compilada durante el enlace paso de la construcción.Si usted tiene una biblioteca compilada, es probable que desee para crear múltiples versiones de la misma:Un compilado con la depuración activada, otro con la optimización habilitado, y posiblemente otro despojado de símbolos.Y tal vez aún más para una multi-plataforma de sistema.

Desventajas de una solamente de cabecera de la biblioteca:

  • Objeto más archivos.Cada inline método de la biblioteca que se utiliza en algunas archivo de origen también tendrá un débil símbolo, fuera de la definición de la línea en el objeto compilado de archivo para el archivo de origen.Esto ralentiza el compilador y también ralentiza el enlazador.El compilador tiene que generar todos los que se acumulan y, a continuación, enlazador tiene para filtrar hacia fuera.

  • Compilación más.Además de la hinchazón de los problemas arriba mencionados, la compilación va a tomar más tiempo debido a que las cabeceras son inherentemente más grande, con una de encabezado de la biblioteca sólo de una biblioteca compilada.Los grandes cabeceras va a tener que ser analizada para cada archivo de código fuente que utiliza la biblioteca.Otro factor es que los archivos de encabezado en un encabezado de la biblioteca sólo tiene que #include los encabezados necesarios por la línea de las definiciones, así como las cabeceras que sería necesario que hubiera tenido la biblioteca ha construido como una biblioteca compilada.

  • Más enredado de compilación.Se obtiene una mayor cantidad de dependencias con un encabezado de la biblioteca sólo porque los #includes sea necesario, con una solamente de cabecera de la biblioteca.Cambiar la implementación de algunos de los principales de la función en la biblioteca y que bien podría necesidad de volver a compilar todo el proyecto.Hacer que el cambio en el archivo de origen de una biblioteca compilada y todo lo que tienes que hacer es recompilar que una fuente de la biblioteca de archivos, actualización de la biblioteca compilada con la nueva .o archivo, y volver a vincular la aplicación.

  • Más difícil para el ser humano a leer.Incluso con la mejor documentación, los usuarios de una biblioteca a menudo tienen que recurrir a la lectura de las cabeceras de la biblioteca.Los encabezados en un encabezado de la biblioteca sólo están llenos de detalles de implementación que se interponga en el camino de la comprensión de la interfaz.Con una biblioteca compilada, todo lo que es la interfaz y un breve comentario sobre lo que la aplicación hace, y eso es todo lo que quiero.Eso es realmente todo lo que usted quiera.Usted no debería tener que conocer los detalles de implementación para saber cómo utilizar la biblioteca.

Sé que este es un hilo viejo, pero nadie ha mencionado ABI interfaces o compilador específico de problemas.Así que pensé que sería.

Esto es, básicamente, basado en el concepto de usted, ya sea escribiendo una biblioteca con un encabezado para distribuir a la gente o la reutilización de ti vs tener todo en un encabezado.Si usted está pensando en la reutilización de un encabezado y los archivos de origen y volver a compilar estos en cada proyecto, a continuación, esta realidad no se aplican.

Básicamente, si usted compilar el código C++ y construir una biblioteca con un compilador, a continuación, el usuario intenta utilizar la biblioteca con un compilador diferente o una versión diferente de la misma compilador, entonces usted puede obtener enlazador errores o extraño comportamiento en tiempo de ejecución debido a la incompatibilidad binario.

Por ejemplo, los proveedores de compiladores suelen cambiar de aplicación de la STL entre versiones.Si usted tiene una función en una biblioteca que acepta un std::vector, a continuación, se espera que los bytes en que clase de ser dispuestos en la forma en que se organizan cuando la biblioteca fue compilado.Si, en una nueva versión del compilador, el vendedor ha hecho mejoras en la eficiencia a std::vector, a continuación, el código del usuario considera que la nueva clase que puede tener una estructura diferente y pasa esa nueva estructura en su biblioteca.Todo va cuesta abajo desde allí...Esta es la razón por lo que se recomienda no pasar de negociación de los objetos a través de la biblioteca de límites.Lo mismo se aplica al Tiempo de Ejecución de C (CRT) de los tipos.

Al hablar sobre la CRT, la biblioteca y el usuario del código fuente por lo general, deben ser vinculados en contra de la misma CRT.Con Visual Studio si usted construir su biblioteca con el CRT Multiproceso, pero el usuario enlaces en contra de la Multiproceso CRT de Depuración entonces usted va a tener problemas de enlace debido a que la biblioteca no puede encontrar los símbolos que necesita.No puedo recordar que la función era, pero para Visual Studio 2015 Microsoft hizo un CRT función inline.De repente estaba en la cabecera no la CRT de la biblioteca de las bibliotecas que se espera encontrar en el enlace de tiempo ya no se podía hacer, y este vínculo que se genera errores.El resultado fue que estas bibliotecas necesario volver a compilar con Visual Studio 2015.

También puede obtener errores de enlace o comportamiento extraño si utiliza la API de Windows, pero a construir con Unicode diferentes ajustes para el usuario de la biblioteca.Esto es debido a que la API de Windows tiene funciones que utilizan Unicode o ASCII cadenas y macros/define que automágicamente utilizar el tipo correcto basado en el proyecto de Unicode de configuración.Si pasa una cadena a través de la biblioteca límite que es el tipo equivocado, entonces las cosas se rompen en tiempo de ejecución.O usted puede encontrar que el programa no enlace en el primer lugar.

Estas cosas también son verdaderos para pasar objetos/tipos a través de la biblioteca de los límites de otras bibliotecas de terceros (e.g un Eigen vector o un GSL de la matriz).Si la 3ra parte de la biblioteca de los cambios de su cabecera, entre los que la compilación de la biblioteca y el usuario compilar su código, a continuación, las cosas se rompen.

Básicamente, para estar seguro lo único que puede pasar a través de la biblioteca de los límites se construyen en los tipos y Antiguo Llano de Datos (POD).Idealmente, cualquier VAINA debe ser en estructuras que se definen en sus propios encabezados y no dependen de terceros encabezados.

Si usted proporciona un encabezado sólo de la biblioteca, a continuación, todo el código se compila con la misma configuración de compilador y en contra de la misma encabezados por lo que muchos de estos problemas (que aporta la versión de la tercera parte de las bibliotecas a usted y a su usuario utiliza la API compatible).

Sin embargo, hay aspectos negativos que se han mencionado anteriormente, tales como el aumento de tiempo de compilación.También puede estar ejecutando un negocio por lo que usted no quiere a la mano de todo su código fuente, los detalles de implementación a todos los usuarios en caso de que uno de ellos lo roba.

El principal "beneficio" es que requiere que entregue código fuente, por lo que Terminarás con informes de errores en las máquinas y con los compiladores que has nunca he oido hablar de.Cuando la biblioteca es totalmente plantillas, no tiene Mucha elección, pero cuando tienes la opción, el encabezado solo suele ser un pobre Opción de ingeniería.(Por otro lado, por supuesto, el encabezado solo significa que No tiene que documentar ningún procedimiento de integración.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top