Estoy haciendo varios programas y quiero comenzar a hacer una biblioteca (o librería) mia.
Me di cuenta que la estaba incluyendo en mis programas con:
#include "mibilio.h"
Ya que la tengo en el mismo directorio que el programa.
Resulta que los programas son varios, y van a estar en distintas carpetas, por lo que va a haber programas que van a estar en un directorio distinto al de la biblioteca.
La pregunta es, ¿cómo hago compilar esos programas con esta bibilioteca?
Yo estoy haciendo lo siguiente:
Compilo la función que va a ir a la biblio con:
gcc -c primerFuncion.c
Luego creo la biblioteca con:
ar -r libmibiblio.a primerFuncion.o
Y acá sigue el paso que no se cual es. Si la biblioteca estuvira en el mismo programa que quiero compilar (Digamos programa.c) haría lo siguiente:
gcc -o programa programa.c -L. -lbiblio
Y listo, pero ese no es mi caso. Se que -L. indica que la biblioteca se encuentra en el mismo directorio. Probé con el siguiente comando pero no funcionó:
gcc -o programa programa.c -L/direccióndelabiblioteca
Alguien me puede orientar un poco?
Gracias.
gcc -o programa programa.c -L./direccióndelabiblioteca -lbiblio
Prueba así, con -L./dirección
Nunca compilé con dependencias en Linux, pero vaya.
Hola ivancea96, probé como dijiste, pero me salta el mensaje de que no se encuentra:
Error que salta en consola:
practica17-1.c:13:22: error fatal: mibiblio.h: No existe el fichero o el directorio
compilación terminada.
Intneté colocanco la biblioteca en el mismo directorio que el programa, pero me salra el siguiente error:
usr/bin/ld: no se puede encontrar -lmibiblio
collect2: error: ld devolvió el estado de salida 1
A qué se debe este error?
Perdón, fallo mío.
-LDIRECTORIO para especificar el directorio de los ficheros objeto de la biblioteca, si tiene (.a, .o).
-IDIRECTORIO para especificar el directorio de las cabeceras.
gcc -o programa programa.c -I./direccióndelabiblioteca -L./direccióndelabiblioteca -lbiblio
Si la biblioteca no tiene ficheros objeto, no necesita el -lbiblio ni el -L.
ivancea96 hay algunas cosas que no entiendo, por ejemplo, si yo no incluyo una linea de código dentro del programa que me diga cuál es la biblioteca que quiero enlazar, como indico eso? Si coloco los comandos -I y -L que sólo contienen la dirección del directorio de la biblioteca pero no indica cuál es la misma, como le indico cual es?
Subo mi código para tener una guia de lo que estoy haciendo:
POR UN LADO LA BIBLIOTECA:
//Etcheverry Pablo
//etcheverrypablol@gmail.com
//3-3-2016
//
//Introducción a la Algorítmica y Programación
//
//Práctico 17: Tipos Abstractos de Datos: uso e implementación
//
// Implementación del TAD PILA(Enteros) con arreglos en el lenguaje C
#include <stdio.h>
struct TPila
{
int a[10]; //Arreglo de enteros
int tope; //Número de elementos de la pila
};
struct TPila p;
/*
Parámetros:
p:pila
Función: Retona verdadero si la pila está vacía (valor de tope cero) o falso. Observa que no es necesario pasar la pila como puntero.
*/
int Vacia (struct TPila p){
return p.tope==-1;
}
/*
Parámetros:
p: pila
Lo que hace la función es inicializar la pila dándole el valor 0 a tope. Se debe pasar la pila como puntero, para al momento de llamar la función, darle la dirección de memoria de la pila que le pasemos como parámetro (Inicializar struct TPila &p). Al darle la dirección de memoria, estamos logrando un pasaje de parámetro por REFERENCIA, lo que significa que al retornar un valor la función, quedará modificada la variable que se le haya pasado como parámetro.
*/
void Inicializar (struct TPila *p){
p->tope=-1;
}
/*
Parámetros:
p:pila
x:número a insertar
max:número máximo de elementos que soporta la pila
Función: Inserta un elemento pasado como parámetro en el tope de la pila. Observar que se deben pasar p como puntero, ya que se debe pasar por referencia para poder modificar su valor.
*/
void Insertar (struct TPila *p, int x, int max){
if(p->tope!=max){
p->tope=p->tope+1;
p->a[p->tope]=x;
}
}
/*
Parámetros:
p:pila
num:variable donde se alamacena el valor del tope
Función: Guardar el valor del tope de la pila en una variable
*/
void Tope (struct TPila p, int *num){
*num=p.a[p.tope];
}
/*
Parámetros:
p:pila
Función: Disminuye el valor de la varible tope de la pila, lo que es análogo a suprimir el tope de la misma.
*/
void Suprimir (struct TPila *p){
p->tope--;
}
Y POR OTRO, EL PROGRAMA QUE LA USA:
//Etcheverry Pablo
//etcheverrypablol@gmail.com
//5 de marzo de 2016
//
//Introducción a la Algorítmica y Programación
//
//Práctico 17: Tipos Abstractos de Datos: uso e implementación
//
//Ejercicio 1: Dada una pila de números enteros, usando el TAD PILA(enteros) desarrolla un algoritmo que imprima en pantalla el contenido de dicha pila. La pila debe quedar en su estado original.
#include <stdio.h>
#include "/home/etcheverry/Documentos/Algoritmica/2016/bibliotecas/tadPila.h"
void MostrarPila (struct TPila p,int max);
void CargarPila(struct TPila *pnumeros, int max);
int main(int argc, char const *argv[])
{
struct TPila pnumeros; //Pila donde se van a almacenar los enteros
int max=sizeof(pnumeros.a)/(sizeof(pnumeros.a[0])); //Se utiliza para asegurar una carga máxima de 10 enteros
printf("El numero máximo que soporta la pila es: %d\n",max );
CargarPila(&pnumeros,max);
printf("Tope de la fila al salir de la carga: %d\n", pnumeros.tope);
MostrarPila(pnumeros,max);
return 0;
}
/*
Parámetros:
pnumeros: pila
max: número máximo de elementos que soporta la pila
Función: Se encerga sólo de la cuestión de carga de la pila. Observar que se debe pasar como puntero la pila, ya que al terminar esta función, nos interesa que se haya modificado la misma.
*/
void CargarPila(struct TPila *pnumeros, int max){
int i; //Para llevar el control de cantidad de elementos que se ingresan
int num; //Para almacenar el valor tope de la pila
char resp; //Respuesta del usario para cargar elemento o no
i=0;
Inicializar(pnumeros);
puts("CARGA DE LA PILA.");
puts("Desea ingresar un numero a la pila? s/n: ");
scanf("%s",&resp);
while ((resp=='s' || resp=='S' ) && i<max){
puts("Ingrese un numero: ");
scanf("%d",&num);
Insertar(&(*pnumeros),num,max);
puts("Desea ingresar otro numero? s/n: ");
scanf("%s",&resp);
i++;
}
}
void MostrarPila (struct TPila p,int max){
int num; //Variable utilizada para el tope
struct TPila pAux; //Para guardar la pila en esta variable y luEgo colocarla en la original
puts("LOS ENTEROS QUE SE INGRESARON A LA PILA SON: ");
if(Vacia(p)){
puts("Pila vacia.");
}else{
while(!(Vacia(p))){
Inicializar(&pAux);
Tope(p,&num);
printf("%d ", num);
Insertar(&pAux,num,max);
Suprimir(&p);
}
printf("\n");
/* El código que sigue es para dejar la pila en el estado original.IMPORTANTE: Este código no es necesario, ya que la pila se ha pasado como un parámetro por valor */
while(!(Vacia(pAux))){
Tope(pAux,&num);
Insertar(&p,num,max);
Suprimir(&pAux);
}
}
}
No sé si entendí bien.
La biblioteca la indicas en el código:
#include "/home/etcheverry/Documentos/Algoritmica/2016/bibliotecas/tadPila.h"
Si utilizas -I/home/etcheverry/Documentos/Algoritmica/2016/bibliotecas, quedaría:
#include "tadPila.h"
Si la biblioteca está toda contenida en el .h, entonces se compilará con el mismo programa (al fin y al cabo, #include se intercambia por ekl texto del archivo incluído).
iivancea96 pude compilar como indicaste al final. Muchas gracias. La verdad es todo un tema para mi acostumbrarme a este lenguaje. Pero ME ENCANTA!