Вы находитесь на странице: 1из 5

1.4.

4b Libreras: generalidades

Nota: tenga en cuenta que este captulo no trata de caractersticas que puedan considerarse estndar del lenguaje C++, sino de peculiaridades (aunque muy extendidas) de la construccin de aplicaciones. Tenga en cuenta tambin que en informtica, el concepto "Librera" es muy general, y no est asociado a ningn lenguaje concreto (aunque C y C++ las utilizan ampliamente). De hecho, es posible y frecuente, utilizar en un lenguaje libreras que han sido escritas en otro. Por ejemplo, buena parte de las libreras de C++Builder, la denominadas VCL "Visual Component Library", han sido desarrolladas en Pascal ( 4.11.8b).

1 Sinopsis Al tratar de la construccin de un programa ( 1.4) sealamos que en ocasiones no se desea construir un ejecutable, al menos no en el sentido tradicional del trmino, sino unalibrera, y que estas libreras son trozos de cdigo que contienen alguna funcionalidad pre-construida que puede ser utilizada por un ejecutable. Por supuesto, las libreras contienen en su interior variables y funciones. Si como suponemos son libreras C++, lo ms probable es que estas variables y funciones estn encapsuladas en forma de clases ( 4.11). Observe que la idea central de librera es precisamente la de ser un mdulo de software preconstruido -generalmente por terderos- para cuya utilizacin no es necesario conocer los detalles ntimos de su funcionamiento, sino su interfaz. Es decir, que respuestas nos puede dar y cmo hay que preguntar -a la librera- para obtenerlas. En general, el trmino librera se utiliza para referirse a un conjunto de mdulos objeto .obj / .o (resultados de compilacin) agrupados en un solo fichero que suele tener las extensiones .lib, .bpl [6] .a, .dll, etc. Estos ficheros permiten tratar las colecciones de mdulos como una sola unidad, y representan una forma muy conveniente para el manejo y desarrollo de aplicaciones grandes, adems de ser un concepto muy frtil para la industria del software, ya que permiten la existencia de las libreras de los propios compiladores ( 5) y de un mercado de utilidades y componentes adicionales. Son las denominadas libreras 3pp (de terceras partes), en referencia a que no son incluidas de forma estndar con los compiladores ni creadas por el programador de la aplicacin. En este sentido el software se parece a cualquier otro mercado de componentes. Adems de las libreras ms o menos extensas que acompaan a los compiladores, pueden adquirirse otras, que permiten aadir a nuestros programas las funcionalidades ms diversas sin necesidad de ser un experto en cada rea de la programacin y sin necesidad de que tengamos que estar reinventando la rueda constantemente. Si quiere una opinin autorizada -en ingls- sobre la filosofa de uso e importancia de las libreras en C++, puede consultar este documento del Sr. Stroustrup: Abstraction, libraries, and efficiency in C++

2 Tipos En lo que respecta al lenguaje C++, existen dos tipos fundamentales de libreras: estticas y dinmicas, que aunque comparten el mismo nombre genrico "librera", utilizan mecanismos distintos para proporcionar su funcionalidad al ejecutable. En ambos casos es costumbre, que junto a las libreras propiamente dichas (ficheros .lib, .a, .dll etc), se incluya un fichero .h denominado "de cabecera" ( 4.4.1), porque es tradicin utilizar las primeras lneas del programa para poner las directivas #include ( 4.9.10g) que los incluirn en el fuente durante la fase

de preproceso ( 1.4). Este fichero contiene las declaraciones de las entidades contenidas en la librera, as como las macros y constantes predefinidas utilizadas en ella, de forma que el programador solo tiene que incluir el correspondiente fichero .h en su aplicacin para poder utilizar los recursos de la librera en cuestin (recuerde que en C/C++ es imprescindible incluir la declaracin de cualquier funcin o clase antes de su utilizacin 4.1.2). Este sistema tiene la ventaja adicional de que proporciona al usuario la informacin mnima para su uso. Es decir, la "interfaz" de las funciones o clases que utilizar. En el caso de funciones esto se concreta en el prototipo ( 4.4.1); en el caso de clases, en la especificacin de sus mtodos y propiedades pblicas.

2.1 Libreras estticas Denominadas tambin libreras-objeto, son colecciones de ficheros objeto (compilados) agrupados en un solo fichero de extensin .lib, .a, etc. junto con uno o varios ficheros de cabecera (generalmente .h). Nota: una posicin extrema la constituyen aquellas libreras en las que toda la funcionalidad se ha incluido en el fichero de cabecera .h, en cuyo caso no existen los mdulos compilados .lib, .a, etc. Es el caso de la Librera Estndar de Plantillas STL ( 5.1) que est compuesta casi exclusivamente por ficheros de cabecera. No obstante, lo anterior representa un caso extremo que suele ser evitado, ya que por lo general, los autores incluyen en los ficheros de cabecera la informacin mnima indispensable para utilizar la librera (la interfaz), incluyendo la operatoria en forma de ficheros compilados. La razn no suele ser otra que proteger la propiedad intelectual (el "know how"). Durante la construccin de la aplicacin, el preprocesador incluye en los fuentes los ficheros de cabecera. Posteriormente, durante la fase de enlazado, el linker incluye en el ejecutable los mdulos correspondientes a las funciones y clases de librera que hayan sido utilizadas en el programa, de forma que el conjunto entra a formar parte del ejecutable. De ah su nombre: Libreras enlazadas estticamente [1]. Dejando aparte consideraciones de comodidad y rapidez, el resultado de utilizar una de tales libreras no se diferencia en nada al que puede obtenerse escribiendo en al fuente las funciones o clases correspondientes y compilndolas como un mdulo ms de nuestra aplicacin. Nota: genralmente los compiladores disponen de herramientas especficas para la creacin de libreras estticas. Por ejemplo, la del compilador Borland C++ es el ejecutable TLIB.EXE ( 1.4.0w1); las de GNU se denominan ar y ranlib. Como tendremos ocasin de ver en los ejemplos, tambin pueden crearse mediante opciones especficas en la orden de compilacin.

2.1.1 Diccionario Junto con los mdulos .obj que las componen, las libreras estticas incluyen una especie de ndice o diccionario con informacin sobre su contenido. Este ndice contiene los nombres de los recursos pblicos de los distintos mdulos (que pueden ser accedidos desde el exterior) y su direccin. Estos nombres deben ser distintos para evitar ambigedades durante el enlazado, y sirven para incrementar la velocidad de enlazado cuando el "Linker" debe incluir alguno en un ejecutable. Nota: cuando se crea una librera esttica a partir de uno o varios ficheros relocalizables (objetos), el proceso de incluir esta tabla o diccionario de smbolos puede ejecutarse en un solo paso o en dos, aunque siempre en el momento de crear la librera. Por ejemplo, tlib de Boland crea la librera y la tabla en un solo proceso. En cambio, ar de GNU puede crear la librera y posteriormente aadir la tabla

(esto ltimo puede tambin hacerse con ranlib). Cuando se aade un nuevo mdulo a una librera existente, la misma herramienta que aade el contenido, se encarga de actualizar el ndice.

2.2 Libreras dinmicas Otra forma de aadir funcionalidad a un ejecutable son las denominadas libreras de enlazado dinmico (repasar en 1.4.4 el significado de "enlazado dinmico"), generalmente conocidas como DLLs, acrnimo de su nombre en ingls ("Dynamic Linked Library"). Estas libreras se utilizan mucho en la programacin para el SO Windows. Este Sistema contiene un gran nmero de tales libreras de terminacin .DLL, aunque en realidad pueden tener cualquier otra terminacin .EXE, .FON, .BPI, .DRV etc. Cualquiera que sea su terminacin, de forma genrica nos referiremos a ellas como DLLs, nombre por el que son ms conocidas. Nota: la programacin tradicional de aplicaciones Windows utilizando la API del Sistema ( 1.7.1) es en realidad una sucesin de invocacin a funciones contenidas en libreras de este tipo. En realidad este Sistema Operativo est constituido por un conjunto de DLLs; la mayora de los ficheros de disco asociados con el Sistema son de este tipo, y se ha llegado a afirmar que escribir una DLL es escribir una extensin del propio Windows ( PW2E Petzold p.878).

3 Diferencias: librera Esttica "versus" Dinmica Las diferencias ms relevantes de las libreras dinmicas respecto a las estticas son fundamentalmente dos: y Las libreras estticas quedan incluidas en el ejecutable, mientras las dinmicas son ficheros externos, con lo que el tamao de la aplicacin (nuestro ejecutable) es mayor en el primer caso que en el segundo. Esto puede ser de capital importancia en aplicaciones muy grandes, ya que el ejecutable debe ser cargado en memoria de una sola vez [3]. Las libreras dinmicas son ficheros independientes que pueden ser invocados desde cualquier ejecutable, de modo que su funcionalidad puede ser compartida por varios ejecutables. Esto significa que solo se necesita una copia de cada fichero de librera (DLL) en el Sistema. Esta caracterstica constituye la razn principal de su utilizacin, y es tambin origen de algunos inconvenientes, principalmente en sistemas como Windows en los que existen centenares de ellas.

Como consecuencia de las diferencias citadas se derivan otras. Por ejemplo: y Si se realizan modificaciones en los mdulos de una librera esttica, es necesario recompilar todos los ejecutables que la utilizan, mientras que esto no es necesario en el caso de una librera dinmica, siempre que su interfaz se mantenga. Como consecuencia de lo anterior, generalmente es ms difcil la depuracin y mantenimiento de aplicaciones que utilizan libreras dinmicas que las estticas, ya que en el primer caso, es necesario controlar qu versiones de los ejecutables (.EXE) son compatibles con qu versiones de las DLLs y de estas entre s, de forma que el usuario no utilice un versiones incompatibles de los ficheros que componen la aplicacin. Durante la ejecucin de un ejecutable, las libreras estticas que hubiesen intervenido en su construccin no necesitan estar presentes, en cambio las dinmicas deben estar en el mismo directorio o en el camino de bsqueda "Path" [7]. Las libreras estticas solo se utilizan en la fase de construccin del ejecutable. Las dinmicas se utilizan durante la ejecucin.

Los ejecutables que utilizan librera estticas solo incorporan los mdulos de aquellas que necesitan para resolver sus smbolos externos. Por contra, las libreras dinmicas deben ser cargadas en su totalidad aunque no solo se utilice una parte de su funcionalidad (no son divisibles). Las libreras estticas, que entran a formar parte indivisible del ejecutable, son cargadas con el proceso de carga de este. Las libreras dinmicas no necesariamente tienen que cargarse con la carga inicial (aunque pueden serlo). De hecho, una librera dinmica puede ser cargada bajo demanda en el momento en que se necesita su funcionalidad, e incluso puede ser descargada cuando no resulta necesaria. El mecanismo de enlazado esttico depende del compilador. El de enlazado dinmico depende del SO, de forma que manteniendo ciertas precauciones, las DLLs construidas con un lenguaje y un compilador pueden ser utilizadas por cualquier aplicacin.

4 Utilizar Libreras Desde la ptica del programador C++, el manejo de libreras comprende dos aspectos totalmente diferenciados: su utilizacin y quizs la construccin de alguna de ellas si nuestras aplicaciones son medianamente grandes. En cuanto al primer punto, es seguro que cualquier aplicacin por pequea que sea, utilice algunas de la Librera Estndar ( 5). Por ejemplo, cada vez que en su cdigo aparece una sentencia del tipo cout << "Hola mundo" << endl; est utilizando una librera esttica, y cada vez que en la programacin de una aplicacin Windows utiliza un mensaje del tipo MessageBox(NULL, "Hola mundo!", "Mi primer programa", MB_OK); est usando una librera dinmica. En cuanto a su construccin, si se dedica a esto de programar en C++, antes o despus pondr manos a la obra. Por cierto: existen empresas de software cuya principal actividad es precisamente fabricar y vender libreras (ya hemos indicado que el mercado de las 3pp es todo un "mundillo" dentro de la informtica). Cualquiera que sea el caso, tanto la utilizacin como la construccin, son diferentes segn se trate de libreras estticas o dinmicas. En las pginas que siguen se describen en detalle ambas situaciones. Empezaremos por una descripcin general de su funcionamiento, para continuar con la descripcin de los pasos necesarios para construirlas. A continuacin exponemos los detalles de su utilizacin, incluyendo un ejemplo de construccin de un ejecutable que utiliza los recursos de una librera. Inicio.

[1] Recordemos que en C++, uno de los significados del trmino "esttico" es algo que ha sido resuelto en tiempo de compilacin ( 1.4.4). [3] Existen utilidades que permiten compactar ("Squeeze") un ejecutable disminuyendo su tamao como fichero, lo que puede ser de utilidad a la hora de transportarlo (por redes por ejemplo). Pero incluso en estos casos, despus de cargados en memoria deben ser "expandidos" a su tamao normal y reacomodados en memoria segn un patrn definido por el SO.

[6] BPI; acrnimo de Borland Package Import Library. Un tipo especial de librera dinmica del citado compilador, que utiliza enlazado esttico con el ejecutable que las usa. [7] En el caso del compilador BC++, durante la construccin de un programa o librera, este "path" puede ser controlado mediante el comando de compilacin -L o de enlazado /L. Ms tarde durante la ejecucin (runtime) el "path" depende de las variables de entorno del sistema. En los programas para Windows caben tres opciones: poner las libreras especficas en el mismo directorio que el ejecutable (o un subdirectorio del anterior); en nuestra opinin esto sera lo recomendado. Otra opcin es ponerlas junto con el resto de libreras del sistema (Windows\System) o en un directorio particular cualquiera (no es aconsejable). v

Вам также может понравиться