lunes, 30 de julio de 2012

Taller C/C++. Makefile

Bueno, creo que lo más simple ya queda claro, además de que es algo que se ha tratado en miles de páginas web con mayor o menor acierto.

Ahora vamos a pasar a algo más complejo que puede llegar a ser un infierno si  no se hace uso de un IDE de desarrollo.

Los ficheros Makefile:

Los ficheros Makefile son ficheros de texto que funcionan como scripts, a los que se llama cuando queremos compilar una aplicación sin tener que escribir toda la linea de texto que llama al compilador con todas sus opciones. Son muy útiles cuando nuestros programas van cogiendo cierta envergadura. Es facil olvidar la opción que mejor nos iba con gcc, o uno de los muchisimos ficheros que componen el proyecto.

Un ejemplo sencillo de Makefile puede ser simplemente escribir dentro de un fichero la linea con la que compilamos un proyecto. gcc -o ejecutable main.cpp
pero se puede llegar a compliar la cosa hasta puntos insospechados, con Makefiles que comprueban la existencia de las librerías que se usan dentro de nuestro código, la ruta de acceso, borrar el compilado anterior de tu programa, instalar el programa...

Para ayudar en la realización de un Makefile, explicaré uno creado por mí, y que cubre bastante bien las necesidades de un desarrollador medio:

#    @author Gabriel

#Definicion de constantes
NOMBRE = bloguero
VERSION = 0.1.5
AUTOR = Gabriel
FECHA = 10/11/2011
COMPILADOR = g++
OPCIONES = -g -Wall -O2
LIBRERIAS = -lm -lpthread
OBJETOS = utm.o poli.o bloguer.o
MAIN = main.cpp

#Genera todo el programa
all: escribe principal
   
escribe:
    @echo ;
    @echo VERSION: $(VERSION);
    @echo AUTHOR: $(AUTOR);
    @echo NAME:  $(NOMBRE);
    @echo ;

#Enlazado con las clases y generacion del ejecutable
principal: $(OBJETOS)
    $(COMPILADOR) -o $(NOMBRE) $(OPCIONES) $(MAIN) $(OBJETOS) $(LIBRERIAS)

#Realiza el compilado de las clases
$(OBJETOS) : %.o : %.cpp %.h
    $(COMPILADOR) -c $(BANDERAS) $< -o $@ 

Aquí se imprimen los datos del programador y del programa, además de realizar la compilación en 2 partes. Dado que esta escrito en castellano, creo que no será dificil de entender que es lo que hace, pero explicaré una parte concreta que puede ser la más liosa.

Al final del fichero se observa como se hace referencia a unos %.o %.cpp %.h En realidad, esto hace que se compilen los ficheros cuyos nombres correspondan a los que están en la lista OBJETOS, y cuyas extensiones sean .cpp .h

Este Makefile es para un proyecto de C++. La sección LIBRERIAS se indica para especificar que librerías se usan dentro de nuestro código fuente, en este caso las de matemáticas -lmath y las de posix -lpthread (necesarias para programar con hilos y que espero poder explicar en un futuro). Pero si en tu proyecto no se hace uso de ninguna librería, no es necesario indicar nada.

Si tu proyecto tiene algunos ficheros que solo tienen .cpp y no su correspondiente .h, tendría que añadirse a mano en la seccion principal, escrito trás $(MAIN). Si se observa detenidamente, con unas simples sustituciones se obtienen sentencias similares a:  

g++ -o -O2 bloguero main.cpp utm.o poli.o bloguer.o -lm -lpthread

Es posible insertar otras opciones, que hacen referencia a la localización de ficheros de cabecera .h que no se encuentran en el habitual /usr/local/include ¿Cómo lo hacemos? indicando lo siguiente: -I ruta_include Ejem. -I /opt/include

Por último mencionar la opción que ayuda al compilador (si somos estrictos al enlazador) a encontrar librerías que no se encuentran instaladas en el lugar por defecto: -L ruta_librería Ejem. -L /opt/lib

Para finalizar, decir que el fichro Makefile debe encontrarse en el mismo directorio donde están los fuentes de tu programa, y para ejecutarlo solo hay que escribir en el terminal: ~$ make  ó ~$make all

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++








Taller C/C++ GNU/Linux. Preparación del entorno.

Dado que tengo interés en publicar algo a modo de taller relacionado con la placa Raspberry, he creido oportuno empezar con unos pequeños tutoriales para la programación en C/C++ bajo GNU/Linux. Esto no quiere decir que todo lo que vaya a escribir sea efectivo en Raspberry, pero si será aplicable a la mayor parte de las distribiciones Debian.

