2. COMPILACIÓN DE PROGRAMAS EN "C" En este capítulo se examinará la compilación de programas de código fuente en tres lenguajes de alto nivel: "C", FORTRAN y COBOL. En la segunda parte del capítulo se analizará el mantenedor de archivos y bibliotecas. El archivo permite crear una biblioteca de módulos de objetos. Estos archivos son utilizados por el editor de enlaces. 2.1 "C": Programa de ejemplo con un archivo principal y dos funciones en un solo archivo Basándose en las opciones de la línea de comandos, cc compila, ensambla y carga programas de código fuente en lenguaje C. También puede ensamblar y cargar programas fuente en lenguaje ensamblador o simplemente cargar programas de objetos. +===============================================================+ | Command Format: cc [options] file-list | | | | (See Appendix E for a complete list of options) | +===============================================================+ Al utilizar la utilidad cc, se observan las siguientes convenciones: 1. Un nombre de archivo con la extensión .c indica un código fuente en lenguaje C. 2. Un nombre de archivo con la extensión .s indica un código fuente en lenguaje ensamblador. 3. Un nombre de archivo con la extensión .o indica un código objeto. La utilidad cc tomará su entrada del archivo o archivos que especifique en la línea de comandos. A menos que utilice la opción -o, almacenará el programa ejecutable en un fichero denominado a.out. Código fuente de programa en lenguaje C de ejemplo: +---------------------------------------------------------------+ | $cat hola.c | | main () | | { | | printf ("Hola desde main!\n\n"); | | printf ("Llamando a funcion1!\n\n"); | | funct1(); | | printf ("\t Volviendo desde funcion1!\n\n"); | | printf ("Llamando a funcion2!\n\n"); | | funct2(); | | printf ("\t Volviendo desde funcion2!\n\n"); | | printf ("Eso es todo!\n\n"); | | } | | funct1() | | { | | printf ("\t\t Hola desde funcion1!\n\n); | | } | | funct2() | | { | | printf ("\t\t Hola desde funcion2!\n\n); | | } | +---------------------------------------------------------------+ 2.2 "C": compilación de un programa Para compilar el programa de ejemplo anterior en un módulo ejecutable, ingrese el siguiente comando en la línea de comandos. Sesión de muestra: +---------------------------------------------------------------+ | $cc hola.c | | $ | +---------------------------------------------------------------+ Sin ninguna opción, cc acepta código fuente en C y programas en lenguaje ensamblador que siguen las convenciones descritas anteriormente. Compilará, ensamblará y cargará estos programas para producir un ejecutable llamado a.out. La utilidad cc coloca el código objeto en archivos con el mismo nombre de archivo base (todo lo que está antes del punto) que el código fuente, pero con una extensión de nombre de archivo .o. a.out significa salida en ensamblador. Este es el valor predeterminado. Sesión de muestra: +---------------------------------------------------------------+ | $cc hola.c | | $a.out | | Hola desde main! | | Llamando a funcion1! | | | | Hola desde funcion1! | | | | Volviendo desde funcion1! | | | | Llamando desde funcion2! | | | | Hola desde funcion2! | | | | Volviendo desde funcion2! | | | | Eso es todo! | | $ | +---------------------------------------------------------------+ NOTA: El archivo a.out creado por la utilidad cc tiene los siguientes permisos: usuario: lectura, escritura y ejecución grupo: lectura y ejecución otros: lectura y ejecución No es necesario que cambie los permisos mediante el comando chmod, ya que la utilidad cc establece los permisos de ejecución por usted. 2.3 "C": cambio de nombre del módulo ejecutable Puede cambiar el nombre del módulo ejecutable mediante el comando mv. Los permisos del archivo serán los mismos que antes de cambiar el nombre del archivo. Sesión de muestra: +---------------------------------------------------------------+ | $mv a.out hola | | $hola | | Hola desde main! | | Llamando a funcion1! | | | | Hola desde funcion1! | | | | Volviendo desde funcion1! | | | | Llamando desde funcion2! | | | | Hola desde funcion2! | | | | Volviendo desde funcion2! | | | | Eso es todo! | | $ | +---------------------------------------------------------------+ 2.4 "C": Dar un nombre al archivo de salida Es posible enviar la salida a un archivo que usted especifique en lugar de hacerlo a a.out, recurriendo al siguiente comando: +===============================================================+ | Command Format: cc -o output source | | | | output - the name of the executable file | | | | source - the name of the C source code file | +===============================================================+ La opción -o le indica a cc que le indique al editor de enlaces que utilice el nombre especificado para la salida en lugar del nombre predeterminado a.out. NOTA: No es necesario que la opción -o aparezca después del comando cc. El nombre de archivo que aparece después de -o es el nombre del archivo de salida. Por ejemplo, cc source -o output es lo mismo que cc -o output source. Sesión de muestra: +---------------------------------------------------------------+ | $cc -o hola.c | | $hola | | Hola desde main! | | Llamando a funcion1! | | | | Hola desde funcion1! | | | | Volviendo desde funcion1! | | | | Llamando desde funcion2! | | | | Hola desde funcion2! | | | | Volviendo desde funcion2! | | | | Eso es todo! | | $ | +---------------------------------------------------------------+ 2.5 "C": Generar un listado de ensamblado Esta opción hace que cc compile programas en C y deje los programas fuente en lenguaje ensamblador correspondientes en un archivo con extensiones de nombre de archivo .s. +===============================================================+ | Command Format: cc -S hello.c | | | | -S = Compile only | +===============================================================+ Sesión de ejemplo: +---------------------------------------------------------------+ | $cc -S hola.c | | $ls -C | | ejemplo.f hola hex.c octal.c | | hola.c hola.s multiply.c | | $ | +---------------------------------------------------------------+ 2.6 "C": Main y dos funciones en forma de tres archivos fuente separados Este es el mismo programa en C que hemos visto antes, excepto que ahora está en tres archivos en lugar de uno como antes. Los tres archivos son main.c, funct1.c y funct2.c. +---------------------------------------------------------------+ | $cat main.c | | main () | | { | | printf ("Hola desde main!\n\n"); | | printf ("Llamando a funcion1!\n\n"); | | funct1(); | | printf ("\t Volviendo de funcion1!\n\n"); | | printf ("Llamando a funcion2!\n\n"); | | funct2(); | | printf ("\t Volviendo de funcion2!\n\n"); | | printf ("Eso es todo!\n\n"); | | } | | $cat funcion1.c | | funct1() | | { | | printf ("\t\t Hola desde funcion1!\n\n); | | } | | $cat funcion2.c | | funct2() | | { | | printf ("\t\t Hola desde funcion2!\n\n); | | } | +---------------------------------------------------------------+ 2.7 "C": compilación pero no producción de un módulo ejecutable Si se utiliza el programa anterior, el siguiente comando compilará pero no producirá un módulo ejecutable. +===============================================================+ | Command Format: cc -c main.c funct1.c funct2.c | | | | -c = Compile, but do not load object files. This option | | causes cc to compile and/or assemble source code | | programs and leave the corresponding object programs | | in files with filename extensions of .o. | +===============================================================+ sesión de ejemplo: +---------------------------------------------------------------+ | $cc -c main.c funcion1.c funccion2.c | | main.c: | | funcion1.c: | | funcion2.c: | | $ls a.out | | a.out not found | | $ls -C *.o | | funcion1.o funcion2.o main.o | | $ | +---------------------------------------------------------------+ La opción -c hace que el sistema de compilación suprima la fase de edición de enlaces. Esto produce uno o varios archivos de objeto, en este ejemplo (main.o funct1.o funct2.o), que se pueden editar mediante enlaces en un momento posterior con el comando cc sin opciones.