GNU/Linux >> Tutoriales Linux >  >> Linux

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

Las herramientas de software suelen ofrecer múltiples funciones, pero, como la mayoría de ustedes estará de acuerdo, no todo el mundo utiliza todas sus funciones. En términos generales, no hay nada de malo en eso, ya que cada usuario tiene sus propios requisitos y solo usa las herramientas dentro de esa esfera. Sin embargo, siempre es bueno seguir explorando las herramientas que usa, ya que nunca sabe cuándo una de sus funciones puede ser útil, ahorrándole parte de su valioso tiempo en el proceso.

Caso en cuestión:compiladores. Un buen compilador de lenguajes de programación siempre ofrece una gran cantidad de opciones, pero los usuarios generalmente conocen y usan solo un conjunto limitado. Específicamente, si es un desarrollador de lenguaje C y usa Linux como su plataforma de desarrollo, es muy probable que esté usando el compilador gcc, que ofrece una lista interminable de opciones de línea de comandos.

¿Sabes que si quieres, puedes pedirle a gcc que guarde la salida en cada etapa del proceso de compilación? ¿Conoces el -Muro opción que usa para generar advertencias no cubre algunas advertencias específicas? Hay muchas opciones de gcc en la línea de comandos que no se usan comúnmente, pero que pueden ser extremadamente útiles en ciertos escenarios, por ejemplo, al depurar el código.

Entonces, en este artículo, cubriremos un par de opciones de este tipo, ofreciendo todos los detalles requeridos y explicándolos a través de ejemplos fáciles de entender cuando sea necesario.

Pero antes de continuar, tenga en cuenta que todos los ejemplos, comandos e instrucciones que se mencionan en este tutorial se probaron en Ubuntu 16.04 LTS, y la versión gcc que usamos es 5.4.0.

Ver resultados intermedios durante cada etapa de compilación

¿Sabe que hay, en términos generales, un total de cuatro etapas por las que pasa su código C cuando lo compila usando el compilador gcc? Estos son el preprocesamiento, la compilación, el ensamblaje y la vinculación. Después de cada etapa, gcc produce un archivo de salida temporal que se transfiere a la siguiente etapa. Ahora, estos son todos los archivos temporales que se producen y, por lo tanto, no podemos verlos; todo lo que vemos es que emitimos el comando de compilación y produce el archivo binario/ejecutable que podemos ejecutar.

Pero supongamos que, durante la depuración, hay un requisito para ver cómo quedó el código después de, por ejemplo, la etapa de preprocesamiento. ¿Qué harías tú entonces? Bueno, lo bueno es que el compilador gcc ofrece una opción de línea de comando que puede usar en su comando de compilación estándar y obtendrá esos archivos intermedios que el compilador elimina de lo contrario. La opción de la que estamos hablando es -save-temps .

Esto es lo que dice la página de manual de gcc sobre esta opción:

           Store the usual "temporary" intermediate files permanently; place
           them in the current directory and name them based on the source
           file.  Thus, compiling foo.c with -c -save-temps produces files
           foo.i and foo.s, as well as foo.o.  This creates a preprocessed
           foo.i output file even though the compiler now normally uses an
           integrated preprocessor.

           When used in combination with the -x command-line option,
           -save-temps is sensible enough to avoid over writing an input
           source file with the same extension as an intermediate file.  The
           corresponding intermediate file may be obtained by renaming the
           source file before using -save-temps.

El siguiente es un comando de ejemplo que le dará una idea de cómo puede usar esta opción:

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

Y así es como verifiqué que todos los archivos intermedios se produjeron después de ejecutar el comando mencionado anteriormente:

Entonces, como puede ver en la captura de pantalla anterior, test.i , prueba.s y prueba.o los archivos fueron producidos por -save-temps opción. Estos archivos corresponden a las etapas de preprocesamiento, compilación y vinculación, respectivamente.

Prepare su código para la depuración y creación de perfiles

Hay herramientas dedicadas que le permiten depurar y perfilar su código fuente. Por ejemplo, gdb se usa con fines de depuración, mientras que gprof es una herramienta popular para fines de creación de perfiles. Pero, ¿sabe que hay opciones de línea de comando específicas que ofrece gcc para que su código esté listo para la depuración y el perfilado?

Comencemos con la depuración. Para poder usar gdb para la depuración de código, deberá compilar su código usando -g opción de línea de comando proporcionada por el compilador gcc. Esta opción básicamente permite que gcc produzca información de depuración que gdb requiere para depurar correctamente su programa.

En caso de que planee usar esta opción, se le recomienda revisar los detalles que ofrece la página de manual de gcc sobre esta opción; algunos de ellos pueden resultar vitales en algunos casos. Por ejemplo, el siguiente es un extracto tomado de la página man:

           GCC allows you to use -g with -O.  The shortcuts taken by optimized
           code may occasionally produce surprising results: some variables
           you declared may not exist at all; flow of control may briefly move
           where you did not expect it; some statements may not be executed
           because they compute constant results or their values are already
           at hand; some statements may execute in different places because
           they have been moved out of loops.

           Nevertheless it proves possible to debug optimized output.  This
           makes it reasonable to use the optimizer for programs that might
           have bugs.

No solo gdb, compilando su código usando -g La opción también abre la posibilidad de usar la herramienta memcheck de Valgrind en todo su potencial. Para aquellos que no lo saben, los programadores utilizan memcheck para verificar si hay pérdidas de memoria (si las hay) en su código. Puede obtener más información sobre esta herramienta aquí.

Continuando, para poder usar gprof para la creación de perfiles de código, debe compilar su código usando -pg opción de línea de comando. Permite que gcc genere código adicional para escribir información de creación de perfiles, que gprof requiere para el análisis de código. "Debe usar esta opción al compilar los archivos de origen sobre los que desea obtener datos, y también debe usarla al vincular", dice la página de manual de gcc. Para obtener más información sobre cómo realizar perfiles de código con gprof, diríjase a este tutorial específico en nuestro sitio web.

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

Conclusión

A menos que sea un profesional de gcc, estoy seguro de que aprendió algo nuevo con este artículo. Pruebe estas opciones y vea cómo funcionan. Mientras tanto, espere a la siguiente parte de esta serie de tutoriales, en la que analizaremos más opciones de línea de comandos gcc interesantes y útiles.


Linux
  1. 12 ejemplos útiles de comandos Wget en Linux

  2. Opciones útiles de ps

  3. Su Options – ¿Ejecutar comando como otro usuario?

  4. Las 15 opciones de línea de comandos del compilador GCC más utilizadas

  5. 10 ejemplos útiles de comandos completos de Linux Bash_Completion (finalización de la línea de comandos de Bash en esteroides)

10 trucos útiles de la línea de comandos de Linux para principiantes – Parte 2

Comando Dif en Linux

Domina la línea de comandos de Linux

Conceptos básicos de la línea de comandos de Linux:sudo

¿Opciones de línea de comandos de Thunar?

19 consejos y trucos útiles para la línea de comandos de Linux