GCC opciones · 5 min read · Jan 22, 2026

Opciones de línea de comandos de GCC poco comunes pero útiles

Las herramientas de software suelen ofrecer múltiples características, pero - como la mayoría de ustedes estará de acuerdo - no todas sus características son utilizadas por todos. En términos generales, no hay nada de malo en eso, ya que cada usuario tiene sus propios requisitos y utiliza las herramientas dentro de esa esfera únicamente. Sin embargo, siempre es bueno seguir explorando las herramientas que usas, ya que nunca sabes cuándo una de sus características podría ser útil, ahorrándote algo de tu valioso tiempo en el proceso.

Un caso en particular: los compiladores. Un buen compilador de lenguaje de programación siempre ofrece una plétora de opciones, pero los usuarios generalmente conocen y utilizan un conjunto limitado solamente. Específicamente, si eres un desarrollador del lenguaje C y usas Linux como tu plataforma de desarrollo, es muy probable que estés utilizando el compilador gcc, que ofrece una lista interminable de opciones de línea de comandos.

¿Sabías que si lo deseas, puedes pedirle a gcc que guarde la salida en cada etapa del proceso de compilación? ¿Sabías que la opción -Wall que usas para generar advertencias no cubre algunas advertencias específicas? Hay muchas opciones de línea de comandos de gcc que no son comúnmente utilizadas, pero que pueden ser extremadamente útiles en ciertos escenarios, por ejemplo, al depurar el código.

Así que, en este artículo, cubriremos un par de tales opciones, ofreciendo todos los detalles requeridos y explicándolas a través de ejemplos fáciles de entender siempre que sea necesario.

Pero antes de continuar, ten en cuenta que todos los ejemplos, comandos e instrucciones mencionados en este tutorial han sido probados en Ubuntu 16.04 LTS, y la versión de gcc que hemos utilizado es 5.4.0.

Ver salida intermedia durante cada etapa de compilación

¿Sabías que hay, en términos generales, un total de cuatro etapas por las que pasa tu código C cuando lo compilas usando el compilador gcc? Estas son preprocesamiento, compilación, ensamblaje y enlace. Después de cada etapa, gcc produce un archivo de salida temporal que se entrega a la siguiente etapa. Ahora, estos son todos archivos temporales que se producen, y por lo tanto no los vemos; todo lo que vemos es que hemos emitido el comando de compilación y produce el binario/ejecutable que podemos ejecutar.

Pero supongamos que, mientras depuras, hay un requisito para ver cómo se veía el código después, digamos, de la etapa de preprocesamiento. Entonces, ¿qué harías? Bueno, lo bueno es que el compilador gcc ofrece una opción de línea de comandos que puedes usar en tu comando de compilación estándar y obtendrás esos archivos intermedios que de otro modo serían eliminados por el compilador. La opción de la que estamos hablando es -save-temps.

Aquí está lo que dice la página del manual de gcc sobre esta opción:

           Almacena los "archivos intermedios" temporales habituales de forma permanente; los coloca  
           en el directorio actual y los nombra en función del archivo fuente. Así, compilar foo.c con -c -save-temps produce archivos  
           foo.i y foo.s, así como foo.o. Esto crea un archivo de salida preprocesado  
           foo.i aunque el compilador ahora normalmente utiliza un preprocesador integrado.

           Cuando se usa en combinación con la opción de línea de comandos -x,  
           -save-temps es lo suficientemente sensato como para evitar sobrescribir un archivo  
           fuente de entrada con la misma extensión que un archivo intermedio. El  
           archivo intermedio correspondiente puede obtenerse renombrando el  
           archivo fuente antes de usar -save-temps.

A continuación se muestra un comando de ejemplo que te dará una idea de cómo puedes usar esta opción:

gcc -Wall -save-temps test.c -o test-exec

Y así es como verifiqué que todos los archivos intermedios fueron producidos después de que se ejecutó el comando mencionado anteriormente:

Así que, como puedes ver en la captura de pantalla anterior, los archivos test.i, test.s y test.o fueron producidos por la opción -save-temps. Estos archivos corresponden a las etapas de preprocesamiento, compilación y enlace, respectivamente.

Prepara tu código para depuración y perfilado

Hay herramientas dedicadas que te permiten depurar y perfilar tu código fuente. Por ejemplo, gdb se utiliza para fines de depuración, mientras que gprof es una herramienta popular para fines de perfilado. Pero, ¿sabías que hay opciones específicas de línea de comandos que gcc ofrece para preparar tu código tanto para la depuración como para el perfilado?

Comencemos con la depuración. Para poder usar gdb para la depuración del código, tendrás que compilar tu código usando la opción de línea de comandos -g proporcionada por el compilador gcc. Esta opción permite que gcc produzca información de depuración que gdb necesita para depurar tu programa con éxito.

En caso de que planees usar esta opción, se te aconseja que revises los detalles que la página del manual de gcc ofrece sobre esta opción; algunos de ellos pueden resultar vitales en algunos casos. Por ejemplo, a continuación se muestra un extracto tomado de la página del manual:

           GCC te permite usar -g con -O. Los atajos tomados por el código optimizado  
           pueden ocasionalmente producir resultados sorprendentes: algunas variables  
           que declaraste pueden no existir en absoluto; el flujo de control puede moverse brevemente  
           a donde no esperabas; algunas declaraciones pueden no ejecutarse  
           porque computan resultados constantes o sus valores ya están  
           a la mano; algunas declaraciones pueden ejecutarse en diferentes lugares porque  
           han sido movidas fuera de los bucles.

           Sin embargo, resulta posible depurar la salida optimizada. Esto  
           hace razonable usar el optimizador para programas que podrían  
           tener errores.

No solo gdb, compilar tu código usando la opción -g también abre la posibilidad de usar la herramienta memcheck de Valgrind a su máximo potencial. Para aquellos que no están al tanto, memcheck es utilizado por los programadores para verificar fugas de memoria (si las hay) en su código. Puedes aprender más sobre esta herramienta aquí.

Pasando a otro tema, para poder usar gprof para el perfilado de código, debes compilar tu código usando la opción de línea de comandos -pg. Esto permite que gcc genere código adicional para escribir información de perfilado, que es requerida por gprof para el análisis del código. “Debes usar esta opción al compilar los archivos fuente sobre los que deseas datos, y también debes usarla al enlazar”, dice la página del manual de gcc. Para aprender más sobre cómo realizar perfilado de código usando gprof, dirígete a este tutorial dedicado en nuestro sitio web.

Nota: El uso de ambas opciones -g y -pg es similar a la forma en que se utilizó la opción -save-temps en la sección anterior.

Conclusión

A menos que seas un experto en gcc, estoy seguro de que aprendiste algo nuevo con este artículo. Prueba estas opciones y ve cómo funcionan. Mientras tanto, espera la próxima parte de esta serie de tutoriales donde discutiremos más opciones de línea de comandos de gcc interesantes y útiles.

Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.