Título: compilar programa con una biblioteca que no se encuentra en el mismo directorio
Publicado por: etcheverrypablol en 5 Marzo 2016, 23:29 pm
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.
Título: Re: compilar programa con una biblioteca que no se encuentra en el mismo directorio
Publicado por: ivancea96 en 6 Marzo 2016, 00:00 am
gcc -o programa programa.c -L./direccióndelabiblioteca -lbiblio Prueba así, con -L./dirección Nunca compilé con dependencias en Linux, pero vaya.
Título: Re: compilar programa con una biblioteca que no se encuentra en el mismo directorio
Publicado por: etcheverrypablol en 6 Marzo 2016, 02:42 am
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?
Título: Re: compilar programa con una biblioteca que no se encuentra en el mismo directorio
Publicado por: ivancea96 en 6 Marzo 2016, 20:37 pm
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.
Título: Re: compilar programa con una biblioteca que no se encuentra en el mismo directorio
Publicado por: etcheverrypablol en 7 Marzo 2016, 02:58 am
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: "); while ((resp=='s' || resp=='S' ) && i<max){ puts("Ingrese un numero: "); Insertar(&(*pnumeros),num,max); puts("Desea ingresar otro numero? s/n: "); 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)){ }else{ while(!(Vacia(p))){ Inicializar(&pAux); Tope(p,&num); Insertar(&pAux,num,max); Suprimir(&p); } /* 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); } } }
Título: Re: compilar programa con una biblioteca que no se encuentra en el mismo directorio
Publicado por: ivancea96 en 7 Marzo 2016, 16:26 pm
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).
Título: Re: compilar programa con una biblioteca que no se encuentra en el mismo directorio
Publicado por: etcheverrypablol en 8 Marzo 2016, 01:58 am
iivancea96 pude compilar como indicaste al final. Muchas gracias. La verdad es todo un tema para mi acostumbrarme a este lenguaje. Pero ME ENCANTA!
|