Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Borito30 en 26 Febrero 2017, 22:27 pm



Título: problema al linkear mi libreria con codeblocks
Publicado por: Borito30 en 26 Febrero 2017, 22:27 pm
Hola compilo mi proyecto como una librería en mi caso estoy usando la librería gloox por que lo que obtengo lo siguiente:

(https://i.stack.imgur.com/Grqxs.png)

cuando la añado a mi proyecto:

(https://i.stack.imgur.com/erApO.png)

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

(https://i.stack.imgur.com/hxAZKm.png)

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

(https://i.stack.imgur.com/8AELDm.png)

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:

Código:
using namespace gloox;.

Los include:
Código:
#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ódigo:
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.


Título: Re: problema al linkear mi libreria con codeblocks
Publicado por: 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)


Título: Re: problema al linkear mi libreria con codeblocks
Publicado por: Borito30 en 26 Febrero 2017, 23:14 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 :
Citar
hay 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:
Citar
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)

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:
Citar
Para las cabeceras, tienes que meter la ruta en "Search directories -> Compiler".

Te refieres a esta?:
(https://i.imgsafe.org/34fdf33244.png)

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.


Título: Re: problema al linkear mi libreria con codeblocks
Publicado por: 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.


Título: Re: problema al linkear mi libreria con codeblocks
Publicado por: Borito30 en 27 Febrero 2017, 00:01 am
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.


Título: Re: problema al linkear mi libreria con codeblocks
Publicado por: 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:

(http://i.gyazo.com/5b382797757556469ffb97098634bbb4.png)
(https://gyazo.com/36d37ffb6e5663226a06157f03ff4af8.png)
(https://gyazo.com/e1d86399c10a12e67dc51fad162d8e8e.png)



Título: Re: problema al linkear mi libreria con codeblocks
Publicado por: Borito30 en 27 Febrero 2017, 00:49 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:

(http://i.gyazo.com/5b382797757556469ffb97098634bbb4.png)
(https://gyazo.com/36d37ffb6e5663226a06157f03ff4af8.png)
(https://gyazo.com/e1d86399c10a12e67dc51fad162d8e8e.png)



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.


Título: Re: problema al linkear mi libreria con codeblocks
Publicado por: 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.


Título: Re: problema al linkear mi libreria con codeblocks
Publicado por: Borito30 en 27 Febrero 2017, 13:45 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:
(http://i.imgsafe.org/41f0d80ca4.png)
Pero en #defines tengo DLL_EXPORT eso quiere decir que solo puede funcionar como .dll?
(http://i.imgsafe.org/41f3e429ae.png)
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?


Título: Re: problema al linkear mi libreria con codeblocks
Publicado por: ivancea96 en 27 Febrero 2017, 14:36 pm
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.


Título: Re: problema al linkear mi libreria con codeblocks
Publicado por: Borito30 en 27 Febrero 2017, 19:49 pm
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.
No en los ficheros no tiene DLL_EXPORT lo que si genera ficheros .o y hay ficheros .h por lo que debería funcionar como librería estatica. Pero el problema pienso que no es la librería estatica ya que yo puedo incluir las librerias "" con comillas simples es search directories que no se me configura correctamente pero la compilación estática si la hace correctamente. En cuanto a esto lo puedo dar por resuelto ya que funcionar, funciona.

Ahora lo que estaba intentando era crear un ejemplo sencillito usando esta libreria lo cual de momento me ha devuelt ounos cuantos errores pero el tema de compilación y linkeado aunque no me vaya el search directories lo puedo hacer.


Título: Re: problema al linkear mi libreria con codeblocks
Publicado por: ivancea96 en 27 Febrero 2017, 19:59 pm
Pero, lo dicho. Lo de search directories es interesante que lo arregles porque es algo importante. Si quieres, puedes pasar por aquí screen o el texto que  tienes en cada apartado para ver qué puede fallar.


Título: Re: problema al linkear mi libreria con codeblocks
Publicado por: Borito30 en 27 Febrero 2017, 20:22 pm
Pero, lo dicho. Lo de search directories es interesante que lo arregles porque es algo importante. Si quieres, puedes pasar por aquí screen o el texto que  tienes en cada apartado para ver qué puede fallar.
de nuevo no funciono te subo las capturas? o te sería una molestia?

Las capturas son:

(http://i.imgsafe.org/47fe181ddc.png)

(http://i.imgsafe.org/47ffc43407.png)

(http://i.imgsafe.org/4801100316.png)

Te subi las capturas. La compilación estática la hace cuando hago con "" pero solamente lo de search directories para no tener que buscar la ruta.


Título: Re: problema al linkear mi libreria con codeblocks
Publicado por: ivancea96 en 27 Febrero 2017, 21:44 pm
si en search directories pones ".../src", entonces en el include pones <client.h> en vez de <src/client.h>