Voilà je veux créer une librarie pour un programme chargent dynamiquement des libraries qu'il trouvent dans un répertoire précis -des plugins pour l'application quoi)
J'utilise Qt pour la faire, mais le problème n'est pas liée à Qt, je n'ai jamais fait de librairie et donc je ne sais pas exactement comment on fait, les rares "docs" que j'ai pu trouver sont plus que légère.
Voici le code de ma librarie -code de test donc plus que léger- il ya un fichier xmlnav.h , un fichier xmlnav.cpp et le makefile généré par qmake, le fichier de project qmake étant généré par qmake lui aussi modifié pour changer le template de app à lib.
xmlnav.h
#ifndef XMLNAV_H
#define XMLNAV_H
#include <qstring.h>
#include <qwidget.h>
class XMLNAV : public QWidget
{
Q_OBJECT
public:
XmlNav();
virtual ~XmlNav();
QString name;
};
#endif
extern QString getName();
--------------
xmlnav.cpp
#include "xmlnav.h"
XmlNav::XmlNav()
: QWidget()
{
name="toto";
}
XmlNav::~XmlNav()
{
};
QString getName()
{
XmlNav xm;
return xm.name;
}
----------
La compilation se passe teés bien sans problème aussi bien sous windows que sous linux.
Le code l'appli chargeant la lib:
typedef QString (*xmlnavLib)();
QDir d("modules");
const QFileInfoList file=d.entryInfoList("*.so *.dll");//pour fonctionnement sous Lnux et Windows
QFileInfoListIterator it(*fil);
QFileInfo *fi;
while((fi=it.current())!=0)
{
QMessageBox::information(0,"info","ok1:" + fi->fileName(),1,0,0);
xmlnavlib xmlnavFunc;
QLibrary xnlib(fi->fileName()); // class Qt chargeant des libraries à la volée
xmlnavFunc=(xmlnavLib) xnlib.resolve("getName");
if(xmlnavFunc)
{
QMessageBox::information(0,"info","ok2",1,0,0);//it's only for test
getName();
}
}
------------------
Le premier QMessageBox est oké avec "xmlnav.so" sous linux ou "xmlnav.dll" sous windows, mais le second QMessageBox n'apparait pas.
Merci d'avance, Blackshack
# Re: probleme pour créer une librairie/bibliothèque en c++
Posté par Fabimaru (site web personnel) . Évalué à 1.
Beeeep
s/libraries/bibliothèques (sauf si tu fais du franglais, mais dans ce cas tu peux tenter "loadent dynamiquement des libraries")
# Re: probleme pour créer une librairie/bibliothèque en c++
Posté par tanguy_k (site web personnel) . Évalué à 1.
http://doc.trolltech.com/3.1/qmake-manual.html(...)
# Re: probleme pour créer une librairie/bibliothèque en c++
Posté par Sidoine de Wispelaere . Évalué à 1.
[^] # Re: probleme pour créer une librairie/bibliothèque en c++
Posté par Sidoine de Wispelaere . Évalué à 1.
[^] # Re: probleme pour créer une librairie/bibliothèque en c++
Posté par blackshack . Évalué à 1.
# Re: probleme pour créer une librairie/bibliothèque en c++
Posté par blackshack . Évalué à 1.
Sinon j'ai compilé la lib en dynamique -génere une libxmlnav.so -et en static-libxmlnav.a-, et je n'ai pas le même comportement:
qd le programme trouve la lib.so, la classe QLibrary arrive bien à la charger et la fonction getName est bien appellé .., pour la lib.a il n'arrive pas à charger: d'où ma question est-ce normale qu'une application ne puisse charge pas dynamiquement une lib static?? (question alors pas tapé)
[^] # Re: probleme pour créer une librairie/bibliothèque en c++
Posté par blackshack . Évalué à 1.
dans un fichier mexport.h inclus dans xmlnav.h, j'ai placé le extern pour la déclaration de getName suivant:
extern "C" EXTXMLNAV QString getName
(XMLNAV étant un typedef == à rien sous linux et == à __declspec(dllexport) sous windows)
sous Linux aucun warning n'est renvoyé par make, sous windows nmake renvoye le warning suivant:
.\mexport.h(17) : warning C4190: '' has C-linkage specified, but returns UDT 'QString' which is incompatible with C
C:\Qt\3.1.2Evaluation\include\qstring.h(383) : see declaration of 'QString'
Dans les deux cas la lib fonctionne bien la focntion getName est bien appelable, en fait comment faire pour qu'il n'y ai pas de warning??
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.