Suscribirse al Feed
02Mar

Compiladores de C/C++ en Linux

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...

Etiquetas:

1 Comentario para “Compiladores de C/C++ en Linux”

 

 

Antes de comentar... recuerda que no hago tareas

Te invito a subscribirte al feed RSS. ¿No sabes que es un lector de Feeds?

© 2007 - 2008 Dezinerfolio. Todos los derechos reservados.
Powered by Wordpress. Entradas RSS