serial port in dll
-
You don't need to add Qt5SerialPort.lib.
The error you are getting is that the linker cannot find the implementation of "Messwert_Zuordnung_DLL::Messwert_zuordnung".
Like I said this is either due to:a) incorrectly linking to your dll
b) not declaring the function/class for exportBoth situations are explained in:
http://doc.qt.io/qt-5/sharedlibrary.html
So if the problem persist, please make sure that both conditions are fulfilled exactly as described in the link.
-
This is my header file:
#if defined(MESSWERT_ZUORDNUNG_DLL_LIBRARY) # define MESSWERT_ZUORDNUNG_DLLSHARED_EXPORT Q_DECL_EXPORT #else # define MESSWERT_ZUORDNUNG_DLLSHARED_EXPORT Q_DECL_IMPORT #endif class MESSWERT_ZUORDNUNG_DLLSHARED_EXPORT Messwert_Zuordnung_DLL { public: Messwert_Zuordnung_DLL(); void uebergabe(double messmeth,double messint, double bauteillaenge, double interpol, double anz_messungen, double abs_messungen); };
Therefore I think it is like mentioned in the link.
The linking to my dll consists of the following points:
-include the header files in my tets programm (copy them in the same direction)
-DEPENDPATH/INCLUDEPATH path to the folder where the .dll/.obj/.lib files are
-LIBS -L Path to dll -lname of dll
-HEADER name the headers to includeSo i followed the description in the link but I just cant see where my faults are ?!
Should I send you my files ?regards
-
Hi and welcome to devnet,
Did you re-run qmake after adding
QT += serialport
? -
Yes I run qmake.
I tried to set the paths to the folder where my test program is.
Now I get the error:
main.obj:-1: Fehler: LNK2019:unresolved external symbol""__declspec(dllimport) public: void __cdecl Messwert_Zuordnung_DLL::uebergabe(double,double,double,double,double,double)" (_imp?uebergabe@Messwert_Zuordnung_DLL@@QEAAXNNNNNN@Z)" in function "main".regards
-
Did you check that you are doing the property symbol exporting ? Define name for activating the export macro etc. ?
-
Do you this macro: MESSWERT_ZUORDNUNG_DLL_LIBRARY defined in the pro file of your library?
-
I choose to use QLibrary instead of implementing the dll by myself. Therefore I used the following code in my main.cpp:
QLibrary library("Messwert_Zuordnung_DLL.dll"); if (!library.load()) qDebug() << library.errorString(); if (library.load()) qDebug() << "library loaded"; library.resolve("uebergabe");
I am not really shure, that this is the proper use of QLibrary but it builds without an error.
So I think it might work.
If my dll gives simply the value in qDebug() out which I write in the dll function in my test programm it works.
But if I try to establish a serial connection, my microcontroller does not recognize a input. So there is a fault in the use of the QSerialPort in my code. The same code is used in a GUI where it works. I only did not use the connect() function and in the definition of my port serial* = new QSerialPort (this) I didn´t write this. Because I have no parent object here. Do I have to establish a QObject for this ? Or is there any other problem with the use of QSerialPort in a dll ?Here is my code:
QSerialPort *serial; serial = new QSerialPort(); //+++++++++++++++++++++++++++++++++++ //+++++++++++++++++++++++++++++++++++ //COM-Port ! serial->setPortName("COM12"); //+++++++++++++++++++++++++++++++++++ //+++++++++++++++++++++++++++++++++++ serial->setBaudRate(QSerialPort::Baud115200); serial->setDataBits(QSerialPort::Data8); serial->setParity(QSerialPort::NoParity); serial->setStopBits(QSerialPort::OneStop); serial->setFlowControl(QSerialPort::SoftwareControl); serial->open(QIODevice::ReadWrite); //conversion of the variables for the use of the send function QByteArray messint_s = QByteArray::number(messint); QByteArray bauteillaenge_s = QByteArray::number(bauteillaenge); QByteArray interpol_s = QByteArray::number(interpol); QByteArray anz_messungen_s = QByteArray::number(anz_messungen); QByteArray abs_messungen_s = QByteArray::number(abs_messungen); //Sending the variables to my microcontroller serial->write("1"); serial->write("\n");
regards
-
Was it dll_tester that you failed to link ? If so, you were not linking to the library.
You need to delete serial by hand when not using it anymore otherwise you'll be leaking memory
-
@SGaist
I don´t know where my fault was. I think it was some linking problem but I don´t know how to solve so I use QLibrary.Ok you mean that I have to close the serialport at the end of the dll ?
Can you see any other fault? Because the serial connection is not working . -
You have to delete serial. IIRC that should also close it.
In any case, you should recheck your project and make it link properly to your library. Using QLibrary as a workaround is not the proper thing to do.
-
@SGaist
Yes but this should only be a test program to see if the dll works correctly. In the end the dll is used in an othe context, so I want to focus on the function of the dll. Alltough it would be nice to know where my fault was. But I did everything like in the description in the links above nothing works, so I have to move on to loos not more time.But why doesn´t works my serial connection ? That is in the moment my biggest problem.
Do I have to create a QObject as parent when I don´t have a window as parent ?
Is the connect function necessary ?
I thought the use is only to refer the connection fe to a button. But in a dll it should be unnecessary.Is this maybe the troublemaker?
-
Why it doesn't work ? I can't tell, that's Crystal Ball debugging at this point. However, you don't check that that your device opened successfully
-
Yeah that´s kind of diffucult. But I need help because I dont´t know how to figure out where my problem is.
I tried in a working serial port GUI to delete the connect() function and the "this" in new QSerialPort(this). It is still working. So the code should work.With : if(!serial->open(QIODevice::ReadWrite)){qDebug()<<"Connection failed"}. I figured out, that the connection is not opened.
I get the return value: -1073741510. Knows anybody what this means?
regards
-
Your application has been aborted e.g. you stopped it brutally.
Did you check the returned error ? What is it ?
-
@SGaist
How to check the error ? My program runs without showing an error. But there has to be one because the serial connection can´t be opened.I tried to use : qDebug()<< serial->errorString();
But the output was "Unkown error". -
Ok, then just create on minimal application that opens that serial port and tries to write to / read from it. That will at least help check that your serial port is working correctly
-
@SGaist
My first project was a GUI that communicates with that serial port.
This still works fine. I used the same code to implement the serial connection in the dll file. Only the parent object, if i create the new QSerialPort, in thr parenthesis is empty. And i do not use the connect () function. If i change the code in the GUI it still works.
In the GUI as well as in the dll the serial connection us only used to send a few variables to a microcontroller. So it should be a minimal requirement to the serial. Maybeit it is not possible to write a dll that opens a serial port at runtime ? -
There's no such restriction.
Since you had trouble with the library in the first place, the next step is to create a minimal library that will provide some dummy function and link to it. Don't use QLibrary to load, just make your application link to it properly.
-
Ok I just tried to create a new one.
My steps:
*Qt Creator -> new -> dll
*add a dummy function under public in my header
*dummy function in the cpp file: qDebug() << dll works*create a new console application
*right click add existing file: mark the two header files from my dll
*set the paths: -> INCLUDEPATH += folder from my dll where the headers are
->DEPENDPATH+= same folder as above
->LIBS+= -Ldebug folder of my dll file -lname of my dll file
*copy the dll in the debug folder of the test program
*in the test programm i add in the cpp file:
-> include the header
->create new object
-> call the function from the dllAll works well. But if I try to pass an integer through the function to my dll I get an unresolved symbol error.
After I changed my dll I re-build it and changed the copied files through the new ones. -
Can you show the code where you pass that integer ?