Como se trata del primer tutorial, empezaré por lo más básico, la preparación del entorno Linux para empezar a desarrollar.

Lo primero es instalar los paquetes necesarios, en un terminal escribimos:

~$ sudo -s apt-get update
~$ apt-get install build-essential
~$ apt-get install g++

Con esto es suficiente para empezar, pero para ayudar a programar algunos son gustosos de usar IDEs que ayuden a tareas como las de autocompletar, o la generación de un makefile de forma automática.

Yo personalmente suelo usar siempre un editor de texto normal, bien sea gedit adaptado, kate, o el nano (hay quien usa vi), pero  los más recomendados bajo mi punto de vista son anjuta, geany, kdevelop, netbeans y eclipse con el plugin de C++. Los 2 últimos IDEs mencionados posiblemente sean los más completos, pero a la par son los que más recursos consumen.

viernes, 20 de julio de 2012

Decepción con DELL y Gorilla Glass

Hace tiempo que soy fan de los cristales Gorilla glass, y también fan de windows phone gracias al Dell Venue Pro que adquirí el año pasado.

Disfrutaba de estas maravillas de la tecnología pese a que el Venue pro queda algo corto en el apartado de GPU y su cámara era de pobre calidad. El teclado, la pantalla y SO me hacían disfrutar del móvil como no lo había conseguido con ningún Android. Pero de la noche a la mañana, y nunca mejor dicho, este sueño idílico se rompio en mil pedazos.

Uso habitualmente los móviles como radio para entretenerme mientras concilio el sueño, lo llevo haciendo desde mi primer symbian y se hizo una característica indispensable. Como consecuencia de este uso pongo mis teléfonos bajo la almohada y por desgracia hace unas semanas hubo un percance que jamás me pude imaginar.

Por la mañana al despertar, encontré el DELL Venue Pro en el suelo, evidentemente cayo desde la cama. Ahora viene la gran sorpresa, LA PANTALLA ESTABA ROTA!!!!! no hablo de la OLED, sino del cristal exterior, la Gorilla glass. Me quede totalemtne flasheado y aún no me he recuperado. 

¿Cómo es posible que la pantalla más famosa del mercado por su resistencia, se haya roto en una caída de 60 cm?  

Se me han caído varias veces móviles de todo tipo y todas las gamas. No es que sea un descuidado, pero es inevitable que alguna vez se te caiga uno. Ninguna de estas veces se me ha roto ninguna pantalla pese a que las alturas han sido cercanas al metro. 

Lo mejor de este asunto es que estando el teléfono en garantía, los de Expansys me aseguran que DELL no se hace cargo de la garantía ya que la rotura ha sido provocada por una caída. Les he insistido en que la pantalla es una Gorilla glass, y que se trata de una especificación del móvil extraordinaria que de alguna manera debe ser respaldada por la empresa. Es como decir que tienes el procesador que menos consume, pero resulta que se bebe las baterías del móvil y te digo que no me responsabilizo del consumo. 

No se si Expansys me ha tomado el pelo o DELL es una empresa de dudosa recomendación por incumplimiento de garantías, pero me parece ridículo el asunto. ¿De verdad DELL no se hace responsable de mi Gorilla glass? ¿Resulta que las Gorilla glass realmente son un engañabobos? (lo que quiere decir que he sido un bobo)

Muestras de la pantalla:



¿Debo indignarme o están en posesión de la razón?

Para quien quiera saber con que móvil sobrevivo, es con un Nokia C6-00. He de decir que ningún nokia me ha llegado a decepcionar, salvo alguno no symbian y que evidentemente asumía que sería de dudosa calidad.  

miércoles, 11 de julio de 2012

RASPBERRY PI

Hoy he recibido mi placa Raspberry Pi. Intuyo que me encuentro entre los primeros poseedores de PC con procesador ARM11 en España. Tras muchos problemas con el conector hembra de RJ-45, la certificación de CE, y otros retrasos por diseño, fabricación y distribución por el abrumador éxito de este pequeño hardware que limitaron el número de unidades a una por comprador, parecía imposible que este momento llegara.

El precio final de la Raspberry comprada en RS Amidata y con los portes 24Horas por DHL finalmente ha sido de unos 40 euros. Esta claro que esta lejos de lo que se prometio para el precio del modelo más económico, pero otro de los problemas que se encontró esta maravilla de la tecnología obligo a la subida de precios y a comercializar el modelo B como modelo único pese que al principio este sería el hermano mayor de la gama.

A medida que avance en mis proyectos con este micro PC, iré añadiendo entradas a este por lo general abandonado blog.

Un saludo.