Posteado por: wozgeass | agosto 20, 2009

Programando en C para linux (primera parte).


COMPILANDO UN PROGRAMA.

Iniciare este tuto explicando el proceso  basico que requiere para compilar un programa de C. Se describe tambien el modelo de compilacion con gcc y tambien como C  soporta bibliotecas propias.

Inicio de un programa.

Podemos iniciar un programa con cualquier editor que gusten pero como esta programacion es basada en linux, en todos los sistemas linux y unix un editor que trae por default es vi, y en algunas distros ya incluye pico o nano.

Por convencion el nombre del archivo debe terminar con la extencion ‘.c’ por ejemplo mi “programapiñata.c”.

Compilacion.

Existen muchos compiladores de C. Por ejemplo ‘cc’ es el compilador estandar de Sun. El compilador GNU de C es gcc, el cual es muy popular en todas las distros de linux y la verdad no se si en otras distros exista pero en gentoo tenemos un paquete llamado “dev-lang/icc” que es el compilador de ‘C y C++’ de Intel para linux.

Para compilar el programa usaremos el comando gcc. El comando debera ser seguido por el nombre del programa en ‘C’ que se requiere compilar. Un determinado numero de opciones del compilador pueden ser indicadas tambien.

El comando basico de compilacion es:

gcc programapiñata.c

Donde programapiñata es el nombre del archivo.

Si hay errores en el programa (tales como palabras mal escritas, caracteres no tecleados u omiciones de punto y coma), compilador se detendra y los reportara.

¿Qué errores nos podemos encontrar a la hora de compilar? Podemos encontrarnos varios tipos de errores que pueden ocurrir en un programa, de sintaxis y en tiempo de ejecucion.

Errores sintacticos.

El termino sintaxis se refiere a la estructura de cualquier programa y a las reglas de esa estructura. Para nosotros, unos pocos errores sintactivos no son significativos, y por eso podemos leer poesia o algun articulo con faltas ortograficas, pero a la hora de compilar no estan permisivo y mostrara un mensaje de error y abortara la compilacion.

Errores en tiempo de ejecucion.

Estos errores tambien se llaman excepciones por que indican que algo excepcional( y malo ) ocurrio y dentro de estos errores entra:

  • Errores logicos.

Si hay un error de logica en tu programa, el se ejecuta sin ningun mensaje de error, pero el resultado             no sera el desado. En resumen el programa hara lo que le dijiste que hiciera(tu logica de                            programacion mal empleada). Es dificil hallar errores de logica, porque requiere trabajar al reves, observando el resultado del programa para averiguar lo que hace.Cuando el compilador ah terminado si problemas, la version compilada, o el ejecutable, es dejado en un archivo llamado a.out, o si la opcion -o es usada con el compilador, el nombre despues de -o es el nombre del ejecutable.

Te recomiendo usar la opcion -o con el nombre del archivo ejecutable como se muestra a continuacion:

gcc -o programapiñata programapiñata.c

Ejecucion de un programa.

Para correr un ejecutable en unix o en linux, simplemente se escribe el nombre del archivo que lo contiene, en este caso ./programapiñata o sin usar la opcion -o ./a.out.

Con lo anterior, se ejecuta el programa, mostrando algun resultado en la pantalla. En este estado, podria haber errores en tiempo de ejecucion (run time errors), tales como divicion por cero, o bien, podrian hacerse evidentes al ver que el programa no produce la salida correcta.

Si lo anterior sucede, entonces se debe regresar a editar el archivo del programa, recompilarlo, y ejecutarlo nuevamente.

Modelo de compilacion de C.

En la siguiente figura siguiente se muestran las etapas que cubre el compilador para obtener el ejecutable:

modelo de compilacion

  1. El preprocesador: Se cubre mas adelante con mas detalle, a grandes razgos acepta el codigo fuente como entrada y es responsable de:
    • Quita los comentarios.
    • interpreta las directivas del preprocesador las cuales inician con #.
      por ejemplo:
      #include <——incluye el contenido del archivo nombrado. Estos son usualmente llamados archivos cabecera(headers).
      Por ejemplo:
      #include<stdio.h> <——- Contiene el archivo de la biblioteca estandar de entrada/salida.
      #define <—– Define un nombre simbolico o constante. Sustitucion de macros.
      ejemplo:
      #define TAM_MAX_ARREGLO 100

2. Compilador: El compilador de C traduce el codigo fuente a codigo ensamblador. El codigo fuente es recibido del preprocesador.

