GCC Compiler es un compilador de C muy poderoso y popular para varias distribuciones de Linux. Este artículo explica algunas de las opciones populares del compilador GCC.
Un ejemplo de código C
El siguiente código C básico (main.c) se utilizará en este artículo:
#include<stdio.h> int main(void) { printf("\n The Geek Stuff\n"); return 0; }
Opciones del compilador GCC
1. Especifique el nombre del ejecutable de salida
En su forma más básica, el compilador gcc se puede usar como:
gcc main.c
El comando anterior ejecuta el proceso de compilación completo y genera un ejecutable con el nombre a.out.
Use la opción -o, como se muestra a continuación, para especificar el nombre del archivo de salida para el ejecutable.
gcc main.c -o main
El comando anterior produciría un archivo de salida con el nombre 'principal'.
Para comprender el proceso de compilación completo de un compilador GCC, lea nuestro artículo Viaje de un programa C a un ejecutable de Linux en 4 etapas.
2. Habilite todas las advertencias configuradas a través de la opción -Muro
Esta opción habilita todas las advertencias en GCC.
#include<stdio.h> int main(void) { int i; printf("\n The Geek Stuff [%d]\n", i); return 0; }
Si se compila el código anterior, se produce la siguiente advertencia relacionada con la variable i no inicializada:
$ gcc -Wall main.c -o main main.c: In function ‘main’: main.c:6:10: warning: ‘i’ is used uninitialized in this function [-Wuninitialized]
3. Produce solo la salida del preprocesador con la opción -E
La salida de la etapa de preprocesamiento se puede generar usando la opción -E.
$ gcc -E main.c > main.i
El comando gcc produce la salida en stdout para que pueda redirigir la salida en cualquier archivo. En nuestro caso (arriba), el archivo main.i contendría la salida preprocesada.
4. Produce solo el código ensamblador usando la opción -S
La salida de nivel de ensamblaje se puede generar usando la opción -S.
gcc -S main.c > main.s
En este caso, el archivo main.s contendría la salida del ensamblado.
5. Produce solo el código compilado usando la opción -C
Para producir solo el código compilado (sin ningún enlace), use la opción -C.
gcc -C main.c
El comando anterior produciría un archivo main.o que contendría el código de nivel de máquina o el código compilado.
6. Produzca todos los archivos intermedios usando la función -save-temps
La opción -save-temps puede hacer todo el trabajo realizado en los ejemplos 4, 5 y 6 anteriores. A través de esta opción, la salida en todas las etapas de compilación se almacena en el directorio actual. Tenga en cuenta que esta opción también produce el ejecutable.
Por ejemplo:
$ gcc -save-temps main.c $ ls a.out main.c main.i main.o main.s
Entonces vemos que todos los archivos intermedios, así como el ejecutable final, se produjeron en la salida.
7. Enlace con bibliotecas compartidas usando la opción -l
La opción -l se puede utilizar para enlazar con bibliotecas compartidas. Por ejemplo:
gcc -Wall main.c -o main -lCPPfile
El comando gcc mencionado anteriormente vincula el código main.c con la biblioteca compartida libCPPfile.so para producir el ejecutable final 'main'.
8. Cree un código independiente de la posición usando la opción -fPIC
Al crear las bibliotecas compartidas, se debe producir código independiente de la posición. Esto ayuda a que la biblioteca compartida se cargue como cualquier dirección en lugar de una dirección fija. Para esto se utiliza la opción -fPIC.
Por ejemplo, los siguientes comandos crean una biblioteca compartida libCfile.so desde el archivo fuente Cfile.c:
$ gcc -c -Wall -Werror -fPIC Cfile.c $ gcc -shared -o libCfile.so Cfile.o
Entonces vemos que la opción -fPIC se usó en la creación de una biblioteca compartida.
9. Imprime todos los comandos ejecutados usando la opción -V
La opción -v se puede utilizar para proporcionar información detallada sobre todos los pasos que realiza gcc al compilar un archivo fuente.
Por ejemplo:
$ gcc -Wall -v main.c -o main Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-linux-gnu/4.6/lto-wrapper Target: i686-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.6.3-1ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=i686-linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu Thread model: posix gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) ... ... ...
Entonces vemos que se produjo información detallada en la salida.
10. Habilite el soporte de programas ISO C89 usando la opción -ansi
A través de la opción -ansi se habilita el soporte para el estilo ISO C89.
Considere el siguiente código:
#include<stdio.h> int main(void) { // Print the string printf("\n The Geek Stuff\n"); return 0; }
Si el código anterior se compila con la opción -ansi, gcc generará un error porque los comentarios de C++ no están permitidos en el estilo ISO C89.
Aquí está la salida:
$ gcc -Wall -ansi main.c -o main main.c: In function ‘main’: main.c:5:3: error: expected expression before ‘/’ token
Entonces vemos que gcc arrojó un error relacionado con el estilo de comentario.
11. Interprete char como un char sin firmar usando la opción -funsigned-char
A través de esta opción, el tipo de char se trata como un tipo sin firmar.
Aquí hay un ejemplo:
#include<stdio.h> int main(void) { char c = -10; // Print the string printf("\n The Geek Stuff [%d]\n", c); return 0; }
Cuando el código anterior se compila con la opción funsigned-char, este es el resultado:
$ gcc -Wall -funsigned-char main.c -o main $ ./main The Geek Stuff [246]
Entonces vemos que el char fue tratado como si no estuviera firmado.
12. Interprete char como char firmado usando la opción -fsigned-char
Esto es lo contrario de lo que discutimos en (12) arriba. Usando esta bandera, las variables char se tratan como si estuvieran firmadas.
Aquí hay un ejemplo:
$ gcc -Wall -fsigned-char main.c -o main $ ./main The Geek Stuff [-10]
El resultado confirma que char se trató como firmado.
13. Use macros de tiempo de compilación usando la opción -D
La opción D del compilador se puede usar para definir macros de tiempo de compilación en el código.
Aquí hay un ejemplo:
#include<stdio.h> int main(void) { #ifdef MY_MACRO printf("\n Macro defined \n"); #endif char c = -10; // Print the string printf("\n The Geek Stuff [%d]\n", c); return 0; }
La opción del compilador -D se puede usar para definir la macro MY_MACRO desde la línea de comando.
$ gcc -Wall -DMY_MACRO main.c -o main $ ./main Macro defined The Geek Stuff [-10]
La impresión relacionada con la macro en la salida confirma que se definió la macro.
14. Convierta las advertencias en errores con la opción -Werror
A través de esta opción, cualquier advertencia que gcc pueda reportar se convierte en error.
Aquí hay un ejemplo:
#include<stdio.h> int main(void) { char c; // Print the string printf("\n The Geek Stuff [%d]\n", c); return 0; }
La compilación del código anterior debería generar una advertencia relacionada con la variable indefinida c y esto debería convertirse en un error usando la opción -Werror.
$ gcc -Wall -Werror main.c -o main main.c: In function ‘main’: main.c:7:10: error: ‘c’ is used uninitialized in this function [-Werror=uninitialized] cc1: all warnings being treated as errors
15. Proporcione opciones de gcc a través de un archivo usando la opción @
Las opciones de gcc también se pueden proporcionar a través de un archivo. Esto se puede hacer usando la opción @ seguida del nombre del archivo que contiene las opciones. Más de una opción está separada por un espacio en blanco.
Aquí hay un ejemplo:
$ cat opt_file -Wall -omain
El opt_file contiene las opciones.
Ahora compile el código proporcionando opt_file junto con la opción @.
$ gcc main.c @opt_file main.c: In function ‘main’: main.c:6:11: warning: ‘i’ is used uninitialized in this function [-Wuninitialized] $ ls main main
El resultado confirma que el archivo opt_file se analizó para obtener las opciones y la compilación se realizó en consecuencia.