Solved As dynamic libraries to use class variables?
-
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)
^ -
Hi
You must include mainwindw.h so it knows typetrategycod.cpp:
#include "mainwindow.h" // should know where to find it due to the INCLUDEPATH in .pro file -
When i do this same error appers:
C:\Qt\project\MyCandleSrick\mainwindow.h:4: error: QMainWindow: No such file or directoryIn the file C:/Qt/project/MyCandleSrick/mainwindow.h:
4:#include <QMainWindow> -
-
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.
-
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) -
Because when you do
INCLUDEPATH =
you replace the content of that variable with what follows. UseINCLUDEPATH +=
to append your folders to it. -
Now all includes are working.
When I use functionvoid StrategyCod(MainWindow * main) { //MainWindow w; main->NBar; qDebug()<<"Library work2"<<main->NBar;//<<w.NBar; }
qDebug message is not a valid value NBar
-
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?
-
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. -
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); ?
-
@Mikee
Yes it must all match.typedef void (*MyPrototype)();
means pointer to function takes no parameters
which is untrue. -
But what to do with NBar?
void StrategyCod() { MainWindow *w; qDebug()<<"Library work2"<<w->NBar; }
-
typedef void (*MyPrototype)(MainWindow *w);
-
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
-
Congrats :)
-
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?
-
You're passing
w
to your method which is not the current MainWindow object you are callingStrategyCod
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.
-
Thank you. I wrote it like this
StrategyCod(ParametrForStrategyCod,this);
and it works
-
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();