lunes, 30 de julio de 2012

Taller C/C++. Compilación

No es mi intención la de enseñar C, pero si ayudar a realizar las tareas más dificultosas de la programación cuando no eres experto.

Para compilar una aplicación que tengamos escrita en varios ficheros .c (de lenguaje C ) .cpp o .cc (de lenguaje C++) si tenemos un IDE de desarrollo es sencillo, pero pongamonos en lo peor y supongamos que nos encontramos con un entorno solo texto o usamos un editor tipo nano, vi...

Los procesos de la compilación son varios, y entre ellos se encuentra la de enlazado que inserta el código de librerías ya compiladas en nuestro código fuente. Este paso se realiza usando ld, pero en nuestro caso iremos por la vía facil para no liar al personal ya que gcc también lo hace.

Para obtener un ejecutable, en el terminal escribir:

~$ gcc -o nombre_ejecutable fichero_main.c fichero1.c fichero2.c ...

Esta linea realiza el compilado y el enlazado, dando como resultado un ejecutable llamado nombre_ejecutable. Ahora explicaré un poco las opciones que suelo usar para indicarle al compilador como debe generar el binario.

Opciones generales:

-o indica que se genere un fichero ejecutable.
-c indica que se genere solo el objeto compilado pero no enlazado.
-Wall indica que avise de todos los warning que puedan existir en el código, ya que estos warnings podrían dar errores en tiempo de ejecución.
-g indica al compilador que introduzca en el ejecutable todo lo necesario para poder ser depurado a posteriori con herramientas como gdb.
-pedantic -ansi indica al compilador que sea estricto en la compatibilidad con ANSI C
-petantic-errors indica al compilador que convierta los warnings que pueden causar error en ejecución en errores estrictos de código.

Opciones de optimización:

-Ox siendo x=0,1,2,3 Ejem sintaxis: ~$ g++ -o -O2 ejecutame main.cpp

Indican con que grado se quiere que este optimizado el código en cuanto a velocidad de ejecución y espacio en memoria que debe ocupar. Mientras mayor sea el número mayor es la optimización y más se tarda en compilar (personalmente creo que merece la pena esperar a que termine de generar el compilado).

También existe otra opción para el gcc que mejora los tiempos de ejecución. 

-march=[core2 | corei7 | prescott | ... ] 

No recomiendo el uso de march, porque requiere un conocimiento exahustivo del procesador donde correra el ejecutable, amen de que recorta la portabilidad. En este caso soy mas partidario de hacer una buena programación sabiendo como se alojan los datos en memoría, uso de algoritmos del menor orden de complejidad posible, algoritmos adecuados...

Para saber mas opciones, siempre podeis acudir a man gcc o g++








No hay comentarios: