Uso de gcc bajo Linux


Hago un alto en el Manual de Programación en C para escribir este artículo.gcc

En este artículo voy a explicar como compilar programas bajo linux, usando gcc, será un artículo muy corto y simple, por si alguien tiene problemas o le da errores raros.

Es bastante fácil, de hecho, si ya sabes algo te recomiendo hacer un “man gcc” y asunto resuelto, pero ahí va.

Tenemos el siguiente código.

#include <stdio.h>
 

int main()
{
       printf("Hola\n");
       return 0;
}

En este programa tan simple solo usamos librerías estándar y con compilar en gcc nos dará un programa.

Si el archivo se llama “simple.c” haremos:

gcc simple.c -o Programa

Después de llamar a gcc ponemos el nombre del archivo, luego el parámetro -o y luego otro nombre, -o viene de –output, es decir salida, y el nombre a continuación será el nombre que tenga el programa. En este caso Programa, de modo que tendremos un archivo ejecutable llamado Programa, lo podemos ejecutar haciendo ./Programa
¿Qué pasa si usamos librerías que no hemos bajado de internet y hemos instalado en nuestro ordenador, hará falta especificar al linker del gcc que las “linkee” junte a nuestro programa. Por ejemplo tenemos el siguiente programa que hace uso de la librería libpcap, una librería de cierta parte de auditoría de redes (eufemismo muy grande para decir esnifar paquetes). Lo que hace es básicamente obtener una interfaz de red y guardarla en el puntero a char “dev”.
Archivo getdevice.c

#include <stdio.h>
#include <pcap.h>
#include <stdlib.h>

int main()
{
      char *dev;
      char errbuf[PCAP_ERRBUF_SIZE];

      dev = pcap_lookupdev(errbuf);
      if (dev == NULL)
      {
               printf("Fallo: %s\n", errbuf);
               exit(1);
      }
      printf("Interfaz: %s\n", dev);
      return 0;
}

Si intentamos compilar de la misma forma, haciendo

gcc getdevice.c -o Programa

, obtendremos lo siguiente.

/tmp/ccpvPdio.o: In function `main':
getdevice.c:(.text+0x23): undefined reference to `pcap_lookupdev'
collect2: ld returned 1 exit status
/tmp/ccpvPdio.o

es el resultado de la compilación y ensamblado del archivo pero no llega a enlazar nada. Como no hemos enlazado nada, al llegar ahí busca la función pcap_lookupdev (perteneciente a la librería pcap) en el propio programa y no la encuentra. Por eso debemos especificarle que enlace la librería pcap al programa. ¿Eso cómo lo hacemos? Con el parámetro -llibrería librería se sustituye con la librería que quieras enlazar, en este caso pcap, de modo que queda así:

gcc getdevice -o Programa -lpcap

Ya no obtendremos errores.

NOTA: Si pruebas esto con esas librería y ejecutas el programa puede que obtengas: 

Fallo: no suitable device found

Eso es porque necesitas privilegios para encontrar las interfaces activas, haz

sudo ./Programa

y funcionará.


Obtener fases intermedias

A veces es interesante obtener el programa en una fase intermedia del proceso de compilación, como el preprocesado, gcc también nos permite hacer esto de manera sencilla. Tenemos el siguiente archivo main.c

#include
int main()
{
      int variable = 1;
      return 0;
}

Vamos a obtener todas las fases intermedias. Primero realizamos tan solo el preprocesado del programa, eso lo hacemos con el parámetro -E

gcc main.c -E > main.pre

Volcamos el contenido a main.pre porque no se crea un archivo sino que manda todo el resultado a stdout, ahora abre el archivo main.pre y podrás ver todo el contenido y cómo ha incluido stdio.h al archivo.

Obtendremos ahora el resultado de la compilación, pero antes del ensamblado, esto se hace con el parámetro -S

gcc main.c -S

Obtendremos un archivo main.s con el contenido en lenguaje ensamblador, en mi caso:

	.file	"main.c"
	.text
.globl main
	.type	main, @function
main:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$16, %esp
	movl	$1, -4(%ebp)
	movl	$0, %eax
	leave
	ret
	.size	main, .-main
	.ident	"GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
	.section	.note.GNU-stack,"",@progbits

Por último obtendremos el resultado de ensamblar el programa pero no enlazarlo, usaremos el parámetro -c, de compile. Podemos tanto hacerlo con el archivo main.c en cuyo caso prepocesará, compilará y ensamblará, o podemos hacerlo con el archivo main.s ahorrándole algunos pasos.

gcc main.c -c

Obtendremos un archivo main.o que ya no podemos abrir por estar en lenguaje máquina, si sientes curiosidad puedes abrirlo con un heditor hexadecimal y ver las intrucciones ensambladas.

Para completar el programa simplemente llamamos a gcc de manera normal pasándole el archivo main.o y terminará de enlazarlo, si has usado librerías tuyas debes pasárselas con el parámetro -llibrería como hemos visto antes.

gcc main.o -o Programa

Dos comandos más que en mi opinión merece la pena mencionar son -v y -###. El primero lo que hará será escribir los comandos que ejecuta a medida que va compilando el programa. El segundo hará lo mismo pero sin ejecutarlos, tan solo los nombrará.

Hasta aquí este corto artículo sobre como usar el gcc para compilar programas sencillos.

Anuncios
Esta entrada fue publicada en Manuales, Tutoriales y etiquetada , , , , , . Guarda el enlace permanente.

2 respuestas a Uso de gcc bajo Linux

  1. lupita100 dijo:

    Hola

    Sabes me interesa compilar con gcc pero sobre la plataforma windows, sabes si puedo seguir este mismo método para windows?

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