¿Cuál es la diferencia entre un archivo de encabezado y una biblioteca?
80
Una de las cosas que me cuesta entender es cómo funciona el compilador. Tengo muchas dificultades con él, pero en particular sigo mezclando encabezados y bibliotecas. Si alguien pudiera aclarar un poco las cosas, sería genial.
C y C ++ son lenguajes de programación diferentes. Y ambas son especificaciones, ¡ no software! - escritas (principalmente en inglés) en algún estándar, como n1570 para C y n3337 para C ++
Basile Starynkevitch
Respuestas:
126
Piense en ambos así (Descargo de responsabilidad: esta es una analogía de muy alto nivel;) ..
El encabezado es un número de teléfono al que puede llamar, mientras que ...
... ¡la biblioteca es la persona real a la que puedes llegar allí!
Es la diferencia fundamental entre "interfaz" e "implementación"; la interfaz (encabezado) le dice cómo llamar a alguna funcionalidad (sin saber cómo funciona), mientras que la implementación (biblioteca) es la funcionalidad real.
Nota: El concepto es tan fundamental, porque le permite flexibilidad: puede tener el mismo encabezado para diferentes bibliotecas (es decir, la funcionalidad se llama exactamente de la misma manera), y cada biblioteca puede implementar la funcionalidad de una manera diferente. Al mantener la misma interfaz, puede reemplazar las bibliotecas sin cambiar su código.
Y: ¡puede cambiar la implementación de la biblioteca sin romper el código de llamada!
Ehh ... todavía no obtengo algo aquí. Por un lado, ni siquiera estoy del todo seguro de cómo se derivan las bibliotecas, todos los programas que he compilado no parecen necesitarlas, simplemente no se generan. ¿Supongo que las bibliotecas deben definirse? Pero ignorando eso, ¿dónde entran en juego los archivos fuente principal? Pensé que los encabezados eran para la implementación y los archivos fuente principales eran para la interfaz; las bibliotecas solo eran necesarias para compilar el ejecutable ... Si son estáticos, de todos modos.
Xonara
2
Las bibliotecas están PROGRAMADAS: puede escribir un programa o escribir una biblioteca.
TomTom
2
Si obtuve una biblioteca de otros, por ejemplo, Util.lib¿cómo llamo a su función? ¿Necesito incluir sus archivos de encabezado que también son relevantes para U til.lib?
Elshan
Para el encabezado , entendí su punto, pero con respecto a la implementación, todavía estoy confundido. Porque, en general, los archivos fuente contienen la implementación, ¿verdad? Si ya tenemos archivo (s) fuente , ¿por qué necesitamos una biblioteca ? ¡Muchas gracias de antemano!
Milán
57
Un archivo de encabezado se usa generalmente para definir una interfaz o un conjunto de interfaces dentro de una aplicación. Piense en un archivo de encabezado como algo que muestra la funcionalidad externa de un programa mientras omite los detalles técnicos de implementación.
Por ejemplo, si estuviera optimizando un programa, lo más probable es que modifique el archivo de origen (.cpp) para mejorar el algoritmo, pero el archivo de encabezado no cambiaría, porque los clientes externos todavía llaman a los métodos utilizando el mismo conjunto de parámetros y valores de retorno.
En un lenguaje orientado a objetos como C ++, un archivo de encabezado generalmente incluye lo siguiente:
Descripción de clases y jerarquía de herencia
Tipos y miembros de datos de clase
Métodos de clase
Si bien no hay nada que impida que el código se implemente en un archivo de encabezado, esto generalmente no se favorece ya que puede introducir acoplamientos y dependencias adicionales en el código.
En algunos casos (por ejemplo, clases con plantilla), la implementación debe definirse en el archivo de encabezado por razones técnicas.
Una biblioteca es una colección de código que desea poner a disposición de un programa o grupo de programas. Incluye la implementación de una interfaz particular o un conjunto de interfaces.
El código se define en una biblioteca para evitar la duplicación de código y fomentar la reutilización. Una biblioteca puede estar vinculada estáticamente (.lib) o dinámicamente (.dll):
Una biblioteca vinculada estáticamente define un conjunto de símbolos de exportación (que se pueden considerar como definiciones de métodos) que luego se vinculan al ejecutable final (.exe) durante la etapa de vinculación del proceso de compilación. Tiene la ventaja de un tiempo de ejecución más rápido (ya que la biblioteca no necesita cargarse dinámicamente), a expensas de un binario más grande (porque los métodos se replican esencialmente en el archivo ejecutable).
Una biblioteca vinculada dinámicamente se vincula durante la ejecución de un programa, en lugar de la vinculación de un programa. Es útil cuando varios programas necesitan reutilizar los mismos métodos y se usa ampliamente en tecnologías como COM.
Una cosa que puede confundirte es que la palabra biblioteca puede tener varios significados en C ++. Un significado ha sido bien discutido aquí:
Un conjunto de funciones enlazables en un archivo binario. Estos pueden estar vinculados estáticamente o dinámicamente.
Pero hay otro tipo de biblioteca: las denominadas bibliotecas de solo encabezado (incluidas partes de STL, TR1 y Boost). Estos no existen en un formato binario separado, por lo que la biblioteca de palabras no se refiere a un archivo binario en particular, sino a un conjunto de archivos de encabezado incluidos.
Una biblioteca es un código compilado en un conjunto de archivos objeto. Los archivos objeto contienen el código de máquina compilado y las declaraciones de datos utilizadas por el código.
Un archivo de encabezado define la interfaz de una biblioteca: le dice cómo usar la biblioteca correctamente. En C / C ++, un archivo de encabezado le brinda una lista de nombres de funciones y cómo llamar a esas funciones: el número y los tipos de parámetros que toman, el tipo de retorno, la convención de llamada, etc. Los archivos de encabezado tienen muchas otras cosas en ellos también, pero al final, lo que se reduce es un conjunto de reglas para llamar al código de la biblioteca.
Si la biblioteca en lenguajes de programación es una biblioteca general, entonces muchos libros presentes en la biblioteca se pueden comparar con funciones / métodos en lenguajes. Y también los archivos de encabezado se pueden comparar con el número de fila del libro. Supongamos que hay un libro en alguna biblioteca en Hyderabad y en esa biblioteca, ese libro está presente en la fila Número 24 ... De la misma manera que se da la dirección de la biblioteca. mediante el uso del espacio de nombres std (para la biblioteca estándar) y el número de fila es dado por el archivo de encabezado donde se colocan todos los libros (métodos en este caso) del mismo tiempo (todos los métodos relacionados con los flujos de entrada / salida)
El encabezado se usa normalmente para contener los prototipos. Los encabezados se expanden en el momento del preprocesamiento para que, en el momento de la compilación, el código pueda tener acceso a las declaraciones / prototipos de funciones relevantes.
La biblioteca es el software real que contiene las definiciones de los prototipos de funciones (presentes en el encabezado). La biblioteca se utiliza en el momento del enlace. Las definiciones (presentes en la biblioteca) se resuelven en el momento del enlace.
HEADER FILE es aquel en el que se escribe la declaración de una función. Al usar el archivo header podemos acceder a una función en particular
mientras
ARCHIVO DE BIBLIOTECA es aquel en el que se escribe la definición de una función en particular. MATH.H es un archivo HEADER mientras que MATH.LIB es un archivo de biblioteca.
Trabajo de Archivo HEADER y BIBLIOTECA en un Programa.
Un archivo de encabezado contiene los enlaces a las bibliotecas (las bibliotecas contienen funciones y métodos estándar), un compilador reconoce las funciones estándar utilizadas en el código fuente a través de un preprocesador, que resuelve todas las directivas (las directivas son las líneas en el programa precedidas por el signo # que incluyen ) antes de la compilación real del programa.
Creo que la biblioteca es un paquete de código que se reutiliza muchas veces y ese código está precompilado, por lo que está disponible en forma estándar para que no tengamos que escribir ese código para cada programa que desarrollamos. Y el archivo de encabezado contiene la referencia a ese código de manera simple, las funciones que usamos en nuestro programa como "cin" y "cout" están completamente definidas en una biblioteca estándar, y los archivos de encabezado como el archivo de encabezado iostream contienen la referencia a ese código. Entonces, cuando compilamos nuestro código, obtenemos el precompilado para cin y cout, y no tenemos que escribir el código para cin y cout cada vez que lo usamos. O de una manera más simple, podemos decir que una biblioteca contiene códigos para todas las funciones y un archivo de encabezado es una forma de llegar a ese código.
Una biblioteca es una colección de objetos similares para uso ocasional. Por lo general, contiene programas en forma de objeto o código fuente, plantillas, etc.
Un archivo de encabezado es la ubicación (interfaz) de la biblioteca
Parafraseando una broma clásica, la diferencia es que la biblioteca tiene un archivo de encabezado, mientras que el archivo de encabezado no tiene una biblioteca.
Las bibliotecas son como momias muertas, envueltas en largos hilos blancos. Están muertos. La única forma de liberarlos es a través de archivos de encabezado. Los archivos de encabezado contienen formas de darles vida y pueden cobrar vida muchas veces (reutilización de código).
Se puede considerar este ejemplo de comprensión Math.hes un archivo de cabecera que incluye el prototipo de las llamadas a funciones como sqrt(), pow()etc, mientras que libm.lib, libmmd.lib, libmmd.dllson algunas de las librerías matemáticas. En términos simples, un archivo de encabezado es como una tarjeta de visita y las bibliotecas son como una persona real, por lo que usamos la tarjeta de visita (archivo de encabezado) para llegar a la persona real (Biblioteca).
El código de las bibliotecas solo se almacenará según sea necesario para un archivo de encabezado. Se almacenará todo el archivo de encabezado, lo que ahorra área de almacenamiento del procesador.
Bienvenido a StackOverflow y gracias por intentar ayudar. Sin embargo, su respuesta podría resultar útil si la reformula para mayor claridad y legibilidad. Usar algunas rebajas para formatear podría ser útil. La diferencia entre encabezados y bibliotecas tiene otros aspectos más importantes que la cantidad de ellos que se almacena.
Respuestas:
Piense en ambos así (Descargo de responsabilidad: esta es una analogía de muy alto nivel;) ..
Es la diferencia fundamental entre "interfaz" e "implementación"; la interfaz (encabezado) le dice cómo llamar a alguna funcionalidad (sin saber cómo funciona), mientras que la implementación (biblioteca) es la funcionalidad real.
Nota: El concepto es tan fundamental, porque le permite flexibilidad: puede tener el mismo encabezado para diferentes bibliotecas (es decir, la funcionalidad se llama exactamente de la misma manera), y cada biblioteca puede implementar la funcionalidad de una manera diferente. Al mantener la misma interfaz, puede reemplazar las bibliotecas sin cambiar su código.
Y: ¡puede cambiar la implementación de la biblioteca sin romper el código de llamada!
fuente
Util.lib
¿cómo llamo a su función? ¿Necesito incluir sus archivos de encabezado que también son relevantes para Util.lib
?Un archivo de encabezado se usa generalmente para definir una interfaz o un conjunto de interfaces dentro de una aplicación. Piense en un archivo de encabezado como algo que muestra la funcionalidad externa de un programa mientras omite los detalles técnicos de implementación.
Por ejemplo, si estuviera optimizando un programa, lo más probable es que modifique el archivo de origen (.cpp) para mejorar el algoritmo, pero el archivo de encabezado no cambiaría, porque los clientes externos todavía llaman a los métodos utilizando el mismo conjunto de parámetros y valores de retorno.
En un lenguaje orientado a objetos como C ++, un archivo de encabezado generalmente incluye lo siguiente:
Si bien no hay nada que impida que el código se implemente en un archivo de encabezado, esto generalmente no se favorece ya que puede introducir acoplamientos y dependencias adicionales en el código.
En algunos casos (por ejemplo, clases con plantilla), la implementación debe definirse en el archivo de encabezado por razones técnicas.
Una biblioteca es una colección de código que desea poner a disposición de un programa o grupo de programas. Incluye la implementación de una interfaz particular o un conjunto de interfaces.
El código se define en una biblioteca para evitar la duplicación de código y fomentar la reutilización. Una biblioteca puede estar vinculada estáticamente (.lib) o dinámicamente (.dll):
Una biblioteca vinculada estáticamente define un conjunto de símbolos de exportación (que se pueden considerar como definiciones de métodos) que luego se vinculan al ejecutable final (.exe) durante la etapa de vinculación del proceso de compilación. Tiene la ventaja de un tiempo de ejecución más rápido (ya que la biblioteca no necesita cargarse dinámicamente), a expensas de un binario más grande (porque los métodos se replican esencialmente en el archivo ejecutable).
Una biblioteca vinculada dinámicamente se vincula durante la ejecución de un programa, en lugar de la vinculación de un programa. Es útil cuando varios programas necesitan reutilizar los mismos métodos y se usa ampliamente en tecnologías como COM.
fuente
Una cosa que puede confundirte es que la palabra biblioteca puede tener varios significados en C ++. Un significado ha sido bien discutido aquí:
Un conjunto de funciones enlazables en un archivo binario. Estos pueden estar vinculados estáticamente o dinámicamente.
Pero hay otro tipo de biblioteca: las denominadas bibliotecas de solo encabezado (incluidas partes de STL, TR1 y Boost). Estos no existen en un formato binario separado, por lo que la biblioteca de palabras no se refiere a un archivo binario en particular, sino a un conjunto de archivos de encabezado incluidos.
Espero que esto ayude.
fuente
Una biblioteca es un código compilado en un conjunto de archivos objeto. Los archivos objeto contienen el código de máquina compilado y las declaraciones de datos utilizadas por el código.
Un archivo de encabezado define la interfaz de una biblioteca: le dice cómo usar la biblioteca correctamente. En C / C ++, un archivo de encabezado le brinda una lista de nombres de funciones y cómo llamar a esas funciones: el número y los tipos de parámetros que toman, el tipo de retorno, la convención de llamada, etc. Los archivos de encabezado tienen muchas otras cosas en ellos también, pero al final, lo que se reduce es un conjunto de reglas para llamar al código de la biblioteca.
fuente
El encabezado solo contiene la declaración, mientras que las bibliotecas también contienen la implementación.
fuente
Si la biblioteca en lenguajes de programación es una biblioteca general, entonces muchos libros presentes en la biblioteca se pueden comparar con funciones / métodos en lenguajes. Y también los archivos de encabezado se pueden comparar con el número de fila del libro. Supongamos que hay un libro en alguna biblioteca en Hyderabad y en esa biblioteca, ese libro está presente en la fila Número 24 ... De la misma manera que se da la dirección de la biblioteca. mediante el uso del espacio de nombres std (para la biblioteca estándar) y el número de fila es dado por el archivo de encabezado donde se colocan todos los libros (métodos en este caso) del mismo tiempo (todos los métodos relacionados con los flujos de entrada / salida)
fuente
El encabezado se usa normalmente para contener los prototipos. Los encabezados se expanden en el momento del preprocesamiento para que, en el momento de la compilación, el código pueda tener acceso a las declaraciones / prototipos de funciones relevantes.
La biblioteca es el software real que contiene las definiciones de los prototipos de funciones (presentes en el encabezado). La biblioteca se utiliza en el momento del enlace. Las definiciones (presentes en la biblioteca) se resuelven en el momento del enlace.
fuente
Un archivo de encabezado describe cómo llamar a la funcionalidad , una biblioteca contiene el código compilado que implementa esta funcionalidad.
fuente
HEADER FILE es aquel en el que se escribe la declaración de una función. Al usar el archivo header podemos acceder a una función en particular
mientras
ARCHIVO DE BIBLIOTECA es aquel en el que se escribe la definición de una función en particular. MATH.H es un archivo HEADER mientras que MATH.LIB es un archivo de biblioteca.
fuente
Trabajo de Archivo HEADER y BIBLIOTECA en un Programa.
Un archivo de encabezado contiene los enlaces a las bibliotecas (las bibliotecas contienen funciones y métodos estándar), un compilador reconoce las funciones estándar utilizadas en el código fuente a través de un preprocesador, que resuelve todas las directivas (las directivas son las líneas en el programa precedidas por el signo # que incluyen ) antes de la compilación real del programa.
¡Gracias por leer!
fuente
Creo que la biblioteca es un paquete de código que se reutiliza muchas veces y ese código está precompilado, por lo que está disponible en forma estándar para que no tengamos que escribir ese código para cada programa que desarrollamos. Y el archivo de encabezado contiene la referencia a ese código de manera simple, las funciones que usamos en nuestro programa como "cin" y "cout" están completamente definidas en una biblioteca estándar, y los archivos de encabezado como el archivo de encabezado iostream contienen la referencia a ese código. Entonces, cuando compilamos nuestro código, obtenemos el precompilado para cin y cout, y no tenemos que escribir el código para cin y cout cada vez que lo usamos. O de una manera más simple, podemos decir que una biblioteca contiene códigos para todas las funciones y un archivo de encabezado es una forma de llegar a ese código.
fuente
Una biblioteca es una colección de objetos similares para uso ocasional. Por lo general, contiene programas en forma de objeto o código fuente, plantillas, etc.
Un archivo de encabezado es la ubicación (interfaz) de la biblioteca
fuente
Parafraseando una broma clásica, la diferencia es que la biblioteca tiene un archivo de encabezado, mientras que el archivo de encabezado no tiene una biblioteca.
fuente
Las bibliotecas son como momias muertas, envueltas en largos hilos blancos. Están muertos. La única forma de liberarlos es a través de archivos de encabezado. Los archivos de encabezado contienen formas de darles vida y pueden cobrar vida muchas veces (reutilización de código).
fuente
Se puede considerar este ejemplo de comprensión
Math.h
es un archivo de cabecera que incluye el prototipo de las llamadas a funciones comosqrt()
,pow()
etc, mientras quelibm.lib
,libmmd.lib
,libmmd.dll
son algunas de las librerías matemáticas. En términos simples, un archivo de encabezado es como una tarjeta de visita y las bibliotecas son como una persona real, por lo que usamos la tarjeta de visita (archivo de encabezado) para llegar a la persona real (Biblioteca).fuente
El código de las bibliotecas solo se almacenará según sea necesario para un archivo de encabezado. Se almacenará todo el archivo de encabezado, lo que ahorra área de almacenamiento del procesador.
fuente