elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  compilar programa con una biblioteca que no se encuentra en el mismo directorio
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: compilar programa con una biblioteca que no se encuentra en el mismo directorio  (Leído 1,050 veces)
etcheverrypablol

Desconectado Desconectado

Mensajes: 37


¡Hoy mejor que ayer, mañana mejor que hoy!


Ver Perfil
compilar programa con una biblioteca que no se encuentra en el mismo directorio
« 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.



En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.414


ASMático


Ver Perfil WWW
Re: compilar programa con una biblioteca que no se encuentra en el mismo directorio
« Respuesta #1 en: 6 Marzo 2016, 00:00 am »

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

Nunca compilé con dependencias en Linux, pero vaya.


En línea

etcheverrypablol

Desconectado Desconectado

Mensajes: 37


¡Hoy mejor que ayer, mañana mejor que hoy!


Ver Perfil
Re: compilar programa con una biblioteca que no se encuentra en el mismo directorio
« Respuesta #2 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?
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.414


ASMático


Ver Perfil WWW
Re: compilar programa con una biblioteca que no se encuentra en el mismo directorio
« Respuesta #3 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.

Código:
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.
En línea

etcheverrypablol

Desconectado Desconectado

Mensajes: 37


¡Hoy mejor que ayer, mañana mejor que hoy!


Ver Perfil
Re: compilar programa con una biblioteca que no se encuentra en el mismo directorio
« Respuesta #4 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:

Código
  1. //Etcheverry Pablo
  2. //etcheverrypablol@gmail.com
  3. //3-3-2016
  4. //
  5. //Introducción a la Algorítmica y Programación
  6. //
  7. //Práctico 17: Tipos Abstractos de Datos: uso e implementación
  8. //
  9. // Implementación del TAD PILA(Enteros) con arreglos en el lenguaje C
  10. #include <stdio.h>
  11.  
  12. struct TPila
  13. {
  14. int a[10]; //Arreglo de enteros
  15. int tope; //Número de elementos de la pila  
  16. };
  17. struct TPila p;
  18. /*
  19. Parámetros:
  20. p:pila
  21. 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.
  22. */
  23. int Vacia (struct TPila p){
  24.  
  25. return p.tope==-1;
  26. }
  27. /*
  28. Parámetros:
  29. p: pila
  30. 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.
  31. */
  32. void Inicializar (struct TPila *p){
  33. p->tope=-1;
  34. }
  35. /*
  36. Parámetros:
  37. p:pila
  38. x:número a insertar
  39. max:número máximo de elementos que soporta la pila
  40. 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.
  41.  */
  42. void Insertar (struct TPila *p, int x, int max){
  43.  
  44. if(p->tope!=max){
  45. p->tope=p->tope+1;
  46. p->a[p->tope]=x;
  47. }
  48. }
  49. /*
  50. Parámetros:
  51. p:pila
  52. num:variable donde se alamacena el valor del tope
  53. Función: Guardar el valor del tope de la pila en una variable
  54.  */
  55. void Tope (struct TPila p, int *num){
  56. *num=p.a[p.tope];
  57. }
  58. /*
  59. Parámetros:
  60. p:pila
  61. Función: Disminuye el valor de la varible tope de la pila, lo que es análogo a suprimir el tope de la misma.
  62. */
  63. void Suprimir (struct TPila *p){
  64. p->tope--;
  65. }
  66.  

Y POR OTRO, EL PROGRAMA QUE LA USA:

Código
  1. //Etcheverry Pablo
  2. //etcheverrypablol@gmail.com
  3. //5 de marzo de 2016
  4. //
  5. //Introducción a la Algorítmica y Programación
  6. //
  7. //Práctico 17: Tipos Abstractos de Datos: uso e implementación
  8. //
  9. //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.  
  10.  
  11. #include <stdio.h>
  12. #include "/home/etcheverry/Documentos/Algoritmica/2016/bibliotecas/tadPila.h"
  13.  
  14. void MostrarPila (struct TPila p,int max);
  15. void CargarPila(struct TPila *pnumeros, int max);
  16.  
  17. int main(int argc, char const *argv[])
  18. {
  19.  
  20. struct TPila pnumeros; //Pila donde se van a almacenar los enteros
  21. int max=sizeof(pnumeros.a)/(sizeof(pnumeros.a[0])); //Se utiliza para asegurar una carga máxima de 10 enteros
  22.  
  23. printf("El numero máximo que soporta la pila es: %d\n",max );
  24. CargarPila(&pnumeros,max);
  25. printf("Tope de la fila al salir de la carga: %d\n", pnumeros.tope);
  26. MostrarPila(pnumeros,max);
  27.  
  28. return 0;
  29. }
  30. /*
  31. Parámetros:
  32. pnumeros: pila
  33. max: número máximo de elementos que soporta la pila
  34. 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.
  35. */
  36. void CargarPila(struct TPila *pnumeros, int max){
  37. int i; //Para llevar el control de cantidad de elementos que se ingresan
  38. int num; //Para almacenar el valor tope de la pila
  39. char resp; //Respuesta del usario para cargar elemento o no
  40.  
  41. i=0;
  42. Inicializar(pnumeros);
  43. puts("CARGA DE LA PILA.");
  44. puts("Desea ingresar un numero a la pila? s/n: ");
  45. scanf("%s",&resp);
  46. while ((resp=='s' || resp=='S' ) && i<max){
  47. puts("Ingrese un numero: ");
  48. scanf("%d",&num);
  49. Insertar(&(*pnumeros),num,max);
  50. puts("Desea ingresar otro numero? s/n: ");
  51. scanf("%s",&resp);
  52. i++;
  53. }
  54. }
  55.  
  56. void MostrarPila (struct TPila p,int max){
  57. int num; //Variable utilizada para el tope
  58. struct TPila pAux; //Para guardar la pila en esta variable y luEgo colocarla en la original
  59.  
  60. puts("LOS ENTEROS QUE SE INGRESARON A LA PILA SON: ");
  61. if(Vacia(p)){
  62. puts("Pila vacia.");
  63. }else{
  64. while(!(Vacia(p))){
  65. Inicializar(&pAux);
  66. Tope(p,&num);
  67. printf("%d ", num);
  68. Insertar(&pAux,num,max);
  69. Suprimir(&p);
  70. }
  71. printf("\n");
  72. /* 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 */
  73. while(!(Vacia(pAux))){
  74. Tope(pAux,&num);
  75. Insertar(&p,num,max);
  76. Suprimir(&pAux);
  77. }
  78. }
  79.  
  80. }
  81.  

En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.414


ASMático


Ver Perfil WWW
Re: compilar programa con una biblioteca que no se encuentra en el mismo directorio
« Respuesta #5 en: 7 Marzo 2016, 16:26 pm »

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

etcheverrypablol

Desconectado Desconectado

Mensajes: 37


¡Hoy mejor que ayer, mañana mejor que hoy!


Ver Perfil
Re: compilar programa con una biblioteca que no se encuentra en el mismo directorio
« Respuesta #6 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!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines