Compilación y ejecución de C en GNU/Linux

Todas las distribuciones GNU/Linux incluyen alguna versión del GNU Project C and C++ Compiler (gcc), vamos a utilizarlo.

    1. Crea el fichero helloworld.c con el siguiente contenido:
#include <stdio.h>
 int main(void) { printf("Hello world!\n"); return 0; } 
  1. Compílalo con gcc:
    gcc helloworld.c
  2. Ejecuta la aplicación:
    ./a.out
  3. Verifica que a.out es un fichero binario para linux 32-bit:
    file a.out
  4. Realmente la compilación incluye varios pasos, el más importante de ellos es la creación de un fichero objeto intermedio, vamos a repetir el proceso en dos pasos:
     gcc -c helloworld.c 

    que genera el fichero helloworld.o, del tipo:

    helloworld.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped

    Para enlazarlo y producir el fichero de salida a.out:

    gcc -Wl helloworld.o

¿Qué sentido tiene compilar por partes? Cuando el código es grande no hay un solo fichero fuente sino muchos, compilar individualmente estos "módulos" permite, por ejemplo, ahorrar mucho tiempo en la modificación y compilación de un solo componente.

Compilación y ejecución de C en Windows

Los sistemas Windows no incluyen inicialmente ningún compilador de C, pero hay muchos compiladores que funcionan en sistemas Windows, en particular dev-c++

  1. Copia el fichero binario a.out compilado en GNU/Linux con gcc en la partición Windows y reinicia el equipo con este sistema
  2. Ejecuta la aplicación a.out en Windows, ¿qué ocurre?
  3. Instala el IDE dev-c++ en windows
  4. Crea un fichero hola.c con el programa hola mundo, compílalo y ejecútalo
  5. ¿Entiendes que teniendo el mismo código fuente los binarios son diferentes?

Bibliotecas estáticas o dinámicas

Un conjunto de ficheros objeto que se enlazan con la parte principal de un programa para producir un binario o ejecutable reciben el nombre de biblioteca (library en inglés). Si el enlace se realiza durante la compilación, las bibliotecas se denominan estáticas o de enlace estático, mientras que si el enlace se realiza durante la ejecución las bibliotecas se denominan dinámicas o de enlace dinámico.

La principal ventaja de la compilación con bibliotecas de enlace dinámico es que el tamaño de los ficheros binarios de las aplicaciones es mucho menor y se optimiza el uso de la memoria porque una biblioteca dinámica puede ser utilizada por diferentes aplicaciones.

En sistemas windows las bibliotecas dinámicas se distribuyen en ficheros con extensión .dll (dynamic link library) y en sistemas GNU/Linux lo hacen en los paquetes lib* que incluyen ficheros con extensión .so (shared object).

Last modified: Wednesday, 25 January 2012, 8:54 AM