![]() |
El uso de librerías en C++ es sumamente importante, ya que permite ahorrar mucho tiempo mediante la reutilización de código que es utilizado recurrentemente. Si bien existen librerías estáticas y dinámicas, en este artículo abordaremos la creación de librerías estáticas en C++, además de dos clasificaciones de éstas: Compiladas y abiertas (Open Source). |
Existen dos formas de crear librerías estáticas:
- LIBRERÍA COMPILADA: Se arma un archivo de cabecera (que sólo contiene los prototipos de las funciones) y toda la lógica de ésta se compila en un archivo objeto (oculta).
- LIBRERÍA ABIERTA: Se incluye toda la librería en un archivo con extensión .h. Ideal para proyectos Open Source.
LIBRERÍA COMPILADA
Para crear una librería compilada, primero se debe crear un archivo .c con las funciones que quieras incluir en tu librería (es la que luego se compilará a un .o ó .a, denominada archivo objeto), y el .h con las cabeceras o prototipos de las funciones y todas las variables globales de esa librería.


CÓDIGO
Para el .c (la librería que luego será compilada a un .o)
____________________________________________________________
#include "milibreria.h"
void funcion1(int param) {
// definicion ...
}
float funcion2(int param2) {
// definicion funcion 2...
}
____________________________________________________________
.h
Para el .h (el archivo adjunto que contiene declaración de variables y comentarios acerca de la librería)
____________________________________________________________
#ifndef _MILIBRERIA_H_
#define _MILIBRERIA_H__
void funcion1(int param);
float funcion1(int param2); //comentario
/*comentarios
de múltiples lineas*/
#endif
____________________________________________________________
Las directivas
#ifndef _MILIBRERIA_H_
#define _MILIBRERIA_H_
tienen como finalidad evitar que se repitan si existen en el sistema. Al final de la declaración de los prototipos siempre debe finalizarse con
#endif
COMPILAR UNA LIBRERÍA
Para compilar una nueva librería y generar finalmente los archivos .o (objeto) y .h (cabecera) utilizando gcc, se ingresa el siguiente comando desde el directorio donde se encuentran ambos archivos:
gcc -c milibreria.c -o milibreria.o
De aquí se obtendrán los ficheros objeto (.o) de todas las fuentes (.c). La opción -c le dice al compilador que no cree un ejecutable, sino sólo un fichero objeto.
Allí se generarán dos archivos: un preprocesado y compilado del objeto (el .o); y el archivo de cabeceras (.h) que sólo es preprocesado, pero no compilado.
Posteriormente al ser llamado en un programa cualquiera mediante la sentencia
#include “milibreria.h”
su forma de acceso es como se ve en la siguiente figura:

PROCESO DE COMPILADO
Mediante el comando ingresado al compilador, éste generará a partir de el archivo .h + .c un único archivo de salida con extensión .o, el cual condensa toda la lógica de la librería creada.
Posteriormente la librería deberá ser distribuida con estos dos archivos.

Siempre es buena práctica tener lo más documentado posible el .h, ya que éste determinará la facilidad de uso e implementación a futuro de la nueva librería que hayamos creado.
EJEMPLO
Este es un ejemplo de aplicación de una librería que calcula el área para diversas figuras geométricas.
Se arma el archivo .c con la implementación de las funciones, el archivo de cabeceras .h y se lo compila. Por otra parte el programa .cpp hará uso de las funciones creadas.
.c
____________________________________________________________
#include "milibreria.h"
float a_triangulo(float base,float altura){
return ((base*altura)/2);
}
float a_rectangulo(float base,float altura){
return (base*altura);
}
float a_circulo(float radio){
return (3.1415926*radio*radio);
}
____________________________________________________________
.h
____________________________________________________________
#ifndef _MILIBRERIA_H_
#define _MILIBRERIA_H_
float a_triangulo(float base,float altura)
float a_rectangulo(float base,float altura)
float a_circulo(float radio)
#endif
____________________________________________________________
.cpp
____________________________________________________________
#include <iostream>
#include "milibreria.h"
using namespace std;
int main() {
float base,altura,radio,area;
cout<<"Vamos a utilizar la libreria recien creada\n";
cout<<"Ingrese base: ";
cin>>base;
cout<<"Ingrese altura: ";
cin>>altura;
cout<<"Ingrese radio: ";
cin>>radio;
//Ahora llamamos a la libreria
cout<<"Si fuese un rectangulo, el area es de: "<<a_rectangulo(base,altura)<<endl;
cout<<"Si fuese un triangulo, el area es de: "<<a_triangulo(base,altura)<<endl;
cout<<"Si fuese un circulo, el area es de: "<<a_circulo(radio)<<endl;
return 0;
}
____________________________________________________________
LIBRERÍA ABIERTA
La librería abierta consiste en armar todas las funciones en un archivo .h que luego se lo incluye a los programas que lo necesiten haciendo uso de
#include “milibreria.h”
Esta es mucho más simple de utilizar e implementar, ya que no es necesaria la compilación de la librería antes de poder utilizarla.
Es ideal para proyectos de código abierto.

EJEMPLO
Siguiendo el mismo ejemplo que el anterior, haremos una librería abierta en C++ que calcule el área de diversas figuras geométricas.
.h
____________________________________________________________
//vemos que todas las funciones se implementan aquí mismo,
//al momento de declararlas
#ifndef _MILIBRERIA_H_
#define _MILIBRERIA_H_
float a_triangulo(float base,float altura){
return ((base*altura)/2);
}
float a_rectangulo(float base,float altura){
return (base*altura);
}
float a_circulo(float radio){
return (3.1415926*radio*radio);
}
#endif
____________________________________________________________
.cpp
____________________________________________________________
#include <iostream>
#include "milibreria.h"
using namespace std;
int main() {
float base,altura,radio,area;
cout<<"Vamos a utilizar la libreria recien creada\n";
cout<<"Ingrese base: ";
cin>>base;
cout<<"Ingrese altura: ";
cin>>altura;
cout<<"Ingrese radio: ";
cin>>radio;
//Ahora llamamos a la libreria
cout<<"Si fuese un rectangulo, el area es de: "<<a_rectangulo(base,altura)<<endl;
cout<<"Si fuese un triangulo, el area es de: "<<a_triangulo(base,altura)<<endl;
cout<<"Si fuese un circulo, el area es de: "<<a_circulo(radio)<<endl;
return 0;
____________________________________________________________
Licencia
. Ver información de licencia & cómo copiar material de esta web aquí
Desarrollado por Cristian1604. Las imágenes son de libre uso siempre que se cite al autor o a la página web

