2.2.3. Uso de librerías

Ahora que ya conoce la terminología básica, puede entender cómo utilizar una librería. Para usarla:

  1. Se incluye el fichero de cabecera de la librería.

  2. Se usan las funciones y las variables de la librería.

  3. Se enlaza la librería junto con el programa ejecutable.

Estos pasos también se aplican cuando los módulos objeto no se combinan para formar una librería. Incluir el fichero de cabecera y enlazar los módulos objeto es la base para la compilación separada en C y en C++.

Cómo busca el enlazador una librería

Cuando se hace una referencia externa a una función o una variable en C o C++, el enlazador, una vez encontrada esta referencia, puede hacer dos cosas. Si todavía no ha encontrado la definición de la función o variable, añade el identificador a su lista de «referencias no resueltas». Si el enlazador ya había encontrado la definición, se resuelve la referencia.

Si el enlazador no puede encontrar la definición en la lista de módulos objeto, busca en las librerías. Las librerías tienen algún tipo de indexación para que el enlazador no necesite buscar en todos los módulos objeto en la librería - solamente mira en el índice. Cuando el enlazador encuentra una definición en una librería, el módulo objeto entero, no sólo la definición de la función, se enlaza al programa ejecutable. Dese cuenta de que no se enlaza la librería completa, tan solo el módulo objeto de la librería que contiene la definición que se necesita (de otra forma los programas se volverían innecesariamente grandes). Si se desea minimizar el tamaño del programa ejecutable, se debería considerar poner una única función en cada fichero fuente cuando se construyan librerías propias. Esto requiere más trabajo de edición [38], pero puede ser muy útil para el usuario.

Debido a que el enlazador busca los ficheros en el orden en que se le dan, se puede evitar el uso de una función de una librería insertando un fichero con su propia función, usando el mismo nombre de función, en la lista antes de que aparezca el nombre de la librería. Como el enlazador resolverá cualquier referencia a esa función usando la suya antes de buscar en la librería, se utilizará su función en lugar de la que se encuentra en la librería. Eso también puede ser una fuente de errores, y es la clase de cosas que se puede evitar usando los espacios de nombres (namespaces) de C++.

Añadidos ocultos

Cuando se crea un programa ejecutable en C/C++, ciertos elementos se enlazan en secreto. Uno de estos elementos es el módulo de arranque, que contiene rutinas de inicialización que deben ejecutarse cada vez que arranca un programa C o C++. Estas rutinas preparan la pila e inicializan ciertas variables del programa.

El enlazador siempre busca en la librería estándar las versiones compiladas de cualquier función «estándar» llamada en el programa. Debido a que se busca siempre en la librería estándar, se puede usar cualquier cosa de esta librería simplemente añadiendo a su programa la cabecera apropiada; no necesita indicarle que busque en la librería estándar. Las funciones de flujo de entrada-salida (iostream), por ejemplo, están en la Librería Estándar de C++. Para usarlas, sólo debe incluir el fichero de cabecera <iostream>.

Si se está usando una librería adicional, se debe añadir explícitamente su nombre a la lista de ficheros que se pasan al enlazador.

Uso de librerías de C

Aunque esté escribiendo código en C++, nada le impide usar librerías de C. De hecho, toda la librería de C está incluida por defecto en el C++ Estándar. Hay una cantidad tremenda de trabajo ya realizado en esas librerías que le pueden ahorrar un montón de tiempo.

Este libro usará la Librería Estándar de C++ cuando convenga (y por lo tanto la de C), pero sólo se utilizarán funciones de la librería estándar, para asegurar la portabilidad de los programas. En los pocos casos en los que las funciones no sean de C++ estándar, se intentará que sean funciones compatibles con POSIX. POSIX es un estándar basado en el esfuerzo por conseguir la estandarización de Unix, que incluye funciones que van más allá del ámbito de las librerías de C++. Normalmente puede esperar encontrar funciones POSIX en plataformas Unix (en particular, GNU/Linux), y a menudo en sistemas DOS/Windows. Por ejemplo, si está usando hilos (threads) será mejor usar la librería de hilos compatible con POSIX ya que su código será más fácil de entender, portar y mantener (y normalmente la librería de hilos se limitará a usar los servicios de hilos del sistema operativo, si existen).



[38] Yo le recomendaría usar Perl o Python para automatizar estas tareas como parte de su proceso de empaquetamiento de librerías (ver www.Perl.org o www.Python.org).