Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. As dynamic libraries to use class variables?
Forum Updated to NodeBB v4.3 + New Features

As dynamic libraries to use class variables?

Scheduled Pinned Locked Moved Solved General and Desktop
50 Posts 4 Posters 13.0k Views 3 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M Mikee

    This is my library:
    StrategyCod.pro:

    QT       -= gui
    
    TARGET = StrategyCod
    TEMPLATE = lib
    
    DEFINES += STRATEGYCOD_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 += \
            strategycod.cpp
    
    HEADERS += \
            strategycod.h \
            strategycod_global.h 
    
    unix {
        target.path = /usr/lib
        INSTALLS += target
    }
    
    #INCLUDEPATH = C: / Qt / project / MyCandleSrick/include
    INCLUDEPATH = "C:/Qt/project/MyCandleSrick"
    

    strategycod.h:

    #ifndef STRATEGYCOD_H
    #define STRATEGYCOD_H
    
    #include "strategycod_global.h"
    
    
    extern "C" {STRATEGYCODSHARED_EXPORT void StrategyCod();}
    
    class STRATEGYCODSHARED_EXPORT StrategyCod
    {
    
    //public:
       // StrategyCod1();
    };
    
    #endif // STRATEGYCOD_H
    
    

    strategycod_global.h:

    #ifndef STRATEGYCOD_GLOBAL_H
    #define STRATEGYCOD_GLOBAL_H
    
    #include <QtCore/qglobal.h>
    
    #if defined(STRATEGYCOD_LIBRARY)
    #  define STRATEGYCODSHARED_EXPORT Q_DECL_EXPORT
    #else
    #  define STRATEGYCODSHARED_EXPORT Q_DECL_IMPORT
    #endif
    
    #endif // STRATEGYCOD_GLOBAL_H
    

    strategycod.cpp:

    #include "strategycod.h"
    #include <QDebug>
    //#include "C:\\Qt\project\\MyCandleSrick\\mainwindow.h"
    //#include <mainwindow>
    //StrategyCod::StrategyCod1(){qDebug()<<"Library work1";}
    
    
    
    void StrategyCod()
    {
        //MainWindow w;
        qDebug()<<"Library work2";//<<w.NBar;
    }
    

    This is my app
    main.cpp

    #include "mainwindow.h"
    #include <QApplication>
    #include <cstdlib>
    #include <QMessageBox>
    #include <QtConcurrent/QtConcurrent>
    #include <QMutex>
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;    
        QLibrary MyLib("C:\\Qt\\project\\build-StrategyCod-Desktop_Qt_5_9_2_MinGW_32bit-Debug\\debug\\StrategyCod"); 
        MyLib.load();
        typedef void (*MyPrototype)();
        MyPrototype StrategyCod = (MyPrototype) MyLib.resolve("StrategyCod");
        StrategyCod();  
        MyLib.unload();
        w.show();
        return a.exec();
    }
    

    In the MainWindow class is written needed variables.
    But I can not create an object of MainWindow class in the library and can't use its variables.

    mrjjM Offline
    mrjjM Offline
    mrjj
    Lifetime Qt Champion
    wrote on last edited by
    #20

    Hi
    Ok, and you can call the void StrategyCod() function ? ( that works ?)
    If yes, you can now
    make it into

    void StrategyCod(MainWinow *main) ( it should know the type since u include its .h file)
    extern "C" {STRATEGYCODSHARED_EXPORT void StrategyCod(MainWinow *main);}

    and from main call it with
    typedef void (*MyPrototype)((MainWinow *);
    MyPrototype StrategyCod = (MyPrototype) MyLib.resolve("StrategyCod");
    StrategyCod(&w); // give it the real MainWindow

    There is no reason to try to create a new MainWindow inside the StrategyCod() function as
    that would be ANOTHER mainwindow than the running one and not have the right data.

    You should give it as parameter.

    Using mainwindow seems silly, a Data class would make more sense but can work.
    But you should NOT call any functions inside mainwindow from library as there is no event loop running and
    it will not work. But you should be able to use public member variables.

    1 Reply Last reply
    0
    • M Offline
      M Offline
      Mikee
      wrote on last edited by
      #21

      I can call the void StrategyCod() .
      I did:
      strategycod.h:

      #ifndef STRATEGYCOD_H
      #define STRATEGYCOD_H
      
      #include "strategycod_global.h"
      
      
      extern "C" {STRATEGYCODSHARED_EXPORT void StrategyCod(MainWinow * main);}
      
      class STRATEGYCODSHARED_EXPORT StrategyCod
      {
      
      //public:
         // StrategyCod1();
      };
      
      #endif // STRATEGYCOD_H
      

      strategycod.cpp:

      #include "strategycod.h"
      #include <QDebug>
      //#include "C:\\Qt\project\\MyCandleSrick\\mainwindow.h"
      //#include <mainwindow>
      //StrategyCod::StrategyCod1(){qDebug()<<"Library work1";}
      
      
      
      void StrategyCod(MainWinow * main)
      {
          //MainWindow w;
          qDebug()<<"Library work2";//<<w.NBar;
      }
      

      6 errors:
      C:\Qt\project\StrategyCod\strategycod.h:7: error: variable or field 'StrategyCod' declared void
      extern "C" {STRATEGYCODSHARED_EXPORT void StrategyCod(MainWinow * main);}
      ^
      C:\Qt\project\StrategyCod\strategycod.h:7: error: 'MainWinow' was not declared in this scope
      C:\Qt\project\StrategyCod\strategycod.h:7: error: 'main' was not declared in this scope
      extern "C" {STRATEGYCODSHARED_EXPORT void StrategyCod(MainWinow * main);}
      ^
      C:\Qt\project\StrategyCod\strategycod.cpp:9: оerror: variable or field 'StrategyCod' declared void
      void StrategyCod(MainWinow * main)
      ^
      C:\Qt\project\StrategyCod\strategycod.cpp:9: error: 'MainWinow' was not declared in this scope
      C:\Qt\project\StrategyCod\strategycod.cpp:9: error: 'main' was not declared in this scope
      void StrategyCod(MainWinow * main)
      ^

      mrjjM 1 Reply Last reply
      0
      • M Mikee

        I can call the void StrategyCod() .
        I did:
        strategycod.h:

        #ifndef STRATEGYCOD_H
        #define STRATEGYCOD_H
        
        #include "strategycod_global.h"
        
        
        extern "C" {STRATEGYCODSHARED_EXPORT void StrategyCod(MainWinow * main);}
        
        class STRATEGYCODSHARED_EXPORT StrategyCod
        {
        
        //public:
           // StrategyCod1();
        };
        
        #endif // STRATEGYCOD_H
        

        strategycod.cpp:

        #include "strategycod.h"
        #include <QDebug>
        //#include "C:\\Qt\project\\MyCandleSrick\\mainwindow.h"
        //#include <mainwindow>
        //StrategyCod::StrategyCod1(){qDebug()<<"Library work1";}
        
        
        
        void StrategyCod(MainWinow * main)
        {
            //MainWindow w;
            qDebug()<<"Library work2";//<<w.NBar;
        }
        

        6 errors:
        C:\Qt\project\StrategyCod\strategycod.h:7: error: variable or field 'StrategyCod' declared void
        extern "C" {STRATEGYCODSHARED_EXPORT void StrategyCod(MainWinow * main);}
        ^
        C:\Qt\project\StrategyCod\strategycod.h:7: error: 'MainWinow' was not declared in this scope
        C:\Qt\project\StrategyCod\strategycod.h:7: error: 'main' was not declared in this scope
        extern "C" {STRATEGYCODSHARED_EXPORT void StrategyCod(MainWinow * main);}
        ^
        C:\Qt\project\StrategyCod\strategycod.cpp:9: оerror: variable or field 'StrategyCod' declared void
        void StrategyCod(MainWinow * main)
        ^
        C:\Qt\project\StrategyCod\strategycod.cpp:9: error: 'MainWinow' was not declared in this scope
        C:\Qt\project\StrategyCod\strategycod.cpp:9: error: 'main' was not declared in this scope
        void StrategyCod(MainWinow * main)
        ^

        mrjjM Offline
        mrjjM Offline
        mrjj
        Lifetime Qt Champion
        wrote on last edited by
        #22

        Hi
        You must include mainwindw.h so it knows type

        trategycod.cpp:
        #include "mainwindow.h" // should know where to find it due to the INCLUDEPATH in .pro file

        1 Reply Last reply
        1
        • M Offline
          M Offline
          Mikee
          wrote on last edited by Mikee
          #23

          When i do this same error appers:
          C:\Qt\project\MyCandleSrick\mainwindow.h:4: error: QMainWindow: No such file or directory

          In the file C:/Qt/project/MyCandleSrick/mainwindow.h:
          4:#include <QMainWindow>

          mrjjM 1 Reply Last reply
          0
          • M Mikee

            When i do this same error appers:
            C:\Qt\project\MyCandleSrick\mainwindow.h:4: error: QMainWindow: No such file or directory

            In the file C:/Qt/project/MyCandleSrick/mainwindow.h:
            4:#include <QMainWindow>

            mrjjM Offline
            mrjjM Offline
            mrjj
            Lifetime Qt Champion
            wrote on last edited by mrjj
            #24

            @Mikee
            Well you library is with

            QT -= gui

            so it dont know QMainwindow type ( or any Qt widget type)

            1 Reply Last reply
            1
            • M Offline
              M Offline
              Mikee
              wrote on last edited by
              #25

              I fixed strategycod.pro:

              QT       += core gui
              
              TARGET = StrategyCod
              TEMPLATE = lib
              
              DEFINES += STRATEGYCOD_LIBRARY
              DEFINES += QT_DEPRECATED_WARNINGS
              SOURCES += \
                      strategycod.cpp
              
              HEADERS += \
                      strategycod.h \
                      strategycod_global.h 
              
              unix {
                  target.path = /usr/lib
                  INSTALLS += target
              }
              INCLUDEPATH = "C:/Qt/project/MyCandleSrick"
              

              But the error is the same.

              1 Reply Last reply
              0
              • M Offline
                M Offline
                Mikee
                wrote on last edited by
                #26

                I done this in strategycod.pro

                INCLUDEPATH = "C:/Qt/project/MyCandleSrick"  "C:/Qt/Qt5.9.2/5.9.2/Src/qtbase/include/QtWidgets"
                

                Now it included <QMainWindow>. But it isnt working now

                extern "C" {STRATEGYCODSHARED_EXPORT void StrategyCod(MainWinow * main);}
                

                and

                void StrategyCod(MainWinow * main)
                

                errors:
                C:\Qt\project\StrategyCod\strategycod.h:7: error: variable or field 'StrategyCod' declared void
                extern "C" {STRATEGYCODSHARED_EXPORT void StrategyCod(MainWinow * main);}
                ^
                C:\Qt\project\StrategyCod\strategycod.h:7: error: 'MainWinow' was not declared in this scope
                C:\Qt\project\StrategyCod\strategycod.h:7: error: 'main' was not declared in this scope
                extern "C" {STRATEGYCODSHARED_EXPORT void StrategyCod(MainWinow * main);}
                ^
                C:\Qt\project\StrategyCod\strategycod.cpp:9: оerror: variable or field 'StrategyCod' declared void
                void StrategyCod(MainWinow * main)
                ^
                C:\Qt\project\StrategyCod\strategycod.cpp:9: error: 'MainWinow' was not declared in this scope
                C:\Qt\project\StrategyCod\strategycod.cpp:9: error: 'main' was not declared in this scope
                void StrategyCod(MainWinow * main)

                1 Reply Last reply
                0
                • SGaistS Offline
                  SGaistS Offline
                  SGaist
                  Lifetime Qt Champion
                  wrote on last edited by
                  #27

                  Because when you do INCLUDEPATH = you replace the content of that variable with what follows. Use INCLUDEPATH += to append your folders to it.

                  Interested in AI ? www.idiap.ch
                  Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                  1 Reply Last reply
                  2
                  • M Offline
                    M Offline
                    Mikee
                    wrote on last edited by
                    #28

                    Now all includes are working.
                    When I use function

                    void StrategyCod(MainWindow * main)
                    {
                        //MainWindow w;
                        main->NBar;
                        qDebug()<<"Library work2"<<main->NBar;//<<w.NBar;
                    }
                    

                    qDebug message is not a valid value NBar

                    1 Reply Last reply
                    0
                    • M Offline
                      M Offline
                      Mikee
                      wrote on last edited by
                      #29

                      I think that need to do reference class variable. But this code isn't working

                      void StrategyCod(/*MainWindow * main*/)
                      {
                          long long &NBar1 =MainWindow.NBar;
                          qDebug()<<"Library work2";//<<w.NBar;
                      }
                      
                      

                      How can i do reference?

                      mrjjM 1 Reply Last reply
                      0
                      • M Mikee

                        I think that need to do reference class variable. But this code isn't working

                        void StrategyCod(/*MainWindow * main*/)
                        {
                            long long &NBar1 =MainWindow.NBar;
                            qDebug()<<"Library work2";//<<w.NBar;
                        }
                        
                        

                        How can i do reference?

                        mrjjM Offline
                        mrjjM Offline
                        mrjj
                        Lifetime Qt Champion
                        wrote on last edited by mrjj
                        #30

                        @Mikee

                        via the parameter ( main or what u called it)

                        void StrategyCod(MainWindow * main) {
                            qDebug()<<"Library work2"<<main->NBar;
                        }
                        

                        if NBAr is wrong, then something else is wrong. not the function
                        it might be you call StrategyCod BEFORE setting it in mainwindow or
                        something like that.

                        1 Reply Last reply
                        0
                        • M Offline
                          M Offline
                          Mikee
                          wrote on last edited by
                          #31

                          I checked:
                          library:
                          void StrategyCod(double Parametr)

                          {
                              MainWindow *w;
                              qDebug()<<"Library work2"<<Parametr<<w->NBar;
                          }
                          

                          main.cpp:

                          QLibrary MyLib("C:\\Qt\\project\\build-StrategyCod-Desktop_Qt_5_9_2_MinGW_32bit-Debug\\debug\\StrategyCod");  
                              MyLib.load();
                              typedef void (*MyPrototype)();
                              MyPrototype StrategyCod = (MyPrototype) MyLib.resolve("StrategyCod");
                              qDebug()<<w.NBar;  //NBar=0 is hear 
                              StrategyCod();  //NBar=5943858560 is hear 
                              MyLib.unload();
                          

                          Maybe here typedef void (*MyPrototype)(); need append void (*MyPrototype)(class); ?

                          mrjjM 1 Reply Last reply
                          0
                          • M Mikee

                            I checked:
                            library:
                            void StrategyCod(double Parametr)

                            {
                                MainWindow *w;
                                qDebug()<<"Library work2"<<Parametr<<w->NBar;
                            }
                            

                            main.cpp:

                            QLibrary MyLib("C:\\Qt\\project\\build-StrategyCod-Desktop_Qt_5_9_2_MinGW_32bit-Debug\\debug\\StrategyCod");  
                                MyLib.load();
                                typedef void (*MyPrototype)();
                                MyPrototype StrategyCod = (MyPrototype) MyLib.resolve("StrategyCod");
                                qDebug()<<w.NBar;  //NBar=0 is hear 
                                StrategyCod();  //NBar=5943858560 is hear 
                                MyLib.unload();
                            

                            Maybe here typedef void (*MyPrototype)(); need append void (*MyPrototype)(class); ?

                            mrjjM Offline
                            mrjjM Offline
                            mrjj
                            Lifetime Qt Champion
                            wrote on last edited by
                            #32

                            @Mikee
                            Yes it must all match.

                            typedef void (*MyPrototype)();

                            means pointer to function takes no parameters
                            which is untrue.

                            1 Reply Last reply
                            0
                            • M Offline
                              M Offline
                              Mikee
                              wrote on last edited by
                              #33

                              But what to do with NBar?

                              void StrategyCod()
                              {
                                  MainWindow *w;
                                  qDebug()<<"Library work2"<<w->NBar;
                                
                              }
                              
                              jsulmJ 1 Reply Last reply
                              0
                              • M Mikee

                                But what to do with NBar?

                                void StrategyCod()
                                {
                                    MainWindow *w;
                                    qDebug()<<"Library work2"<<w->NBar;
                                  
                                }
                                
                                jsulmJ Offline
                                jsulmJ Offline
                                jsulm
                                Lifetime Qt Champion
                                wrote on last edited by
                                #34

                                @Mikee

                                typedef void (*MyPrototype)(MainWindow *w);
                                

                                https://forum.qt.io/topic/113070/qt-code-of-conduct

                                1 Reply Last reply
                                0
                                • M Offline
                                  M Offline
                                  Mikee
                                  wrote on last edited by Mikee
                                  #35

                                  I have done this and it's working

                                   QLibrary MyLib("C:\\Qt\\project\\build-StrategyCod-Desktop_Qt_5_9_2_MinGW_32bit-Debug\\debug\\StrategyCod");  
                                      MyLib.load();
                                      typedef void (*MyPrototype)(MainWindow *);
                                      MyPrototype StrategyCod = (MyPrototype) MyLib.resolve("StrategyCod");
                                      StrategyCod(&w);  
                                      qDebug()<<"q1"<< q1;
                                      MyLib.unload();
                                  

                                  Thank you

                                  1 Reply Last reply
                                  1
                                  • mrjjM Offline
                                    mrjjM Offline
                                    mrjj
                                    Lifetime Qt Champion
                                    wrote on last edited by
                                    #36

                                    Congrats :)

                                    1 Reply Last reply
                                    1
                                    • M Offline
                                      M Offline
                                      Mikee
                                      wrote on last edited by
                                      #37

                                      I have are new problem.

                                      qDebug()<<NBar;
                                      

                                      return NBar=1064,

                                      qDebug()<<"Library work2"<< Parametr<<w->NBar;
                                      

                                      return NBar=0
                                      In class MainWindow:

                                      void MainWindow::on_ButtonRuneOne_clicked()//запуск стратегии на одном ядре
                                      {
                                          bool ok;
                                          double d = QInputDialog::getDouble(this, tr("ParametrForStrategy"),
                                                                                 tr("double:"), 37.56, -100000, 100000, 6, &ok);
                                          if (ok) {ParametrForStrategyCod=d; }
                                      
                                          QLibrary MyLib("C:\\Qt\\project\\build-StrategyCod-Desktop_Qt_5_9_2_MinGW_32bit-Debug\\debug\\StrategyCod");  
                                          MyLib.load();
                                          typedef void (*MyPrototype)(double,MainWindow *);
                                          MyPrototype StrategyCod = (MyPrototype) MyLib.resolve("StrategyCod");
                                          MainWindow w;
                                          qDebug()<<NBar;
                                          StrategyCod(ParametrForStrategyCod,&w);  /
                                          MyLib.unload();
                                      }
                                      

                                      In library:

                                      void StrategyCod(double Parametr, MainWindow *w)
                                      {
                                          qDebug()<<"Library work2"<< Parametr<<w->NBar;
                                      }
                                      

                                      But in main.cpp it works good. How can I fix problem with link of object class?

                                      1 Reply Last reply
                                      0
                                      • SGaistS Offline
                                        SGaistS Offline
                                        SGaist
                                        Lifetime Qt Champion
                                        wrote on last edited by
                                        #38

                                        You're passing w to your method which is not the current MainWindow object you are calling StrategyCod from.

                                        Pass this to the method.

                                        On a side note, you are doing some pretty convoluted stuff here for what seems to be a pretty simple task. I'd encourage you to re-think a bit the design of your application.

                                        Interested in AI ? www.idiap.ch
                                        Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                                        1 Reply Last reply
                                        3
                                        • M Offline
                                          M Offline
                                          Mikee
                                          wrote on last edited by
                                          #39

                                          Thank you. I wrote it like this

                                          StrategyCod(ParametrForStrategyCod,this); 
                                          

                                          and it works

                                          1 Reply Last reply
                                          0

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved