mar, 02 2007 - 8:46 pm
El compilador C de GNU se llama gcc y puede compilar C, C++ y Objective-C. El compilador de C se apega al estándar ANSI, por lo que es fácil de portar un programa C ANSI a Linux.
Cómo compilar con gcc
El compilador GNU se invoca con el comando gcc. De manera predeterminada este comando preprocesará, compilará y en enlazará un programa de C. Existen muchas opciones para el gcc, y entre ellas existen controles que permiten ejecutar solo alguna fase de la secuencia preproceso/compilación/enlace.
El siguiente ejemplo sencillo es un programa en C que simula el lanzamiento de un dado n veces, y luego imprime el número de veces que sale cada una de sus caras. Nota: El ejemplo lo saqué de un libro de C, espero no me demanden.
Crea el archivo juego.c:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int tirarDado(void);
int main(int argc, char * argv[])
{
int i, iIter, dado[6];
if(argc<2)
{
printf("Uso: %s n\n",argv[0]);
return 1;
}
iIter = atoi(argv[1]);
memset(dado, 0, sizeof(dado));
for(i=0; i<iIter; i++)
{
dado[tirarDado() - 1]++;
}
printf("%d tiradas\n",iIter);
printf("\tCara\tTiradas\n");
for(i=0; i<6; i++)
{
printf("\t%d : \t%d\n",i+1, dado[i]);
}
}
Y el archivo tirador.c:
#include<stdlib.h>
int tirarDado(void)
{
return (rand()%6+1);
}
PodrÃamos utilizar un solo comando para compilar y crear el programa ejecutable:
gcc -o juego juego.c tirador.c
Puede ver que -o indica el nombre del archivo de salida (el ejecutable). gcc sabe que los archivos con la extensión *.c son archivos de C y los compila como tales. Sino especifica un nombre de archivo de salida, gcc creará predeterminadamente el archivo a.out.
Ahora veamos otra manera de compilar nuestro programa: haciéndolo por módulos (por separado):
gcc -c juego.c
gcc -c tirador.c
gcc -o juego juego.o tirador.o
En este caso indicamos al compilador, con la opción -c, que primero el archivo juego.c, luego el archivo tirador.c. Y por último le indicamos que cree el archivo binario ejecutable, utilizando los dos archivos objeto (resultados de la compilación): juego.o y tirador.o.
Cómo compilar con g++
El comando g++ nos permite compilar archivos de C++. Aunque gcc puede compilar programas de C++, no hace automáticamente todos los enlaces requeridos con las bibliotecas de clases. Necesita usar g++ para esto. Por ello es recomendable que utilices g++ si estás utilizando C++.
Ahora vamos a compilar la versión C++ de nuestro programa de los dados; el archivo juego.cpp:
#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
int tirarDado(void);
int main(int argc, char * argv[])
{
int i, iIter, dado[6];
if(argc<2)
{
cout<<"Uso: "<<argv[0]<<"n\n";
return 1;
}
iIter = atoi(argv[1]);
memset(dado, 0, sizeof(dado));
for(i=0; i<iIter; i++)
{
dado[tirarDado() - 1]++;
}
cout<<iIter<<" tiradas\n";
cout<<"\tCara\tTiradas\n";
for(i=0; i<6; i++)
{
cout<<"\t"<<i+1<<" :\t"<<dado[i]<<endl;
}
}
El archivo tirador.cpp:
#include<stdlib.h>
int tirarDado(void)
{
return (rand()%6+1);
}
La compilación en g++ es muy similar a gcc en casi todos los aspectos. Para compilar con un solo comando utiliza:
g++ -o juego juego.cpp tirador.cpp
Y para compilar por módulos:
g++ -c juego.cpp
g++ -c tirador.cpp
g++ -o juego juego.o tirador.o
ELF
Cuando se compila un programa, se genera un archivo objeto, y cuando se enlaza el programa, se crea un archivo binario ejecutable. El enlazador debe entender el formato de los archivos objeto, y como el sistema operativo debe cargar y ejecutar el programa ejecutable, también debe entender este formato.
Ya vio que el archivo ejecutable por defecto se llama a.out. Hace un tiempo, el formato de los archivos objeto y los archivos ejecutables se conocía como a.out. Este formato es muy antiguo y contiene bastantes defectos. El formato actual, utilizado por los sistemas UNIX y Linux se conoce como ELF (Formato Ejecutable y de Enlace). ELF es mucho más versátil que a.out, y se presta muy bien para crear bibliotecas compartidas (librerías dinámicas).
Puede saber cual es el formato de un archivo utilizando el comando file, por ej.:
file juego tirador.o /usr/bin/apt-get
juego: ELF 32-bit LSB executable, Intel 80386…
tirador.o: ELF 32-bit LSB relocatable, Intel 80386…
/usr/bin/apt-get: ELF 32-bit LSB executable, Intel 80386…
12 Comentarios | deja el tuyo