Autotools 3

21 11 2007

Libtool

Veremos ahora en más detalle otra funcionalidad que podemos usar para que nuestro proyecto gane en calidad. Explicaremos el uso de los objetos compartidos. Por lo general se recomiendan cuando nuestro trabajo alcanza un nivel de complejidad alto, donde hay mucho código generado y donde la interrelación entre módulos es alta. Nos ayuda también a minimizar el tiempo de compilación ya que, con su uso, muchas de las funcionalidades que empleamos estarán ya listas para ser usadas.

Un objeto compartido es un fichero que contiene código compilado que puede ser usado mediante cabeceras y que generalmente se usa para funcionalidades reusables entre programas o módulos. En muchos sistemas operativos se usa esta filosofía. Muchas veces lo hemos usado, por ejemplo cuando encuestamos un diálogo para Abrir, Cerrar, Guardar, o cambiar el atributo de algún elemento, vemos los mismos diálogos que se repiten, sólo que con información diferente. Ellos se almacenan en objetos compartidos y pueden ser usados rápida y facilmente.

Comenzaremos con una versión más actualizada de nuestro Hola Mundo. En el capítulo anterior vimos cómo construir un proyecto en el cual había múltiples subdirectorios. Ahora construiremos un objeto compartido para uno de esos directorios y lo vincularemos al proyecto.

Makefile.am:

lib_LTLIBRARIES = libhola_mundo.la
libhola_mundo_la_SOURCES = libhmi.c
libhola_mundo_la_LIBADD = clase/libClase.a

libhola_mundo_la_CXXFLAGS = -I/usr/include/gtkmm2.4
libhola_mundo_la_LDFLAGS = -lgtkmm2.4 -version-info 0:1:0

Noten cómo construimos nuestro objeto compartido de una forma similar que como construimos binarios. Añadimos el version-info para versionar el objeto el cual sufrirá cambios a medida que lo mejoremos. De no hacerlo por defecto tomará 0.0.0.

Ahora sólo nos queda preparar las cabeceras que utilizarán al objeto compartido. Las cabeceras son ficheros donde generalmente sólo se declaran los elementos a usar en un objeto compartido ( dinámico ) o estático. En el caso de C++ por ejemplo, lo podríamos ver como los archivos .h donde usualmente se encuentran las declaraciones. En los .cpp quedarían las definiciones. Es buena práctica separar ambos elementos ( declaración y definición ).

Para ello necesitamos 2 cosas. Especificar cuáles serán los ficheros que exportará el proyecto que usarán al objeto compartido y la ubicación tanto de ellos como del objeto en nuestro sistema. Nos auxiliaremos de las variables de la configuración includedir y libdir.

Podemos exportar las cabeceras incluyendo el directorio donde se encuentran o sin él. En este caso no incluiremos el directorio donde se encuentran usando la instrucción nobase_include_HEADERS. Quedaría de esta forma los nuevos cambios.

Makefile.am:

SUBDIRS = clase

lib_LTLIBRARIES = libhola_mundo.la
libhola_mundo_la_SOURCES = libhmi.c
libhola_mundo_la_LIBADD = clase/libClase.a

libhola_mundo_la_CXXFLAGS = -I/usr/include/gtkmm2.4
libhola_mundo_la_LDFLAGS = -lgtkmm2.4 -version-info 0:1:0

bin_programs = hola_mundo
hola_mundo_SOURCES = main.cpp
hola_mundo_CXXFLAGS = -I/usr/include/gtkmm-2.4
hola_mundo_LDFLAGS = -lm -lgtkmm-2.4 -lhola_mundo

clase/Makefile.am:

noinst_LIBRARIES = libClase.a
libClase_a_SOURCES = Clase.cpp

Con esto hecho nos queda definir la ruta donde nos quedarán las cabeceras y opcionalmente el objeto compartido. De no definir ambas rutas, el sistema tomará una ubicación por defecto ( generalmente se encuentran las cabeceras bajo /usr/include y los objetos compartidos bajo /usr/local/lib ó /usr/lib ). Para ello configuramos nuestro proyecto así:

# ./configure --includedir="/usr/include/hello" --libdir="/usr/lib/hello"

Para exportar separadamente los objetos compartidos y las cabeceras podemos dar un:

# make libhola_mundo.la install-libLTLIBRARIES // crear e instalar objeto compartido
# make libhola_mundo.la install-data // exportar cabeceras

También podemos instalar todo con un solo comando:

# make install

Ya con esto tenemos todo lo necesario para crear objetos compartidos portables de manera eficiente, y usarlos sin mucho esfuerzo.

Advertisements

Actions

Information

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s




%d bloggers like this: