problema al linkear mi libreria con codeblocks

Iniciado por Borito30, 26 Febrero 2017, 22:27 PM

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

Borito30

Hola compilo mi proyecto como una librería en mi caso estoy usando la librería gloox por que lo que obtengo lo siguiente:



cuando la añado a mi proyecto:



La ubicación principal de mi libreria(gloox es la carpeta y se encuentra en el escritorio):



La ubicacion de mis librerías será la siguiente:



Lo que hago es compilar mi librería de forma estatica y añadirla a mi programa principal. Pero cuando incluyo las cabeceras de esta libreria no me las reconoce ni el nombre de espacios gloox que sería:

using namespace gloox;.

Los include:

#include <src/client.h>
#include <src/message.h>
#include <src/messagehandler.h>
#include <src/connectionlistener.h>


No reconoce ningun elemento de la librería, me devuelve lo siguiente:

C:\Users\Androide\Desktop\chat\main.cpp|3|fatal error: gloox/src/client.h: No such file or directory|

¿Puede ser que al hacer una compilación estática cambie la ubicación de mis cabeceras? ¿No añadí mi libreria correctamente o porque no reconoce en este caso debería reconocer la ubicación src/ y dentro tendría todas mis cabeceras.
Estoy en contra del foro libre y la Sección de juegos y consolas (distraen al personal)

ivancea96

hay 2 partes: la compilación y el linkeado. Para la compilación, necesitas las cabeceras, nada más. para el linkeado, solo los ficheros objeto (.a, .o...).
Ese error es de compilado, no es cosa de los objeto.

La ruta en la que están las cabeceras, ¿la has añadido? No es en lo de Link libraries (eso es para los ficheros objeto). Para las cabeceras, tienes que meter la ruta en "Search directories -> Compiler". La ruta de la carpeta en la que están las cabeceras. Si haces include <src/client.h>, entonces metes al ruta en la que se encuentre la carpeta src (aunque normalmente, las cabeceras se copian a una carpeta "includes" al compilar la librería)

Borito30

Cita de: ivancea96 en 26 Febrero 2017, 22:40 PM
hay 2 partes: la compilación y el linkeado. Para la compilación, necesitas las cabeceras, nada más. para el linkeado, solo los ficheros objeto (.a, .o...).
Ese error es de compilado, no es cosa de los objeto.

La ruta en la que están las cabeceras, ¿la has añadido? No es en lo de Link libraries (eso es para los ficheros objeto). Para las cabeceras, tienes que meter la ruta en "Search directories -> Compiler". La ruta de la carpeta en la que están las cabeceras. Si haces include <src/client.h>, entonces metes al ruta en la que se encuentre la carpeta src (aunque normalmente, las cabeceras se copian a una carpeta "includes" al compilar la librería)

Vale esque tenía dudas con esto. Dijistes :
Citarhay 2 partes: la compilación y el linkeado. Para la compilación, necesitas las cabeceras, nada más.
Si añado la librería estática no debería reconocer estas librerías segun la ubicación en que se compilo?

Cuando dices:
CitarLa ruta en la que están las cabeceras, ¿la has añadido? No es en lo de Link libraries (eso es para los ficheros objeto)

En esto tengo dudas porque cuando linkeo en la ventana que te enseñe me aparece .a .so .lib .dylib .bundle por eso pense que no podía meter ficheros objeto los cuales tengo para todas las librerias.

Cuando dices:
CitarPara las cabeceras, tienes que meter la ruta en "Search directories -> Compiler".

Te refieres a esta?:


Probe a añadir la ruta de la cabeceras y aún así no me las reconoce por defecto. Si pongo la ruta relativa con doble comillas si "".

Vale estaba confundiendo por completo el compilado y el linkeado van por separado. También es que estaba usando un ejemplo desactualizado para mi librería por lo que tenía que actualizarlo con las nuevas funciones total que me hice la picha un lio, lo unico que tengo que decir que si lo hago manualmente vale el compilado tira pero si lo hago incluyendo como comentastes no funciono. Luego preguntarte lo de el linkeado donde tendría que añadir los ficheros .o para que se incluyesen a mi ejecutable. Un saludo y gracias por tu ayuda.
Estoy en contra del foro libre y la Sección de juegos y consolas (distraen al personal)

ivancea96

