compilar programa con una biblioteca que no se encuentra en el mismo directorio

Iniciado por etcheverrypablol, 5 Marzo 2016, 23:29 PM

0 Miembros y 1 Visitante están viendo este tema.

etcheverrypablol

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.


ivancea96

gcc -o programa programa.c -L./direccióndelabiblioteca -lbiblio
Prueba así, con -L./dirección

Nunca compilé con dependencias en Linux, pero vaya.

etcheverrypablol

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?

ivancea96

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.

etcheverrypablol

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);
}
}

}



ivancea96

No sé si entendí bien.
La biblioteca la indicas en el código:
Código (cpp) [Seleccionar]
#include "/home/etcheverry/Documentos/Algoritmica/2016/bibliotecas/tadPila.h"
Si utilizas -I/home/etcheverry/Documentos/Algoritmica/2016/bibliotecas, quedaría:
Código (cpp) [Seleccionar]
#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).

etcheverrypablol

iivancea96 pude compilar como indicaste al final. Muchas gracias. La verdad es todo un tema para mi acostumbrarme a este lenguaje. Pero ME ENCANTA!