2009-09-14 21 views
5

De modo que obtengo el punto de los encabezados frente a los archivos fuente. Lo que no entiendo es cómo sabe el compilador para compilar todos los archivos fuente. Ejemplo:Incluyendo archivos de origen en C

example.h

#ifndef EXAMPLE_H 
#define EXAMPLE_H 

int example(int argument); // prototype 

#endif 

example.c

#include "example.h" 

int example(int argument) 
    { 
    return argument + 1; // implementation 
    } 

main.c

#include "example.h" 

main() 
    { 
    int whatever; 
    whatever = example(whatever); // usage in program 
    } 

¿Cómo funciona el compilador, la compilación main.c, conocer la implementación de example() cuando nada incluído udes example.c?

¿Es esto una especie de IDE, donde agrega archivos a proyectos y esas cosas? ¿Hay alguna forma de hacerlo "manualmente", ya que prefiero un editor de texto sin formato para IDE extravagantes?

Respuesta

5

Sí, tiene que indicarle al compilador (normalmente a través de un archivo MAKE si no está utilizando un IDE) qué archivos fuente compilar en archivos objeto, y el compilador los compila individualmente. Luego le da al vinculador la lista de archivos de objetos para combinarlos en el ejecutable. Si el enlazador está buscando una definición de función o clase y no puede encontrarla, obtendrá un error de enlace.

+0

Así es como entran los archivos makefiles, siempre se preguntó dónde encajarían. Gracias. –

0

El compilador no. Pero tu herramienta de compilación sí lo hace. IDE o make herramienta. El manual forma es hecho a mano Makefile s.

4

No ... tienes que decírselo.
Por ejemplo, cuando planees con gcc, primero le compilar los archivos:

gcc file1.c -c -ofile1.o 
gcc file2.c -c -ofile2.o 

A continuación, el compilador compila esos archivos, en el supuesto de que exista símbolos que ha definido (como su función ejemplo) algún lugar y voluntad vincularse más tarde. A continuación, enlazar los archivos de objetos juntos:

gcc file1.o file2.o -oexecutable 

En este punto de tiempo, el enlazador mira a esos assumtions y "aclara" es decir ellos. verifica si están presentes. Esta es la forma en que funciona básicamente ...

cuanto a su pregunta IDE, "makefiles" Google

+0

te refieres '-c', no' -S', de lo contrario no deberías usar '.o' como salida. –

+0

@hacker Gracias. Reparado ... es bastante difícil leer una larga página de opciones ... – aviraldg

9

compilación en C o C++ es en realidad dividido en 2 fases separadas.

  • compilar
  • une

El compilador no sabe acerca de la aplicación de ejemplo(). Simplemente sabe que hay algo llamado example() que se definirá en algún momento. Por lo tanto, acaba de generar código con marcadores de posición, por ejemplo()

El vinculador luego aparece y resuelve estos marcadores de posición.

para compilar el código usando gcc que haría las siguientes

gcc -c example.c -o example.o 
gcc -c main.c -o main.o 
gcc example.o main.o -o myProgram 

Los primeros 2 invocaciones del CCG son los pasos de compilación. La tercera invocación es el paso del enlazador.

+0

Creo que se refería a gcc -c main.c -o main.o en el paso 2. – baskin

+0

@baskin, sí, lo hice. gracias por atrapar eso. fijo. – Glen

1

El compilador no conoce la implementación de example() al compilar main.c - el compilador solo conoce la firma (cómo llamarla) que se incluyó desde el archivo de encabezado. El compilador produce .o archivos de objetos que más tarde se vinculan por un enlazador para crear el binario ejecutable. El proceso de compilación puede ser controlado por un IDE, o si prefiere un Makefile. Los Makefiles tienen una sintaxis única que requiere un poco de aprendizaje para comprender pero que hará que el proceso de compilación sea mucho más claro. Hay muchas buenas referencias en la web si busca Makefile.

Cuestiones relacionadas