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…
8 Comentarios | deja el tuyo



Hola, me gustaria saber que necesito instalar para poder ejecutar el compilador gcc y g++ y la forma de instalarlo. Gracias
En que distro estás?
hola me gustaría saber cuales son lo paquetes que tengo que instalar para poder compilar con g++ o gcc y ademas no se si tu me podrías orientar si es posible emigrar mi código de c++ a g++
Archivo binario no ejecuta.
Buenas.
Yo estoy aprendiendo linux, y cree un catálogo en línea usando Genisisweb windows.
Estando en ambiente Windows instalé WAMP, en la carpeta /bin/apache/cgi-bin se encuentran 4 archivos .cgi (genisis0.cgi, genisis1.cgi, etc), el executable del Genisis es wwwi32.exe, y el resto es la base de datos.
Luego exporté la base hacia linux, y usando ftp copié la exportación con permisos 755. El linux que tengo en mi máquina es Centos 5.2 (una copia binaria de Redhat Enterprise). El webserver es
* documentroot: /var/www/html
* cgi: /var/www/cgi-bin
* Apache: /v2.2.3 (Redhat)
* SeLinux policy: enable
En Linux el archivo ejecutable se llama “wwwisis.pl”. Igual forma copié los 4 archivos .cgi y el binario en la carpeta cgi-bin.
Cuando uso el comando> “file wwwisis”
aparece:
wwwisis: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), stripped.
Pero cuando quiero ejecutarlo, el binario no responde, y aparece en el browser el mensaje:
500 Internal Server Error
Internal Server Error
——————————————————
Use el comando “gdb ./wwwisis” y aparece:
GNU gdb Red Hat Linux (6.5-37.el5rh)
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
This GDB was configured as “i386-redhat-linux-gnu”…”/var/www/cgi-bin/wisis/wwwisis”: not in executable format: No se reconoce el formato del fichero
No comprendo que fallas tengo en mi linux, si faltará alguna libreria. Para confirmar que Perl funciona ejecuté este archivo en la carpeta cgi-bin donde están los archivos .cgi y el binario:
Minimo.pl
——————-
#!/usr/bin/perl -w
use strict;
use CGI::Carp qw(fatalsToBrowser);
print “Content-type: text/html\n\n”;
print ”, “\n”;
print “Salida de la examinación\n”;
print “¡Qué bien, funciona!\n”;
print “\n”;
Y funcionó muy bien este script en el browser.
Por ultimo leyendo en las paginas web apareció un ejemplo de crear un archivo binario:
juego.cpp
————-
#include
#include
#include
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;
}
}
y tirador.cpp
—————–
#include
int tirarDado(void)
{
return (rand()%6+1);
}
Y finalmente los compile usando g++ -o jugar jugador.cpp tirador.cpp
Y cuando ejecuto el archivo binario JUGAR no funciona para nada…
El archivo binario wwwisis.pl lo bajé via ftp y la profesora que lo tiene en su servidor le funciona de maravillas el catálogo.
Será que hay que activar algunas cosas en la configuración del archivo httpd.conf?
Por favor. Agradezco de antemano su enseñanza.
una duda necesito 3 kompiladores c++ para linux
gcc , sunstudio, y no se de otros XD
Saludos…
Necesito saber compiladores de C++ en LINUX a parte de los mencionados por Cristian…
Y cual es el Nombre correcto GNU? G++? GCC?
O cual otro nombre se le da…
Saludos Gracias espero respuesta¡¡¡¡