serial port in dll
-
@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 ?
-
In the dll i specified the following function:
-header
public:
void Test(int a);-cpp
qDebug()<< a;in the Test program:
int b=1;
MyLib c ;
c.test(b);The exact error message is:
main.obj:-1: Error: LNK2019: unresolved symbol ""__declspec(dllimport) public: void __cdecl MyLib::Test(int)" (_imp?Test@MyLib@@QEAAXH@Z)" in function "main". -
You are not exporting Test properly
-
@SGaist
How to do so ?
Where is my fault ? -
You have a nice explanation in the Creating shared libraries chapter of Qt's documentation
-
@SGaist
I red this chapter already and my header files as well as the pro file are as specified in the explanation:
dll.h:#ifndef MESSWERT_ZUORDNUNG_DLL_H #define MESSWERT_ZUORDNUNG_DLL_H #include "messwert_zuordnung_dll_global.h" MESSWERT_ZUORDNUNG_DLLSHARED_EXPORT void Test(int a); class MESSWERT_ZUORDNUNG_DLLSHARED_EXPORT Messwert_zuordnung_dll { public: Messwert_zuordnung_dll(); void Test(int a); }; #endif // MESSWERT_ZUORDNUNG_DLL_H
dll_global.h
#ifndef MESSWERT_ZUORDNUNG_DLL_GLOBAL_H #define MESSWERT_ZUORDNUNG_DLL_GLOBAL_H #include <QtCore/qglobal.h> #if defined(MESSWERT_ZUORDNUNG_DLL_LIBRARY) # define MESSWERT_ZUORDNUNG_DLLSHARED_EXPORT Q_DECL_EXPORT #else # define MESSWERT_ZUORDNUNG_DLLSHARED_EXPORT Q_DECL_IMPORT #endif #endif // MESSWERT_ZUORDNUNG_DLL_GLOBAL_H
I cant see a big difference.
-
Following your various piece of code, you don't have any class called MyLib containing Test(int) nor any namespace containing such a function
-
@SGaist
I changed the name, because the actual is a bit long. My class is Messwert_zuordnung_dll.
The function for the export is Test. -
Ok so your
MyLib c; c.test(b);
should rather be:
Messwert_zuordnung_dll mzd; mzd.Test(b);
correct ?
So, when you are building your dll, do you get both the dll and corresponding lib file ?
-
@SGaist
Yes that´s correct. Sorry at this point for the confusion with the names.Yes the build creates a .dll/.lib and .obj file.
At the beginning I had some trouble with the link I set as dependent path and libs in the pro file because there where a space in it. The error said "could not open .obj" so maybe it the program tries to open the .obj instead of the .dll ? -
No, you should link to the lib file. However having space in your path on Windows is generally a Bad Thing (™) so just avoid them altogether
-
@SGaist
Yes I realized that this is a problem and renamed the folder. But this was just at the beginning, now it has to be an other problem -
It still can't find it ? Did you implement Test(int a) ?
-
@SGaist
What exactly do you mean with implement ?
Under the exportet class in "public" I added "void Test(int a)" and right clicked refractor and added the function to the cpp file. -
Then it's been implemented