Partage
  • Partager sur Facebook
  • Partager sur Twitter

Création de ma première librairie

question sur les includes a fournir

Sujet résolu
    26 octobre 2018 à 11:14:31

    Bonjour à tous, 

    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 : 

    #-------------------------------------------------
    #
    # 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 : 

    #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
    

    et voici ma classe à rendre accessible vers l’extérieur:

    #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


    Bon jusque là faite moi savoir si il manque des choses importantes.

    J'ai donc maintenant souhaitez inclure mon fichier "mlk.lib" dans un autre projet (toujours sous QtCreator) 

    J'ai donc fait ceci dans mon fichier monSoft.pro

    #-------------------------------------------------
    #
    # 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 MainWindows ma classe provenant de ma lib : 

    #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
    

    et donc là mon compilateur me dit qu'il ne connait pas ClasseAccessibleExterieur. 

    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 suffisent pas :

    car lors de la compilation de mon logiciel j'obtiens tout une succession d'erreur comme celle ci  : 

    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@PEAVQWidget@@@Z)


    et ceux pour toute les fonctions de ma classe ClasseAccessibleExterieur

    -
    Edité par flamme34 29 octobre 2018 à 9:18:52

    • Partager sur Facebook
    • Partager sur Twitter
      27 octobre 2018 à 20:35:29

      Je ne comprends pas, tu parles d'abord d'une librairie .lib, donc statique, puis d'une dll, donc dynamique. Tu as 2 librairies?

      De plus, comment ton compilateur connaîtrait-il à quoi correspond "ClasseAccessibleExterieur". Si c'est une librairie en .lib, en principe il faudrait inclure le fichier d'entête correspondant dans ton programme de test.

      • Partager sur Facebook
      • Partager sur Twitter
        29 octobre 2018 à 9:17:13

        Bonjour, 

        Tout d'abord merci de prendre le temps de m'aider.

        zoup a écrit:

        Je ne comprends pas, tu parles d'abord d'une librairie .lib, donc statique, puis d'une dll, donc dynamique. Tu as 2 librairies?


        Oups non je parle en effet d'un fichier .lib, il n'y en a bien qu'un seul. Mon clavier a fourché. Je vais modifier mon post :euh:

        zoup a écrit:

        De plus, comment ton compilateur connaîtrait-il à quoi correspond "ClasseAccessibleExterieur". Si c'est une librairie en .lib, en principe il faudrait inclure le fichier d'entête correspondant dans ton programme de test.

        Depuis j'ai bien compris ça, comme indiqué dans mon "PS",  et j'ai modifier mon fichier pro de la manière suivante pour inclure mes fichier d'entêtes : 

        INCLUDEPATH += $$PWD/MLK/Includes
        LIBS += -L$$PWD/MLK/Build/Release/release/ -lMLK
        

        mais cela ne semble pas mieux fonctionner car lors de la compilation de mon soft j'obtiens l'erreur suivante : 

        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@PEAVQWidget@@@Z)


        PS: 

        Bon il semble que j'ai trouvé : 

        sur le lien suivant 

        https://het.as.utexas.edu/HET/Software/html/sharedlibrary.html

        il est dit qu'il faut ajouter au .pro de monSoft le DEFINE défini dans mlk_global.hh soit: 

        DEFINES += MLK_LIBRARY



        En espérant que ça puisse aider d'autres personnes

        -
        Edité par flamme34 29 octobre 2018 à 9:31:27

        • Partager sur Facebook
        • Partager sur Twitter

        Création de ma première librairie

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown