Comenzando con gcc

“¡Hola Mundo!” con opciones de línea de comandos comunes

Para programas con un solo archivo fuente, usar gcc es simple.

/* File name is hello_world.c */
#include <stdio.h>

int main(void)
{
    int i;
    printf("Hello world!\n");
}

Para compilar el archivo hello_world.c desde la línea de comando:

gcc hello_world.c

gcc luego compilará el programa y enviará el ejecutable al archivo a.out. Si desea nombrar el ejecutable, use la opción -o.

gcc hello_world.c -o hello_world

El ejecutable se llamará hello_world en lugar de a.out. De forma predeterminada, gcc no emite tantas advertencias. gcc tiene muchas opciones de advertencia y es una buena idea consultar la documentación de gcc para saber qué hay disponible. Usar ‘-Wall’ es un buen punto de partida y cubre muchos problemas comunes.

gcc -Wall hello_world.c -o hello_world

Producción:

hello_world.c: In function ‘main’:
hello_world.c:6:9: warning: unused variable ‘i’ [-Wunused-variable]
     int i;
         ^

Aquí vemos que ahora recibimos una advertencia de que la variable ‘i’ fue declarada pero no utilizada en absoluto en la función.

Si planea usar un depurador para probar su programa, deberá indicarle a gcc que incluya información de depuración. Use la opción ‘-g’ para soporte de depuración.

gcc -Wall -g hello_world.c -o hello_world

hello_world ahora tiene información de depuración presente respaldada por GDB. Si usa un depurador diferente, es posible que deba usar diferentes opciones de depuración para que la salida tenga el formato correcto. Consulte la documentación oficial de gcc para obtener más opciones de depuración.

Por defecto, gcc compila el código para que sea fácil de depurar. gcc puede optimizar la salida para que el ejecutable final produzca el mismo resultado pero tenga un rendimiento más rápido y puede resultar en un ejecutable de menor tamaño. La opción ‘-O’ permite la optimización. Hay varios calificadores reconocidos para agregar después de la O para especificar el nivel de optimización. Cada nivel de optimización agrega o elimina una lista establecida de opciones de línea de comandos. ‘-O2’, ‘-Os’, ‘-O0’ y ‘-Og’ son los niveles de optimización más comunes.

gcc -Wall -O2 hello_world.c -o hello_world

‘-O2’ es el nivel de optimización más común para el código listo para producción. Proporciona un excelente equilibrio entre el aumento del rendimiento y el tamaño final del ejecutable.

gcc -Wall -Os hello_world.c -o hello_world

‘-Os’ es similar a ‘-O2’, excepto que ciertas optimizaciones que pueden aumentar la velocidad de ejecución al aumentar el tamaño del ejecutable están deshabilitadas. Si el tamaño del ejecutable final es importante para usted, pruebe con ‘-Os’ y vea si hay una diferencia de tamaño notable en el ejecutable final.

gcc -Wall -g -Og hello_world.c -o -hello_world

Tenga en cuenta que en los ejemplos anteriores con ‘-Os’ y ‘-O2’, se eliminó la opción ‘-g’. Esto se debe a que cuando comienza a decirle al compilador que optimice el código, es posible que ciertas líneas de código ya no existan en el ejecutable final, lo que dificulta la depuración. Sin embargo, también hay casos en los que ciertos errores ocurren solo cuando las optimizaciones están activadas. Si desea depurar su aplicación y hacer que el compilador optimice el código, pruebe la opción ‘-Og’. Esto le dice a gcc que realice todas las optimizaciones que no deberían obstaculizar la experiencia de depuración.

gcc -Wall -g -O0 hello_world.c -o hello_world

‘-O0’ realiza incluso menos optimizaciones que ‘-Og’. Este es el nivel de optimización que usa gcc por defecto. Utilice esta opción si desea asegurarse de que las optimizaciones estén deshabilitadas.

Determinar la versión de gcc

Al consultar la documentación de gcc, debe saber qué versión de gcc está ejecutando. El proyecto GCC tiene un manual para cada versión de gcc que incluye funciones que se implementan en esa versión. Use la opción ‘-v’ para determinar la versión de gcc que está ejecutando.

gcc -v

Salida de ejemplo:

Using built-in specs.
COLLECT_GCC=/usr/bin/gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/5.3.1/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,objc,obj-c++,fortran,ada,go,lto --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-plugin --enable-initfini-array --disable-libgcj --with-default-libstdcxx-abi=gcc4-compatible --with-isl --enable-libmpx --enable-gnu-indirect-function --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
Thread model: posix
gcc version 5.3.1 20160406 (Red Hat 5.3.1-6) (GCC)

En este ejemplo vemos que estamos ejecutando gcc versión 5.3.1. Entonces sabría consultar el manual de GCC 5.3. También es útil incluir su versión de gcc al hacer preguntas en caso de que tenga un problema específico de la versión.