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?
Qt 6.11 is out! See what's new in the release blog

As dynamic libraries to use class variables?

Scheduled Pinned Locked Moved Solved General and Desktop
50 Posts 4 Posters 34.9k 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 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
                                • M Offline
                                  M Offline
                                  Mikee
                                  wrote on last edited by
                                  #40

                                  How can I create lamda function in the slot of the class?

                                  
                                         QVector <double> Perebor1;
                                         for (double i=d1;i<=d2;i=i+d3) 
                                         {
                                             Perebor1.append(i);
                                         }
                                         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");
                                         //StrategyCod(ParametrForStrategyCod,this);  
                                         QFuture<void> Perebor2 = QtConcurrent::map(Perebor1,[&](const double& d){ StrategyCod(d,this);}); 
                                         MyLib.unload();
                                  
                                  1 Reply Last reply
                                  0
                                  • M Offline
                                    M Offline
                                    Mikee
                                    wrote on last edited by Mikee
                                    #41

                                    And if I do, the function does not work.

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

                                    error:
                                    Invalid parameter passed to C runtime function.
                                    Invalid parameter passed to C runtime function.

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

                                      Well if Perebor2 still runs when you do MyLib.unload()
                                      its not so nice for it...

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

                                        How to wait for all Perebor2?
                                        How to change w->NBar throw StrategyCod? If I do it in one thred

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

                                        it compiles, but when it works errors appears:
                                        ASSERT failure in QVector<T>::operator[]: "index out of range", file ....\Qt5.9.2\5.9.2\mingw53_32\include/QtCore/qvector.h, line 430
                                        Invalid parameter passed to C runtime function.
                                        Invalid parameter passed to C runtime function.

                                        mrjjM 1 Reply Last reply
                                        0
                                        • M Mikee

                                          How to wait for all Perebor2?
                                          How to change w->NBar throw StrategyCod? If I do it in one thred

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

                                          it compiles, but when it works errors appears:
                                          ASSERT failure in QVector<T>::operator[]: "index out of range", file ....\Qt5.9.2\5.9.2\mingw53_32\include/QtCore/qvector.h, line 430
                                          Invalid parameter passed to C runtime function.
                                          Invalid parameter passed to C runtime function.

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

                                          @Mikee
                                          Dont wait for it.
                                          Just move the MyLib.unload(); to a better place.

                                          also if you have

                                          void mainwindow::somefunction {
                                          QVector <double> Perebor1;
                                          for (double i=d1;i<=d2;i=i+d3)
                                          {
                                          Perebor1.append(i);
                                          }
                                          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");
                                          //StrategyCod(ParametrForStrategyCod,this);
                                          QFuture<void> Perebor2 = QtConcurrent::map(Perebor1,[&](const double& d){ StrategyCod(d,this);});
                                          MyLib.unload();
                                          } // Perebor1 is deleted here.

                                          Perebor1 also dies as its a local
                                          so make them member variables of the class
                                          and structure code better.

                                          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