Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Qt. Enlazar a librería dinámica

Estas en el tema de Qt. Enlazar a librería dinámica en el foro de C/C++ en Foros del Web. Hola: Estoy ( sigo ) con mi primer intento de hacer "algo" usando librerías externas que no sean las de las STL o Qt . ...
  #1 (permalink)  
Antiguo 15/06/2015, 03:32
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 7 meses
Puntos: 10
Qt. Enlazar a librería dinámica

Hola:

Estoy (sigo) con mi primer intento de hacer "algo" usando librerías externas que no sean las de las STL o Qt .

La cosa es que para hacer uso de las clases de QGIS, he tenido que instalar el paquete libqgis-dev, el cual me provee los archivos de cabecera.

Al intentar compilar me ha dado errores de falta de implementaciones, por lo que me puse a buscar los archivos *.cpp.

Después hice una consulta aquí, en la que me han contestado que las implementaciones están en los archivos libqgis_core.so.x.y.z / libqgis_gui.so.x.y.z, los cuales son librerías dinámicas.

Y ahora mis dudas:

1.- ¿Esto suele ser la forma habitual de trabajar?
2.- ¿Me puedo descargar de github los archivos cpp y compilar sin las librerías dinámicas?
3.- Al ejecutar la prueba (que no tiene nada más que un widget especializado) el programa cierra, por culpa de algo de memoria. ¿Si compilo con los cpp tendré más oportunidades de detectar el origen del error?
4.- ¿Cómo puedo saber que estoy usando los headers e implementaciones adecuados? No veo ninguna correspondencia entre cada fichero. (lo digo por si la causa del problema es esa)
5.- Se supone que las librerías dinámicas se usan durante la ejecución, no durante la compilación. Entonces, ¿cómo realmente busca el compilador las implementaciones?

En fin, que son varias cosas, pero al dar el "salto" al uso de librerías dinámicas, pues me surgen tantas dudas como la primera vez que instalé CodeBlocks y todo me sonaba a chino

Como siempre, saludos y gracias
__________________
Mi calculadora en Qt
  #2 (permalink)  
Antiguo 15/06/2015, 05:07
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Qt. Enlazar a librería dinámica

Cita:
Iniciado por dehm Ver Mensaje
1.- ¿Esto suele ser la forma habitual de trabajar?
El código compilado puedes ofrecerlo, bien en plan monolítico en un único ejecutable o distribuído en librerías dinámicas.

La ventaja del primer sistema es que únicamente es necesario llevar consigo un archivo para que tu programa funcione, mientras que la ventaja del segundo sistema es que las actualizaciones suelen ser menos traumáticas (no es necesario sustituir el ejecutable completo sino únicamente aquellas librerías que tienen cambios). Además, usar librerías dinámicas te permite cargar y descargar librerías en tiempo de ejecución, con lo que puedes reducir el consumo de recursos de tu ejecutable, lo cual viene especialmente bien en sistemas con pocos recursos, como los sistemas empotrados o embebidos.

De entre estas dos formas de trabajar, yo diría que la más habitual es la segunda, asi que sí, ofrecer librerías dinámicas es algo habitual.

Cita:
Iniciado por dehm Ver Mensaje
2.- ¿Me puedo descargar de github los archivos cpp y compilar sin las librerías dinámicas?
Legalmente, eso dependerá de la licencia con la que te estén ofreciendo los fuentes. Ahora que si el programa es para uso interno y no vas a comercializarlo es complicado que nadie te pida explicaciones.

Cita:
Iniciado por dehm Ver Mensaje
3.- Al ejecutar la prueba (que no tiene nada más que un widget especializado) el programa cierra, por culpa de algo de memoria. ¿Si compilo con los cpp tendré más oportunidades de detectar el origen del error?
Hechar la culpa a la memoria... así sin explicaciones es decir más bien poca cosa:

  • El equipo se queda sin memoria?
  • Estás accediendo a posiciones de memoria no válidas?
  • No se carga alguna DLL y, en consecuencia, el programa no encuentra determinadas funciones que necesita para su ejecución?


Cita:
Iniciado por dehm Ver Mensaje
4.- ¿Cómo puedo saber que estoy usando los headers e implementaciones adecuados? No veo ninguna correspondencia entre cada fichero. (lo digo por si la causa del problema es esa)
Tendrás que tirar de la documentación de la librería y de foros donde trabajen con esas librerías... o bien puedes estudiar el código fuente (no suele ser lo recomendable).

Suele suceder que la librería tenga uno o unos pocos archivos de cabecera general que te ofrece las funciones más habituales. En estos casos con añadir uno o dos includes tu programa debería ser capaz de compilar.

Cita:
Iniciado por dehm Ver Mensaje
5.- Se supone que las librerías dinámicas se usan durante la ejecución, no durante la compilación. Entonces, ¿cómo realmente busca el compilador las implementaciones?
Que conste que esto que voy a contar es una versión simplificada cuyo único sentido es que se entienda, al menos por encima, el proceso.

Cuando se genera una librería dinámica, normalmente se crea también un fichero que hace las veces de índice, es decir, ofrece cierta información sobre el contenido de la DLL... además la propia DLL tiene información sobre la ubicación de cada función "pública" de la DLL.

Al compilar debes incluir una referencia al fichero del índice de la DLL, de tal forma que el compilador sea capaz de identificar qué recursos va a tener que localizar en la DLL.

En tiempo de ejecucion, el programa carga en memoria la DLL. Cuando el programa necesita hacer uso de alguna función de la DLL entonces se llama a una función especial de la DLL. Esta función recibe un identificador y devuelve la dirección de memoria asociada a dicho identificador. Con la dirección de memoria en tu poder, tu programa ya puede llamar a la función de la misma forma que si la función estuviese embebida en tu propio programa.

Un saludo
  #3 (permalink)  
Antiguo 15/06/2015, 05:31
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 7 meses
Puntos: 10
Respuesta: Qt. Enlazar a librería dinámica

Hola eferion, como siempre gracias por estar ahí:

Te comento algunas cosas:

Con respecto a las 2 primeras preguntas, me refería más bien a si es normal la forma de trabajar en la que se trabaja con librerías dinámicas en lugar de los propios archivos cpp.

Y sobre la otra pregunta, es todo GPL. Me refería más bien a que si yo me puedo liar la manta a la cabeza, y en lugar de hacer las cosas como sugieren los desarrolladores (usar las librerías dinámicas), encender varias velitas a Santa Tecla y a San Cucufato, e intentar hacer uso de los cpp, que es la forma en la yo siempre lo he hecho.

Con respecto a la tercera cuestión, pues ese es el problema, que pienso que compilando de esta forma tendré menos oportunidades de detectar errores (asumo que puedo estar diciendo muchas tonterías).
De hecho, compilo sin problemas, pero al ejecutar todo el error que tengo es este:
...realloc(): invalid pointer: 0x00007f604b2c0d60 ***
The program has unexpectedly finished.

Pienso que hay un puntero apuntando a donde no debe, pero....

Con respecto a la cuarta cuestión, no veo mucha documentación al respecto. De nuevo pienso que si me descargo los fuentes completos, headers y cpp, será la mejor forma de no equivocarme en este respecto.

Y el último punto, como siempre super didáctico, para que un zarpas como yo entienda el mecanismo de las librerías dinámicas, tanto en compilado como en ejecución.
¡Gracias como siempre!
__________________
Mi calculadora en Qt
  #4 (permalink)  
Antiguo 15/06/2015, 05:35
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 7 meses
Puntos: 10
Respuesta: Qt. Enlazar a librería dinámica

Pongo el código, para que se vea lo sencillo que es:

mivisor.h

Código C++:
Ver original
  1. #ifndef MIVISOR_H
  2. #define MIVISOR_H
  3.  
  4. #include <qgis/qgis.h>
  5. #include <qgis/qgisplugin.h>
  6. #include <qgis/qgsmapcanvas.h>
  7.  
  8. #include "ui_mivisor.h"
  9.  
  10. class MiVisor : public QgsMapCanvas, private Ui::MiVisor
  11. {
  12.     Q_OBJECT
  13.  
  14. public:
  15.     explicit MiVisor(QWidget *parent = 0, const char *name = 0);
  16.     ~MiVisor();
  17. };
  18.  
  19. #endif // MIVISOR_H

mivisor.cpp

Código C++:
Ver original
  1. #include "mivisor.h"
  2.  
  3.  
  4. MiVisor::MiVisor(QWidget *parent,const char *name) : QgsMapCanvas(parent, name)
  5. {
  6.     setupUi(this);
  7. }
  8.  
  9. MiVisor::~MiVisor(){}

Código C++:
Ver original
  1. #include "mivisor.h"
  2. //#include <qgis/qgsapplication.h>
  3. #include <QApplication>
  4.  
  5. int main(int argc, char *argv[])
  6. {
  7.     //QgsApplication a(argc, argv, true);
  8.     QApplication a(argc, argv);
  9.     MiVisor w;
  10.     w.show();
  11.  
  12.     return a.exec();
  13. }


La Ui sólo tiene un widget vacío.

La clase QgsMapCanvas hereda de QGraphicsView, de Qt
__________________
Mi calculadora en Qt
  #5 (permalink)  
Antiguo 15/06/2015, 05:50
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Qt. Enlazar a librería dinámica

Cita:
Iniciado por dehm Ver Mensaje
Con respecto a las 2 primeras preguntas, me refería más bien a si es normal la forma de trabajar en la que se trabaja con librerías dinámicas en lugar de los propios archivos cpp.
Para tí debería ser prácticamente lo mismo. El cambio más significativo que hay que hacer en el proyecto es añadir un par de líneas para que el compilador enlace con la DLL... una vez hecho eso a ti te va a dar igual si el código está en una DLL o en otra o si es código propio porque las llamadas son exactamente las mismas.

Cita:
Iniciado por dehm Ver Mensaje
Y sobre la otra pregunta, es todo GPL. Me refería más bien a que si yo me puedo liar la manta a la cabeza, y en lugar de hacer las cosas como sugieren los desarrolladores (usar las librerías dinámicas), encender varias velitas a Santa Tecla y a San Cucufato, e intentar hacer uso de los cpp, que es la forma en la yo siempre lo he hecho.
Las DLL vienen ya compiladas, es decir, el proceso de configurar el proyecto para compilar esa librería, cargar sus dependencias, etc... ya está hecho!!!!

Ellos te ofrecen el código compilado y las cabeceras necesarias para que tu código compile... eso es lo único que necesitas.

Cita:
Iniciado por dehm Ver Mensaje
Con respecto a la tercera cuestión, pues ese es el problema, que pienso que compilando de esta forma tendré menos oportunidades de detectar errores (asumo que puedo estar diciendo muchas tonterías).
En este mundo hay que aprender a delegar... tienes que presuponer que las librerías que te ofrecen funcionan correctamente. En caso contrario lo más normal es crear una incidencia y darles tiempo para que lo arreglen.

Los grupos mínimamente serios suelen sacar versiones bastante probadas... puede que tengan algún fallo crítico, pero no suele ser lo habitual.


Cita:
Iniciado por dehm Ver Mensaje
De hecho, compilo sin problemas, pero al ejecutar todo el error que tengo es este:
...realloc(): invalid pointer: 0x00007f604b2c0d60 ***
The program has unexpectedly finished.

Pienso que hay un puntero apuntando a donde no debe, pero....
Efectivamente tiene toda la pinta de que no has inicializado algo correctamente o se te ha pasado inicializar algun elemento de la librería. Siempre puedes usar el depurador para saber en qué parte de tu código se está haciendo la llamada fatídica... eso te dará pistas para continuar.

Cita:
Iniciado por dehm Ver Mensaje
Con respecto a la cuarta cuestión, no veo mucha documentación al respecto. De nuevo pienso que si me descargo los fuentes completos, headers y cpp, será la mejor forma de no equivocarme en este respecto.
Ver código fuente no tiene por qué ayudarte a entender cómo funciona algo de la misma forma que ver el interior de un generador nuclear no te ayuda a entender por qué funciona... es una opción que puedes intentar, pero te puede llevar bastantes quebraderos de cabeza conseguir que esa librería te compile... estás avisado!!!!

Un saludo
  #6 (permalink)  
Antiguo 15/06/2015, 10:51
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 7 meses
Puntos: 10
Respuesta: Qt. Enlazar a librería dinámica

Bueno, pues las dudas que originaron este hilo ya me las has respondido fenomenal.
Lo del error, pues toca leerse bien la API. Por lo que veo hay cambios no documentados y muchos de los ejemplos que estoy intentando seguir están hechos con versiones antiguas, así que toca leer más despacio.

Saludos y gracias!
__________________
Mi calculadora en Qt

Etiquetas: enlazar, int, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:02.