Mostrando entradas con la etiqueta programación. Mostrar todas las entradas
Mostrando entradas con la etiqueta programación. Mostrar todas las entradas

jueves, 5 de febrero de 2009

Qt 4.5, LGPL 2.1 y templates C++

Traducido de: obsenthryl's

La noticia ya ha llegado a los titulares de un montón de sitios web. Pero esta entrada no trata sobre eso, empecemos leyendo el anuncio oficial:
Nokia se enorgullece de anunciar que con la salida de Qt 4.5 vas a poder usar Qt bajo la Lesser General Public License (LGPL) version 2.1. Cuando sea distribuida en Marzo del 2009, Qt estará disponible bajo tres licencias: Comercial, LGPL y GPL
Estamos hablando de un modelo tri-licencia, mencionando explicitamente que LGPL 2.1 no tendrá ninguna modificacion (lo mismo indica en otras secciones del mismo FAQ). En la FAQ relacionada encontramos:
Cual es la diferencia entre LGPL y GPL?

Ambas licencias son documentos complejos que requieren una cuidadosa lectura para apreciar las diferencias significantes entre ambas. Sin embargo, una explicación "por lo alto" es que la GPL requiere que cualquier trabajo derivado (ej: aplicaciones desarrolladas usando Qt) deben licenciarse bajo los terminos de la GPL. La LGPL es menos restrictiva y permite el desarrollo de aplicacions de código cerrado. Distribuiremos Qt bajo la version 2.1 de la licencia LGPL, además de continuar ofreciendo Qt bajo la version 3.0 de GPL.

Sí, requieren extremado cuidado en su lectura. Y también, en otra sección del anuncio:

Porque querría comprar una licencia comercial? Cual es la diferencia?

La licencia comercial de Qt incluye soporte por email, acceso a actualizaciones y te permite desarrollar software de código cerrado. La LGPL conlleva algunas restricciones relacionadas con la capacidad de los usuarios para relinkar librerias y otras restricciones que pueden imponer requerimientos de arquitectura con la que algunas organizaciones pueden no estar de acuerdo.
De acuerdo, buenas noticias para los que quieran usar la LGPLv2.1 con Qt4.5.
Pero lo que no he visto en la FAQ, son una seria de temas relacionados con la licencia LGPL 2.1 sin modificaciones propuesta. Uno de los temas tiene que ver con las templates de C++.
Aunque es cierto que Qt 4.4 por ahora, no usa templates para los signals y los slots, las usa para las clases contenedoras. Tiene una licencia LGPL v2.1 sin modificar -Asumo que es su intención, como puede entreverse en su FAQ y republicado en otros websites - en consideración el uso de templates C++ y de técnicas de "template metaprogramming" por código de terceros, cuando se instancian esas templates LGPL v2.1 en un modelo de licencia no LGPLv2.1?
Se sabe que la instanciación de templates en realidad anida el código dentro del código final del usuario de formas que trascienden lo especificado en una licencia LGPLv2.1 no modificada.

La experiencia de otros desarrolladores presentan una solución sencilla: LGPLv3 soluciona este tema.

La LGPL requiere que los usuarios sean capaces de reemplazar el código LGPL con una versión modificada; esto es trivial si la libreria en cuestión es una librería compartida escrita en C. Pero no hay forma de hacer eso con C++, donde la mayor parte de la librería consiste en funciones inline y templates, que se expanden dentro del código que usa la librería. Así que para permitir a la gente reemplazar el código de la librería, alguien que la use debería distribuir su propio código fuente, resultando la LGPL equivalente a la GPL.

El artículo original continua ahondando en los problemas de las "novedades" que ofrece C++ y el atraso de la LGPL v2.1 en este aspecto.

Sin embargo, parece que Nokia leyó el muy buen artículo y ha hecho saber que están trabajando en añadir una excepción a la LGPLv2.1 que solvente este asunto con las templates y funciones inline de C++.

Por ultimo aprovecho para decir que ya ha salido la Release Candidate de Qt4.5 para las diferentes plataformas:

miércoles, 25 de junio de 2008

Instalar QT con Code::Blocks

Ahora es el turno de jugar con QT /Cute/ (previamente lo hicimos con GTK y su dichosa instalación) y empezamos con lo más tedioso y es su instalación, que aunque no es tan complicada como la de GTK, tiene su miga.
QT
, para quienes no lo sepan es una librería con una interfaz en C++ que orientada a la creación de aplicaciones de ventana multiplataforma.

Recientemente (17 de junio 2008) Nokia ha comprado a Trolltech para potenciar aún más su faceta multi-sistema y continuar con QTopia (imagino para usarlo en sus nuevos teléfonos mobiles.

Remarco que este tutorial esta orientado para su instalación bajo windows, aunque en linux debería ser exactamente lo mismo.

La primera diferencia respecto a GTK la vemos al descargar la librería: nos viene toda en un mismo paquete; pues si bien GTK se apoya sobre otras librerías de terceros, QT es principalmente todo un bloque, por lo que a la hora de descargarlo suma un punto en facilidad (haz sitio para 120MB). Otra diferencia es la licencia de uso, no podemos usar QT para desarrollar aplicaciones comerciales (sin antes pasar por caja claro), aunque siempre podemos usar su librería. para proyectos opensource.

El link para la versión opensource lo tenéis aquí (v4.4):
http://trolltech.com/downloads/opensource

Una vez descargado el tocho de librería, lo descomprimimos alli donde queramos dejarla instalada.

Atención!: Recomiendo acortar el nombre del directorio a qt4.4, pues el nombre por defecto es demasiado largo y puede dificultar los siguientes pasos (bueno vale, no me gustan los nombres de directorios largos).

Para ejecutar el siguiente paso debemos tener instalado MinGW (Si usáis Code::Blocks, seguramente tengáis un directorio llamado MinGW dentro de su directorio de instalación).

Añadimos el directorio MINGW/bin a la variable de entorno PATH.
Por seguridad, crea también la variable QMAKESPEC con valor "win32-g++" (sin las comillas).
De esta manera forzamos a usar el compilador g++ en caso de tener más de uno instalado.

Abrid una consola y os dirigís al directorio donde hayáis descomprimido QT y ejecutáis:
configure

Esto empieza a compilar la aplicación qmake. Un poco de paciencia porque puede llegar a tardar un poquillo (5min-30min, mas incluso...).

Una vez compilado qmake, faltará ejecutar:
make
quién por fin empezará a compilar las librerías.
Si qmake tardó, agárrate porque esto puede llevar toda una tarde. Así que tranquilamente puedes salir a pasear al perro porque a menos que tengas un pc ninja te vas a aburrir mirando el proceso.

Ya compiló? Pues te recomiendo un ultimo comando:
make clean
esto eliminará archivos temporales creados durante el proceso (muuuuuchos MB).

Bien, ahora abre Code::Blocks y crea una nueva variable global:
Settings/Global variables

Llámala "qt".
  • Rellena el campo base con la ruta en donde se encuentra la libreria
  • Rellena los campos "include" y "lib" con la ruta a "include" y "lib" respectivamente.
  • En User-defined fields usa una nueva fila y rellénalo de esta forma:

    • Campo izquierdo: mkspecs

    • Campo derecho:$(#qt)/mkspecs

Con esto hemos creado una variable llamada "qt" que podemos usar a lo largo de las opciones de configuración de Code::Blocks para apuntar fácilmente a los directorios "include" y "libs".

Lo ultimo es crear un nuevo proyecto (consola o ventana, como mas guste, pero que sea C++).

Para compilar aplicaciones QT hay que usar el Makefile creado por qmake.
Para indicarlo:
Project/Properties/Project Settings
Marcamos la casilla "This is a custom Makefile".

Vamos a especificar los directorios donde se encuentra la librería:
Project/Build Options

Con el nombre del proyecto seleccionado en la parte izquierda de la ventana, entramos en la pestaña Search Directories:
En la subpestaña Compiler escribimos:
$(#qt.include)
Y en la subpestaña Linker:
$(#qt.lib)

Y ya tenemos todo el tinglado montado.
Hay que tener una cosa en cuenta, y es que antes de compilar hay que crear un archivo make con qmake. Qmake hace uso de los archivos de proyecto .pro. Estos archivos le indican a qmake que ficheros utiliza nuestro proyecto para poder compilar correctamente. Paradójicamente qmake puede crear nos uno automáticamente:
qmake -project
Siempre y cuando todo esté bien referenciado en el código fuente. Con el .pro creado, simplemente un:
qmake
creará el archivo makefile y ya podremos compilar sin problemas con Code::Blocks. Ten en cuenta que cada vez que añadas un nuevo fichero a tu proyecto (o quites uno) debes actualizar el archivo makefile. Ignoro si este proceso puede ejecutarse automáticamente desde Code::Blocks, pero seguiré investigando ;)

miércoles, 23 de abril de 2008

Listar archivos de un directorio con C/C++

En la aplicación que estoy trabajando actualmente me ha surgido la necesidad de listar los archivos existentes en un directorio dado y listarlos en un "combo box". Dado que estoy desarrollándola para Windows, era obvio buscar una solución para este sistema.

Lo que encontré fue lo siguiente:

HANDLE hFind;
WIN32_FIND_DATA w32fd;
hFind = FindFirstFile( "fonts/*.*", &w32fd );
vector archivos;
if( hFind!=INVALID_HANDLE_VALUE )
{
do
{
TCHAR* Tfilename = w32fd.cFileName;
if( filename.size()>3 )
{
archivos.push_back( filename );
}
}while( FindNextFile( hFind, &w32fd ) );
FindClose(hFind);
}

Esta solución funciona, aunque para mi gusto depende demasiado de las definiciones (chungas) de Microsoft.
Sin embargo, otro acercamiento mucho mas independiente del sistema sería la siguiente, que hace uso de la librería Glib, la cual forma parte de GTK+ y compone multitud de estructuras de datos y funciones preparadas para ser compatibles tanto en windows como en linux.

La solución al listado de los archivos contenidos en un directorio usando las funciones de Glib es la siguiente:


GDir* dir = g_dir_open( folder, 0, NULL );
const gchar* file;
if( !g_file_test( folder, G_FILE_TEST_IS_DIR ) )
{
g_error( "Error: Directory not found FFFFFFFFFFFFF" );
}
else
{
while( file=g_dir_read_name( dir ) )
{
cout << "Fichero encontrado: " << file << endl;
}
g_dir_close( dir );
}

En esta ocasión no dependemos de otra librería más que de glib, disponible tanto para Linux como para Windows. Además de una ganancia en la claridad del código, pues no se usa ninguna estructura extraña (de esas que tanto le gustan a Microsoft). Lo único raro que podemos ver es ese tipo de datos gchar (es simple y llanamente un char) y GDir la cual es una estructura de la que no nos tenemos que preocupar ya que de su manejo se ocupa completamente Glib.

Para más información sobre estas funciones: página de referencia.

miércoles, 9 de abril de 2008

Instalar GTK+

GTK+ es una librería escrita en C para la construcción de interficies gráficas con la peculiaridad que es multiplataforma, esto es, que con cambios mínimos es posible portar un programa de Windows a Linux (y viceversa). Al menos en lo que respecta a la interficie de usuario.