En la ruta, no pones gloox/src, sino que pones solo gloox, que es la ruta donde está "src/... .h" (si pones gloox/src, entonces harías include sin el "src/" del principio.

Una vez consigas compilar, veremos los errores de linker que pueda haber (cuando sea un error de linker, lo reconocerás, ya sea porque pone algo de LNK o porque no te marca ninguna línea del código como errónea)

Por cierto, en lo del linker de tu primer mensaje ponia: "../../gloox/libgloox.a". Es una ruta relativa. Te recomendaría poner rutas absolutas.

Borito30

#4
Cita de: ivancea96 en 26 Febrero 2017, 23:24 PM
En la ruta, no pones gloox/src, sino que pones solo gloox, que es la ruta donde está "src/... .h" (si pones gloox/src, entonces harías include sin el "src/" del principio.

Una vez consigas compilar, veremos los errores de linker que pueda haber (cuando sea un error de linker, lo reconocerás, ya sea porque pone algo de LNK o porque no te marca ninguna línea del código como errónea)

Por cierto, en lo del linker de tu primer mensaje ponia: "../../gloox/libgloox.a". Es una ruta relativa. Te recomendaría poner rutas absolutas.

si pero lo que te quiero decir es que cuando lo pongo con ruta absoluta de mis cabeceras no librería porque aunque la incluya la librería estatica no reconoce mis cabeceras. entonces cuando lo hago es por medio de relativa o absoluta ejemplo

absoluta:
"C:\Users\Androide\Desktop\gloox\src\client.h"

o relativa en mi caso
"gloox\src\client.h"

pero siempre con las dobles comillas y sin configurar nada en codeblocks.

Pero cuando añado la carpeta gloox a search directories no se como encontrar mis cabeceras.

Si lo hago "" con las dobles pues si, pero sin añadir nada en la configuración de codeblocks bueno en principio puedo usar las cabeceras por lo que me basta.

Lo que si no se como despues añadire los .o en que parte para que los añada a mi ejecutable.

Total que esta solucionado. Lo unico que no he consigo hacer lo de la configuracion pero si lo hago a mano si.
Estoy en contra del foro libre y la Sección de juegos y consolas (distraen al personal)

ivancea96

En search directory, pones la ruta absoluta donde quieres que el compilador busque las librerías.
Por ejemplo, si pones en search "C:/abc", y en el include "includes/lib.h", buscará: "C:/abc/includes/lib.h"
Para el linkeado es casi lo mismo.

Pones el include con comillas funciona, sí, pero preferiblemente, poner la ruta a la librería en search directories y poner solo el nombre de la librería (y sus sub-carpetas si tiene).

Como ejemplo, esto tengo yo en mi Code::Blocks:






Borito30

#6
Cita de: ivancea96 en 27 Febrero 2017, 00:12 AM
En search directory, pones la ruta absoluta donde quieres que el compilador busque las librerías.
Por ejemplo, si pones en search "C:/abc", y en el include "includes/lib.h", buscará: "C:/abc/includes/lib.h"
Para el linkeado es casi lo mismo.

Pones el include con comillas funciona, sí, pero preferiblemente, poner la ruta a la librería en search directories y poner solo el nombre de la librería (y sus sub-carpetas si tiene).

Como ejemplo, esto tengo yo en mi Code::Blocks:







esque hago eso pero aun asi no funciono por lo que supongo que la librería estará mal y por eso no me incluye las cabeceras por lo que tengo que incluirlas a mano. fijandome me di cuenta que este proyecto el cual estaba intentando usar como libreria en la opcion defines tiene DLL_EXPORT por lo que supongo que solo puede funcionar como dll y no como libreria.
Estoy en contra del foro libre y la Sección de juegos y consolas (distraen al personal)

ivancea96

Busca los .h en la carpeta. Si existen, entonces tienes que poderlos incluir. Si es así, dime exactamente en qué ruta están y exactamente qué pones en search directories y en los include.

Borito30

Cita de: ivancea96 en 27 Febrero 2017, 13:08 PM
Busca los .h en la carpeta. Si existen, entonces tienes que poderlos incluir. Si es así, dime exactamente en qué ruta están y exactamente qué pones en search directories y en los include.
Primero tengo una cuestión yo compilo esta librería como estatica que sería la siguiente:

Pero en #defines tengo DLL_EXPORT eso quiere decir que solo puede funcionar como .dll?

Ya que el search directories no tiene que ver con que la libreria sea estatica o no es solamente para que busque las cabeceras si estoy en lo correcto?
Estoy en contra del foro libre y la Sección de juegos y consolas (distraen al personal)

ivancea96

Compila la librería, y mira los archivos de salida. Debería haber .h y .o. Si genera DLL, entonces también verás los .dll.

Lo de DLL_EXPORT pues, en las DLL se suele incluir una condición de pre-procesado comprobando si está definido DLL_EXPORT. Con esto quiero decir, que poner ese define no hace anda de por sí. Depende del código. Puedes buscar "DLL_EXPORT" en el código y ver si se está utilizando.