Diseño de Sistemas Informáticos Industriales Apuntes de Bibliotecas y componentes Licencia Ingeniería Técnica Industrial (Electrónico) Departamento de Informática de Sistemas y Computadores Escuela Técnica Superior de Ingeniería del Diseño bibliotecas_y_componentes_r05.odt Contenido 3. Bibliotecas y componentes.......................................................................................................3 3.1 Introducción.......................................................................................................................3 3.2 Objetivos............................................................................................................................3 3.3 Esquema.............................................................................................................................3 3.4 Bibliotecas estáticas y dinámicas........................................................................................3 3.1.1 Bibliotecas en Microsoft Windows..............................................................................4 3.1.2 Bibliotecas en sistemas *nix (Linux, MacOS, Android, ...).........................................5 3.1.3 Uso de bibliotecas en Qt..............................................................................................5 3.5 Tecnologías de componentes..............................................................................................6 3.5.1 Componentes VCL (Windows)....................................................................................6 3.5.2 Componentes ActiveX (Windows)..............................................................................7 3.5.3 Componentes Qt widgets (multiplataforma)................................................................7 3.5.4 Componentes GTK widgets (Unix, algo para Windows).............................................7 3.1.4 Componentes wxWidgets (multiplataforma)...............................................................8 3.6 Resumen.............................................................................................................................8 3.7 Bibliografía y enlaces.........................................................................................................8 3.8 APÉNDICE: Instalación de componentes en Borland C++ Builder...................................9 3.8.1 Componentes VCL......................................................................................................9 3.8.2 Componentes ActiveX...............................................................................................10 3.Bibliotecas y componentes 3 BIBLIOTECAS Y COMPONENTES 3.1INTRODUCCIÓN La práctica totalidad de las aplicaciones informáticas se desarrollan apoyándose en el uso de bibliotecas (vulgarmente llamadas librerías). En muchos entornos de desarrollo de aplicaciones modernos, hay una evolución de este principio que se suele basar en explotar la idea de "componente" (o "componente visual"). Las bibliotecas y los componentes son piezas de software preparadas para resolver un determinado problema y que "exponen" un API (Applicattion Program Interface) para que el programador la pueda explotar. Buscando un símil del bricolaje, podemos considerar a una bombilla como un componente que es fácil de usar y del que no se necesita conocer sus interioridades para aprovecharlo. Esta unidad está pensada para trabajarla de forma lineal, pero acudiendo, en puntos adecuadamente indicados, a fuentes externas y a la bibliografía. 3.2OBJETIVOS Comprender el principio de la programación por bibliotecas y componentes y sus ventajas. Conocer distintas tecnologías de bibliotecas y componentes. Acostumbrarse a localizar, instalar y utilizar componentes de terceras partes. Adquirir sentido crítico en la selección de tecnologías bibliotecas y componentes. 3.3ESQUEMA El esquema de la unidad coincide con el desarrollo ordenado de los objetivos y que se plasman en la correspondiente tabla de contenidos. 3.4BIBLIOTECAS ESTÁTICAS Y DINÁMICAS Las bibliotecas son piezas de software que pueden ser empleadas por otras aplicaciones. A su vez, unas bibliotecas se apoyan en otras. 4 COMPONENTES Y LIBRERÍAS En C/C++, muchas de las funciones que se emplean (sin(), printf(), …) están contenidas en bibliotecas que se enlazan sin que el programador lo perciba. Pero hay muchísimas bibliotecas externas que pueden ser incorporadas a nuestras aplicaciones. Para que estas piezas puedan usarse, es necesaria una etapa de “enlazado” (linking) de la aplicación con las librerías necesarias. En general, se suele distinguir entre dos grupos de bibliotecas: las estáticas y las dinámicas. • Estáticas: Una biblioteca estática es una pieza de código que se incorpora a la aplicación cuando es enlazada, formando una pieza única e inseparable. Se dice entonces que el enlazado es en “tiempo de compilación”. • Dinámicas: Una biblioteca dinámica es una pieza de código que permanece separada de la aplicación, y que es enlazada automáticamente cada vez que se ejecuta la aplicación. Se dice entonces que el enlazado es en “tiempo de ejecución”. Cada tipo de biblioteca tiene sus ventajas e inconvenientes. Así, a bote pronto: Tipo Ventajas Inconvenientes Biblioteca estática Forma parte de la aplicación. Ocupa más espacio. Biblioteca dinámica Ocupa menos espacio. La aplicación falla si no se la Se puede actualizar con inde- encuentra. pendencia de la aplicación. Más archivos mareando. 3.1.1BIBLIOTECAS EN MICROSOFT WINDOWS En Windows, las bibliotecas estáticas suelen estar en archivos con la extensión .obj o .lib. Para las bibliotecas dinámicas se suelen usar archivos contenedores con la extensión .dll (Dynamic Linking Library), aunque muchas veces se utilizan otras extensiones. Para que una aplicación con enlazado dinámico encuentre la biblioteca dinámica, debe se guir unas reglas bastantes complejas. En general, la aplicación busca la biblioteca siguiendo el siguiente orden: • El directorio donde está. • Los directorios que se le indiquen a la aplicación con la función kernel32 SetDllPath() • Los directorios indicados en el registro del sistema (C:\Windows, C;\windows\system32\, …). • Los directorios indicados en la variable de entorno PATH. • Etc. En Windows, el problema de la localización y compatibilidad de las bibliotecas dinámicas se conoce como “DLL hell” (ver http://en.wikipedia.org/wiki/DLL_hell si es necesario resolverlo). COMPONENTES Y LIBRERÍAS 5 3.1.2BIBLIOTECAS EN SISTEMAS *NIX (LINUX, MACOS, ANDROID, ...) En *nix, las bibliotecas estáticas suelen estar contenidas en archivos con la extensión .o ó .lib. Para las bibliotecas dinámicas, se suele utilizar la extensión .so (shared object) seguida de una numeración que indica la versión de la biblioteca. Como en Windows, se usan reglas para la localización de las bibliotecas, pero son bastante más estrictas e impiden ciertas cosas que refuerzan la seguridad y fiabilidad del sistema. En general, las librerías del sistema están en /lib, después en /usr/lib , etc. La manera de localizar bibliotecas en Unix suele forzar a colocarlas siempre en las rutas específicas, por lo que dichas rutas suelen contener una cantidad enorme y caótica de archivos. 3.1.3USO DE BIBLIOTECAS EN QT En general, para que cualquier entorno de programación para C/C++ pueda hacer uso de las bibliotecas se debe cumplir que: • Exista un archivo de cabecera (.h) con los prototipos. • Si la biblioteca es estática. Hace falta ella misma. • Si la biblioteca es dinámica, hace falta ella misma y un archivo con las definiciones (.lib, o .a), o que la propia aplicación se encargue de cargar la biblioteca cuando lo desee. En Qt, el lugar adecuado para indicar la información anterior es el archivo de proyecto (.pro). En el se pueden incorporar las siguientes etiquetas: • INCLUDEPATH: Para introducir rutas de búsqueda de archivos de cabecera. Los que se ponen entre “<>”. Por ejemplo, #include <stdio.h> • LIBS: Para introducir opciones de búsqueda y de carga de bibliotecas. A destacar que para el compilador gcc (el nuestro), la opción -L se usa para especificar rutas de búsqueda y la opción -l para especificar librerías. Estas etiquetas se pasan después directamente al compilador de C que haya por debajo. Como ejemplo de uso, el siguiente fragmento de archivo de proyecto corresponde a las opciones para incluir las bibliotecas NIDAQmx para sistemas de adquisición de datos de la empresa National Instruments. En este caso, la plataforma destino es Microsoft Windows. # configuración para National Instruments NIDAQmx # en Windows con Qt LGPL (compilador mingw) win32 { # añadimos la ruta para localizar la cabecera de la tarjeta INCLUDEPATH += "C:/Archivos de programa/National Instruments/NI­DAQ/DAQmx ANSI C Dev/include" # añadimos la ruta de busqueda de las bibliotecas (opción ­L) 6 COMPONENTES Y LIBRERÍAS LIBS += ­L"C:/Archivos de programa/National Instruments/NI­DAQ/DAQmx ANSI C Dev/lib/msvc" # añadimos la biblioteca "NIDAQmx.lib" quitando partes del nombre del archivo, (opción ­l) LIBS += ­lNIDAQmx } 3.5TECNOLOGÍAS DE COMPONENTES Las herramientas de desarrollo más modernas suelen basar su filosofía en los componentes reutilizables. Embarcadero/Borland C++ Builder es un ejemplo destacable de esta manera de trabajo, y las virtudes de esta filosofía se han podido ver en cursos pasados, pues han permitido desarrollar aplicaciones potentes sin esfuerzo. C++ Builder dispone de una gran cantidad de componentes en su paleta que permiten hacer la mayor parte de las aplicaciones de propósito general. En el caso de que no exista un componente específico para resolver un determinado problema, podemos recurrir a escribir/buscar un fragmento de código que lo resuelva o intentar encontrar un componente de terceras partes. La ventaja de usar un componente es que muestra una interfaz sencilla al usuario, ocultando las complejidades del problema a resolver. Esta ventaja permite explotar complejas tecnologías a programadores no expertos. La tecnología de componentes no es exclusiva, ni mucho menos, de Borland C++ Builder. En este tema se pretende echar un vistazo a la posibilidad de encontrar componentes de terceras partes para resolver problemas concretos y hacerlo en C++ Builder o en cualquier otro entorno (Nokia Qt, Microsoft Visual Basic, Java, Borland Dephi, National Instruments LabView ...). Borland C++ Builder cuenta con una importante paleta de componentes desarrollados con el propio entorno, pero es posible incorporar nuevos componentes que cumplan nuestros requisitos específicos. Dos tipos principales de componentes son soportados en Borland C++ Builder: los componentes VCL , los componentes CLX y los componentes ActiveX. En el mercado hay componentes disponibles para una gran variedad de tareas, por lo que es fácil desarrollar aplicaciones para casi cualquier cometido. 3.5.1COMPONENTES VCL (WINDOWS) El modelo nativo de componentes de C++ Builder se basa en la “Visual Component Library” (VCL) desarrollada por Borland para Delphi (lenguaje Object Pascal). En esta tecnología, los componentes son clases C++ que deben derivar de la clase TComponent u otra clase descendiente de ésta. Para permitir la capacidad de poder editar visualmente, en tiempo de diseño, las propiedades del componente, el lenguaje C++ Builder tiene extensiones no estándar. En la definición de la clase hay una nueva sección denominada __published donde se pueden declarar propiedades, eventos y funciones. Los componentes VCL sólo pueden usarse con Borland C++ Builder y Borland Delphy. COMPONENTES Y LIBRERÍAS 7 Crear un nuevo componente en C++ Builder es sencillo, pero más sencillo es usar los ya disponibles o aprovechar los desarrollados por terceras partes. La ventaja de esta tecnología es que, al ser código C/C++ o Pascal, se compila junto a la aplicación y el resultado es un código muy eficiente. 3.5.2COMPONENTES ACTIVEX (WINDOWS) Un modelo de componentes destacado es Microsoft COM (Component Object Model), exclusivo de Microsoft y en el que se basa el sistema operativo Windows. Esta tecnología tiene varias ramas/evoluciones que pueden sonar más o menos, como DCOM, OLE, OCX, ActiveX, etc. Los componentes COM pueden almacenarse, básicamente, en dos formatos: en una librería de enlace dinámico o como parte de un ejecutable. En ambos casos puede haber varios componentes dentro del mismo archivo. No todas las variantes de COM pueden utilizarse arrastrando y soltando en un formulario y editar fácilmente sus propiedades. Entre ellas, destacar ActiveX, que incorporan interfaces específicos que añaden mayor funcionalidad y sí pueden colocarse y editarse visualmente en un for mulario de un entorno como Borland C++ Builder. Los componentes ActiveX tienen como importantísima ventaja el hecho de que pueden ser utilizados por cualquier aplicación, basta con instalarlos y “registrarlos” en el sistema operativo. En realidad, los componentes ActiveX son ejecutables contenidos en librerías de enlace di námico (.dll, .ocx) que publican una interfaz que sigue unas normas estrictas (por desgracia, “casi” estrictas) para permitir a otras aplicaciones cargarlos y saber que métodos, propiedades y eventos son públicos. El hecho de que los componentes ActiveX puedan ser usados por entornos como: Power builder, Borland Delphi, Borland C++ Builder, Microsoft Visual Basic, Microsoft Visual C++, Microsoft Office (mediante Visual Basic for Applications), Microsoft Internet Explorer (mediante VBScript of JavaScript), Microsoft Visual J++, etc. hace que terceras empresas desarrollen y vendan componentes con esta tecnología para infinidad de propósitos. Para poder utilizar una aplicación que emplee componentes ActiveX en un ordenador distinto al empleado para desarrollar la aplicación, será necesario instalar y registrar previamente el componente ActiveX. Eso es lo que suelen hacer los programas de instalación de aplicaciones. En resumen la gran ventaja de los componentes ActiveX es que se pueden utilizar en prácticamente cualquier herramienta de desarrollo actual ... para Microsoft Windows, claro. 3.5.3COMPONENTES QT WIDGETS (MULTIPLATAFORMA) Ya lo estamos probando con la práctica de este año. Quizá debería ser widgets para Designer o algo así. Para otro año. 3.5.4COMPONENTES GTK WIDGETS (UNIX, ALGO PARA WINDOWS) Ver http://www.gtk.org/ 8 COMPONENTES Y LIBRERÍAS 3.1.4COMPONENTES WXWIDGETS (MULTIPLATAFORMA) 3.6RESUMEN Los nuevos programadores se han acostumbrado rápidamente a las herramientas de desarrollo que se basan en “arrastrar y soltar”. Quizá sea esta la razón que ha llevado a muchas empresas a desarrollar tecnologías que utilicen este símil para el desarrollo de aplicaciones, tanto desde el punto de vista de la interfaz de usuario como de cualquier aspecto del desarrollo del software. Como se ha visto en el tema, hay distintas tecnologías de componentes y elegir acertada mente una tecnología puede suponer el éxito o fracaso de nuestra aplicación, tanto para un desarrollo puntual como para garantizar una futura mantenibilidad. Por nuestra experiencia, el decantarse por productos/componentes cerrados es una inversión peligrosa a largo plazo. Es por ello, que, como idea resumen de la unidad, es aconsejable elegir componentes con tecnologías ampliamente aceptadas (por ejemplo, ActiveX) y, si es posible, de código abierto. 3.7BIBLIOGRAFÍA Y ENLACES • Definición de biblioteca en Wikipedia: http://en.wikipedia.org/wiki/Library_ %28computer_science%29 Para poder localizar componentes, la mejor fuente es Internet. Se dan a continuación algunas direcciones donde se pueden localizar componentes de distintas tecnologías. Destacar que hay mucha más variedad en componentes ActiveX por el hecho de poder utilizarse en cualquier entorno de desarrollo actual para Windows. Dirección http://www.iocomp.com http://www.arrakis.es/~rporcar/ http://delphi.icm.edu.pl http://www.lohninger.com Comentarios ActiveX, VCL,... Muchos componentes para procesos industriales. Versión de evaluación. VCL gratuitos. Información adicional en castellano. Club de forofos. Recopilatorio de componentes VCL y ActiveX, información y herramientas varias gratuitas. Incluyendo componentes para E/S. Componentes VCL para gráficas, análisis matemáticos, estadísticos, gestión GIS, etc. Hay una versión gratuita reducida. COMPONENTES Y LIBRERÍAS 9 Dirección http://www.vclcomponents.com http://www.activex.com http://www.active-x.com http://www.lmd.de http://www.tmssoftware.com/ http://www.componentsource.com http://www.abaecker.de http://sourceforge.net/projects/giw Comentarios Recopilatorio de distintos tipos de componentes. VCL, ActiveX, ... Recopilatorio de componentes ActiveX. Recopilatorio de componentes ActiveX. Varios componentes VCL. Versíon gratuita reducida. ActiveX, VCL,... Muchos componentes para procesos industriales y otros cometidos. No tienen versión de prueba Recopilatorio de distintos tipos de componentes. VCL, ActiveX, ... VCL,... Muchos componentes para procesos industriales. Versión de evaluación. Componentes GTK para instrumentación. Más enlaces en: http://www.disca.upv.es/aperles/faq_builder/faq_builder.html http://www.disca.upv.es/aperles/linux_industrial/linux_industrial.html Se sugiere acudir a “forjas” de sofware para encontrar componetes de código abierto. Por ejemplo: sourceforge gitorous github etc. 3.8APÉNDICE: INSTALACIÓN DE COMPONENTES EN BORLAND C++ BUILDER 3.8.1COMPONENTES VCL A partir de la versión 3.0 de Borland C++ Builder, los componentes se instalan como "paquetes" (packages). Para instalar o eliminar componentes desarrollados por nosotros o por terceras partes hay que seguir los siguientes pasos: 1. Si se está instalando un nuevo paquete, copiar los ficheros del paquete a un directorio local. Si el paquete se suministra con ficheros .BPL, .BPI, .LIB, .OBJ, y cabeceras asegurarse de copiarlos todos. El directorio donde se almacene el .BPI y los ficheros de cabecera (y .LIB o .OBJ si se incluyen con la distribución) deben estar en el camino de busqueda de las librerías de C++ Builder (Project -> Options->Directories). 10 COMPONENTES Y LIBRERÍAS 2. Elegir "Component->|Install Packages", o "Project->Options" y seleccionar la pestaña "Packages". En “Design packages” aparece una lista de los paquetes disponibles. • Para instalar un paquete en el entorno, marcar al lado del paquete deseado. • Para desinstalarlo, desmarcarlo. • Para ver una lista de los componentes incluidos en un paquete instalado, seleccionar el paquete y elegir "Components". • Para añadir un paquete a la lista, elegir "Add" y navegar en la ventana "Add Design Package" en el directorio donde están los ficheros .BPL (ver paso 1). Elegir un fichero .BPL y pulsar en "Open". • Para borrar un paquete de la lista, elegir el paquete y pulsar "Remove". 3. Pulsar "OK". Los componentes del paquete son instalados en la paleta de componentes en las páginas especificadas internamente por el paquete. Si los componentes los hemos escrito nosotros o llegan en forma de código fuente es necesario crear y compilar un paquete. Estos pasos se realizan automáticamente al instalar el componente, componenete que estará definido en un fichero .PAS o .CPP. 3.8.2COMPONENTES ACTIVEX Antes de desarrollar aplicaciones con un control ActiveX es necesario instalarlo y registrarlo en Windows. Las instrucciones de instalación son específicas del control e independientes de C++ Builder. Una vez instalado el componente es necesario "importarlo" en el entorno C`++ Builder siguiendo estos pasos: 1. Elegir "Component|Import ActiveX Control". 2. Seleccionar el tipo de librería de la lista. 3. La ventana muestra todas las librerías registradas que definen controles ActiveX (un subconjunto de todas las librerías mostradas por el cuadro "Import Type Library"). Si la librería no está en la lista, elegir el botón "Add", localiza y selecciona el fichero con la librería y elige OK. Esto registra la librería, dejándola disponible. Entonces habrá que repetir el paso 2. Destacar que la librería puede ser independiente (.TLB, .OLB), o un servidor ActiveX (.DLL, .OCX). 4. Si no se desea instalar el control en la paleta de componentes, elegir "Create Unit". Esto genera el módulo TypeLibName_TLB y el módulo TypeLibName_OCX. Esto hace que se salga del cuadro "Import ActiveX". 5. Si se quiere instalar el control ActiveX en la paleta de componentes, selecciona la página de la paleta (Palette) en el que este componente se meterá y elegir entonces instalar. Esto genera los módulos TypeLibName_TLB y TypeLibName_OCX, de igual manera que el botón "Create Unit", y entonces muestra el cuadro de "Install component", permitiendo especificar en que paquete debe meterse el componente (ya sea uno existente o uno nuevo). COMPONENTES Y LIBRERÍAS 11 Cuando se salga del cuadro "Import ActiveX", los nuevos módulos TypeLibName_TLB y TypeLibName_OCX aparecen en el directorio especificado por el "Unit dir name control". El módulo TypeLibName_TLB contiene declaraciones para los elementos definidos en la librería de tipos. El módulo TypeLibName_OCX contiene el adaptador generado para usar el control ActiveX. Si se ha instalado el adaptador del control, un control ActiveX aparece ahora en la paleta de componentes. Se puede usar ahora el "Object Inspector" para establecer propiedades o escribir manejadores de eventos para este control. Si se añade el control a un formulario o a un "módulo de datos" (data module) y se pulsa con el botón derecho, se puede ver la página de propiedades del control en tiempo de diseño (si éste lo soporta). En la paleta de componentes hay una pestaña ActiveX en la que se han importado unos cuantos componentes como ejemplo.