programa - librerias de c++
¿Cuál es la diferencia entre-1) Preprocesador, vinculador, 2) Archivo de encabezado, biblioteca? Es mi entendimiento correcto? (3)
El archivo fuente de CA pasa por dos etapas principales, la etapa de preprocesador donde el código fuente C es procesado por la utilidad de preprocesador que busca las directivas de preprocesador y realiza esas acciones y la etapa de compilación donde el código fuente C procesado se compila para producir código de objeto archivos.
El preprocesador es una utilidad que hace manipulación de texto. Toma como entrada un archivo que contiene texto (normalmente código fuente C) con directivas de preprocesador y genera una versión modificada del archivo aplicando las directivas al texto. El archivo no tiene que ser un código fuente C porque el preprocesador está manipulando el texto. He visto el preprocesador C utilizado para ampliar la utilidad de hacer permitiendo que las directivas preprossor se incluyan en un archivo make y que la salida se alimente en make.
Una biblioteca es un archivo que contiene código objeto de varias funciones. Es una forma de empaquetar el resultado de varios archivos fuente cuando se compilan en un solo archivo. Muchas veces se proporciona un archivo de biblioteca junto con un archivo de encabezado, un archivo .h, que contiene las declaraciones de función y las directivas de preprocesador. Entonces, para usar la biblioteca, incluye el archivo de encabezado proporcionado con la directiva #include y enlaza con el archivo de la biblioteca.
El vinculador es una utilidad que toma los diversos archivos de objeto y biblioteca para crear el archivo ejecutable. Cuando se utiliza una función o variable externa o global, el archivo fuente C, se utiliza un tipo de marcador para indicar al vinculador que la dirección de la función o variable debe insertarse en ese punto. El compilador de C solo sabe qué hay en la fuente que compila y no sabe qué hay en otros archivos, como archivos de objetos o bibliotecas. Por lo tanto, el trabajo del vinculador es tomar los diversos archivos y bibliotecas de objeto y establecer las conexiones finales entre el uso de una función o variable global en los archivos y bibliotecas objeto y el código objeto real que se generó para esa función o variable global. En algunos casos, el mismo nombre de función global se puede usar en varios archivos o bibliotecas de objetos diferentes, por lo que el vinculador normalmente solo usará el primero que encuentre y emitirá una advertencia acerca de otros encontrados.
Entonces el proceso básico para compilar y vincular un programa C es: la utilidad del preprocesador genera la fuente C para ser compilada; el compilador compila la fuente C en el código objeto generando un conjunto de archivos objeto; el vinculador vincula los diversos archivos objeto junto con cualquier bibliotecas en archivo ejecutable
Lo anterior es el proceso básico; sin embargo, al usar bibliotecas dinámicas, puede volverse más complicado, especialmente si parte de la aplicación que se está generando tiene bibliotecas dinámicas que está generando.
De acuerdo, hasta esta mañana estaba completamente confundido entre estos términos. Supongo que tengo la diferencia, con suerte.
En primer lugar, la confusión era que, dado que el preprocesador ya incluye los archivos de encabezado en el código que contiene las funciones, ¿qué funciones de la biblioteca vincula el enlazador al archivo objeto producido por el ensamblador / compilador? Parte de la confusión surgió principalmente debido a mi ignorancia sobre la diferencia entre un archivo de encabezado y una biblioteca. Después de buscar en Google y desbordar la pila (¿es ese el término?: P), deduje que el archivo de encabezado contiene principalmente las declaraciones de función, mientras que la implementación real está en otro archivo binario llamado biblioteca (todavía no soy 100% seguro de esto).
Entonces, supongamos en el siguiente programa:
#include<stdio.h>
int main()
{
printf("whatever");
return 0;
}
El preprocesador incluye el contenido del archivo de encabezado en el código. El compilador / compilador + ensamblador hace su trabajo, y finalmente el enlazador combina este archivo de objeto con otro archivo de objeto que en realidad se ha almacenado de la misma forma que printf.
¿Estoy en lo correcto en mi comprensión? Puede que esté muy lejos ... ¿podrías ayudarme?
Gracias.
Editar: - Siempre me he preguntado acerca de C ++ STL ... siempre me confundió en cuanto a qué es exactamente ... ¿colección de todos esos encabezados o qué? Ahora, después de leer las respuestas, ¿puedo decir que STL es un archivo de objeto / algo que se asemeja a un archivo objeto?
Y también, pensé dónde podría leer las definiciones de función de functiosn como pow (), sqrt () etc etc. Abriría los archivos ehader y no encontraría nada. Entonces, ¿la definición de función en la biblioteca es binaria ilegible?
Esta es una fuente de confusión extremadamente común. Creo que la forma más fácil de entender lo que está sucediendo es tomar un ejemplo simple. Olvídate de las bibliotecas por un momento y considera lo siguiente:
$ cat main.c
extern int foo( void );
int main( void ) { return foo(); }
$ cat foo.c
int foo( void ) { return 0; }
$ cc -c main.c
$ cc -c foo.c
$ cc main.o foo.o
La declaración extern int foo( void )
está realizando exactamente la misma función que el archivo de encabezado de una biblioteca. foo.o
está realizando la función de la biblioteca. Si entiende este ejemplo, y por qué ni cc main.c
ni cc main.o
funcionan, entonces comprende la diferencia entre los archivos de encabezado y las bibliotecas.
Sí, casi correcto. Excepto que el vinculador no vincula archivos de objeto, sino también bibliotecas; en este caso, es la biblioteca estándar de C (libc) la que está vinculada a su archivo de objeto. El resto de sus suposiciones parecen ser ciertas sobre las etapas de compilación + diferencia entre un encabezado y una biblioteca.