3. Ensamblador:  El ensamblador crea el codigo fuente o los archivos objeto. EN los sistemas con Unix o Linux se podran ver los archivos con el sufijo ‘.o’.

4.  Ligador:  Si el archivo fuente hace referencia a funciones de una biblioteca o de funciones que estan definidas en otros archivos fuentes, el ligador combina estas funciones (con main()) para crear un archivo ejecutable.

Opciones de GCC.

Una vez descrito el modelo basico de compilacion, se daran algunas opciones utiles y otras escenciales. Te recomiendo revisar las paginas de man para mayor informacion.

  • -E
    El compilador se detiene en la etapa de preprocesamiento y el resultado se muestra en la salida estandar.
    ej.
    gcc -E programapiñata.c
  • -c
    Suprime el proceso de ligado y produce un archivo ‘.o’ para cada archivo fuente listado. Despues los archivos objeto pueden ser ligados por el comando gcc.
    ej.
    gcc programapiñata.o  programapiñata1.o -o programa_mas_piñata
  • l <biblioteca>
    Liga con las bibliotecas objeto. Estas opcion debera seguir los argumentos de los archivos fuente. Las bibliotecas objeto son guardadas y pueden estar estandarizadas, un tercero o usuario las crea. Esta biblioteca debera ligarse explicitamente si se dea usar las funciones matematicas (Y por supuesto no olvidar el archivo cabecera #include<math.h>, en el programa que llama a las funciones).
    ej.
    gcc -o programapiñata_mat programapiñata_mat.c -lm
    Muchas otras bibliotecas son ligadas de esta forma.
    -l directorio
    Agrega directorios a la lista de directorios que contienen las rutinas de la biblioteca de objetos. El ligador siempre busca las bibliotecas estandares y del sistema en /lib y /usr/lib. Si se requieren ligar bibliotecas personales o instalarlas para usted se tendra que especificar donde estas guardadas.
    ej.
    gcc -o programapiñata programapiñata.c -l /home/minombre/mislibs milib.a
    -l <trayectoria>
    Agrega una trayectoria o ruata a la lista de directorios en los cuales se buscaran los archivos cabecera #include con nombre relativos (es decir, los que no empiezan con ‘/’).
    El procesador por default, primero busca archivos #include en el directorio que contiene el archivo fuente, y despues en los directorios nombrados con la opcion -l si hubiera, y finalmente, en /usr/include. Por lo tanto, si se quiere incluir archivos cabecera guardados en /home/minombre/miscabeceras tendra que ser:
    gcc -o programapiñata programapiñata.c -I /home/minombre/miscabeceras
    importante: Las caberas de la biblioteca del sistema son guardadas en unl ugar especial(/usr/include) y no son afectadas por la opcion -I. Los archivos cabecera del sistema y del usuario son incluidos en la manera un poco diferente.
  • -g
    Opcion para llamar las opciones de depuracion (debug). Instruye al compilador para producir informacion adicional en la tabla de simbolos que es usado por una variedad de utilierias de depuracion. Por ejemplo, se si emplea el depurador de GNU, el programa debera compilarse de la siguiente forma para generar extenciones GDB:
    gcc -ggdb -o programapiñata programapiñata.c
  • -D
    Define simbolo como identificadores (-D <identificador>) o como valores (-D simbolo=valor) en una forma similar a la directiva del preprocesador #define
  • -v
    Muestra en la salida estandar de errores los comandos ejecutados en la etapa de compilacion.

Uso de las bibliotecas.

C es un lenguaje extremadamente pequeño. Las funcionalidad de C se obtiene a traves de un rico conjunto de bibliotecas de funciones.

Como resultado, muchas implementaciones de C incluyend bibliotecas Estandar de funciones para varias finalidades. Para muchos propositos basicos estas podrian ser consideradas como parte de C. Pero pueden variar de maquina a maquina.

Un programador puede tambien desarrollar sus propias funciones de bibliotecas e incluso bibliotecas especiales de terceros, por ejemplo, NAG(Numerical Algorithms  Group)  o PHIGS(Programmer’s Hierarchical Interactive Graphics System).

Todas las bibliotecas (Excepto E/S estandar y algunas otras) requieren ser explicitamente ligadas con la opcion ‘-l‘.
ej.
gcc -o programapiñata_ventanita programapiñata_ventanita.c -l ncurses (nota: Estoy preparando un tuto con ncurses esperalo …).

wozgeass: push eax, 1

int 80h

EOF!!!

hasta el proximo post…

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Categorías

A %d blogueros les gusta esto: