Bonjour,
je ne sais pas si je suis au bon endroit, mais je fais confiance au admin pour me rediriger si besoin.
Voila je souhaite créer et utiliser ma première librairie. Je ne suis pas du tout familière avec l'utilisation des librairies d'où ma présence.
Je commence par préciser que je travail sous l’environnement Qt Creator et que j'utilise déjà Qt (mais je n'ai jamais rien paramétré de ce coté là).
J'ai déjà créer mon projet de librairie, mis mon code dedans avec la classe que je souhaite rendre instanciable par les programmes utilisant cette lib.
pour vous faire simple voici quelques morceau de code :
Tout d'abord le .pro de mon projet de lib :
Code Qt-pro : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 #------------------------------------------------- # # Project created by QtCreator 2018-10-26T09:39:31 # #------------------------------------------------- QT -= gui QT += network TARGET = MLK TEMPLATE = lib CONFIG += staticlib DEFINES += MLK_LIBRARY # The following define makes your compiler emit warnings if you use # any feature of Qt which has been marked as deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ classeaccessibleexterieur.cpp \ classe1.cpp \ classe2.cpp \ classe3.cpp \ classe4.cpp HEADERS += \ classeaccessibleexterieur.h \ mlk_global.h \ classe1.h \ classe2.h \ classe3.h \ classe4.h \ classe5.h unix { target.path = /usr/lib INSTALLS += target }
voici le fichier mlk_global.h qui s'est autocréé lors de la création du projet :
et voici ma classe à rendre accessible vers l’extérieur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 #ifndef MLK_GLOBAL_H #define MLK_GLOBAL_H #include <QtCore/qglobal.h> #if defined(MLK_LIBRARY) # define MLKSHARED_EXPORT Q_DECL_EXPORT #else # define MLKSHARED_EXPORT Q_DECL_IMPORT #endif #endif // MLK_GLOBAL_H
Bon jusque là faite moi savoir si il manque des choses importantes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 #ifndef CLASSE_ACCESSIBLE_EXTERIEUR_H #define CLASSE_ACCESSIBLE_EXTERIEUR_H #include "mlk_global.h" #include <QVector> #include <QFileInfo> #include "classe1.h" #include "classe2.h" #include "classe3.h" #include "classe4.h" class MLKSHARED_EXPORT ClasseAccessibleExterieur { private : QVector<Classe1> instanceClasse1; QVector<Classe2> instanceClasse2; QVector<Classe3> instanceClasse3; QVector<Classe4> instanceClasse4; public: ClasseAccessibleExterieur(); ~ClasseAccessibleExterieur(); bool loadFile(QFileInfo info); bool saveFile(QFileInfo file); QString classe1ToString(int indice); int getSizeOf_Classe1(); QString classe2ToString(int indice); int getSizeOf_Classe2(); QString classe3ToString(int indice); int getSizeOf_Classe3(); QString classe4ToString(int indice); int getSizeOf_Classe4(); }; #endif // CLASSE_ACCESSIBLE_EXTERIEUR_H
J'ai donc maintenant souhaité inclure mon fichier "mlk.lib" dans un autre projet (toujours sous QtCreator)
J'ai donc fait ceci dans mon fichier monSoft.pro
Code Qt-pro : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 #------------------------------------------------- # # Project created by QtCreator 2018-10-22T15:14:41 # #------------------------------------------------- QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = MonSoft TEMPLATE = app # The following define makes your compiler emit warnings if you use # any feature of Qt which has been marked as deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 CONFIG += c++11 SOURCES += \ main.cpp \ mainwindow.cpp \ HEADERS += \ mainwindow.h \ FORMS += \ mainwindow.ui # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target DISTFILES += unix|win32: LIBS += -L$$PWD/./ -lMLK INCLUDEPATH += $$PWD/. DEPENDPATH += $$PWD/. win32:!win32-g++: PRE_TARGETDEPS += $$PWD/./MLK.lib else:unix|win32-g++: PRE_TARGETDEPS += $$PWD/./libMLK.a
Et j'ai voulu utiliser dans ma classe MainWindow ma classe provenant de ma dll :
et donc là mon compilateur me dit qu'il ne connait pas ClasseAccessibleExterieur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #pragma comment(lib, "MLK.lib") namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); protected : ClasseAccessibleExterieur maClass; // et là le compilateur me dit qu'il ne connait pas ClasseAccessibleExterieur private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_H
donc j'imagine qu'il y a un fichier include à fournir et à inclure avant mais lequel? les faut-il tous ? sachant que mon fichier classeaccessinleexterieur.h inclus les autres?
Suis-je sur la bonne voie? ou suis-je complètement à coté de la plaque sur la manière de créer une lib?
PS :
Bon il semblerait qu'inclure les fichier .h ne suffise pas :
car lors de la compilation de mon logiciel j'obtiens tout une succession d'erreur comme celle ci :
et ceux pour toute les fonctions de ma classe ClasseAccessibleExterieur
Code : Sélectionner tout - Visualiser dans une fenêtre à part mainwindow.obj:-1: erreur : LNK2019: unresolved external symbol "__declspec(dllimport) public: __cdecl ClasseAccessibleExterieur::ClasseAccessibleExterieur(void)" (__imp_??0ClasseAccessibleExterieur@@QEAA@XZ) referenced in function "public: __cdecl MainWindow::MainWindow(class QWidget *)" (??0MainWindow@@QEAA@PEAVQWi
Partager