我正在尝试在Qt v5.1.1中使用新包含的QtSerialPort,但是在尝试编译时遇到了一些我没有多少经验的问题。从我的搜索看来,qt 5.1的QtSerialPort似乎没有构建并准备好使用,我是否正确?我如何使用Qt Creator或Visual Studio 2010进行准备?我刚刚从4.8.4升级并继承了该项目,所以我不确定以前做过什么。我已经找到了使用各种Linux版本进行编译的说明,但是对于Windows来说似乎没有任何一致性或直接性,所以我希望有人在这里有更具体的说明。
谢谢!
编辑:我会添加一两个特定的错误,也许这有助于确定我做错了什么。
error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall QSerialPort::metaObject(void)const " (?metaObject@QSerialPort@@UBEPBUQMetaObject@@XZ)
error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall QSerialPort::QSerialPort(class QObject *)" (__imp_??0QSerialPort@@QAE@PAVQObject@@@Z) referenced in function "public: __thiscall serial_client::serial_client(class QObject *)" (??0serial_client@@QAE@PAVQObject@@@Z)
这些只是在编译时出现的21个错误中的两个。正如我在评论中提到的,Visual Studio 2010或Qt Creator似乎都无法识别QtSerialPort库。
答案 0 :(得分:2)
好吧,在尝试了一堆不同的东西并结合来自不同地方的信息后,我设法让一切都搞清楚了。
它当然没有工作的原因很简单,该模块没有通过Qt5插件包含到Visual Studio中,这是因为它没有显示为可用模块。另一个问题是我没有安装Qt 5.1.1并安装了Source Dependencies,我只是选择了默认安装,它不包括QtSerialPort所需的任何内容。重新安装后,我在以下位置修改了我的VS项目设置:
注意:$(QTDIR)= C:\ Qt \ Qt5.1.1 \ 5.1.1 \ msvc2010_opengl \
之后我将Qt5SerialPort.dll和Qt5SerialPortd.dll分别添加到我项目中的Release和Debug文件夹中。
我很确定这些是我所做的唯一改变。我希望这对其他人有用!
答案 1 :(得分:0)
我使用QSerialPort在Qt5.0.2上做了一个小项目,在Linux和Windows XP / 7上运行良好。 在Linux上编译它是非常麻烦的,因为所有库已经到位。 要在Windows上编译它我在Windows上安装了QtCreator(不是Visual Studio)(没有交叉编译)。
首先你必须检查,如果QtCreator可以找到QSerialPort,那么它实际上应该已经在Windows下的QtCreator下编译它了。要部署程序,您必须确保所有使用过的QtLibraries都已到位。最简单的方法是将它放在与程序相同的目录中。 对于我的程序,这看起来像这样:
+平台(以下两个dll的目录)
-qwindows.dll
icudt51.dll
应该注意,使用的dll与编译器匹配! 32位与64位以及匹配使用的编译器( MinGW或Visual Studio编译器)。
打开我的串口的代码段:
void MainWindow::openSerialPort() { struct Settings p; /* Use name of ComPort from Combobox */ p.name = ui->cboComPort->currentText(); p.baudRate = 38400; p.dataBits = QSerialPort::Data8; p.parity = QSerialPort::NoParity; p.stopBits = QSerialPort::OneStop; p.flowControl = QSerialPort::NoFlowControl; p.stringBaudRate = "38400"; p.stringDataBits = "8"; p.stringParity = tr("no parity"); p.stringFlowControl = tr("no flow control"); p.stringStopBits = tr("1 stopbit"); serial->setPortName(p.name); if (serial->open(QIODevice::ReadWrite)) { if (serial->setBaudRate(p.baudRate) && serial->setDataBits(p.dataBits) && serial->setParity(p.parity) && serial->setStopBits(p.stopBits) && serial->setFlowControl(p.flowControl)) { //console->setEnabled(true); //console->setLocalEchoEnabled(p.localEchoEnabled); ui->actionConnect->setEnabled(false); ui->actionDisconnect->setEnabled(true); ui->actionConfigure->setEnabled(false); ui->statusBar->showMessage(tr("Connected to %1 : %2, %3, %4, %5, %6") .arg(p.name).arg(p.stringBaudRate).arg(p.stringDataBits) .arg(p.stringStopBits).arg(p.stringParity).arg(p.stringFlowControl)); } else { serial->close(); QMessageBox::critical(this, tr("Error"), serial->errorString()); ui->statusBar->showMessage(tr("Configure error")); } } else { QMessageBox::critical(this, tr("Error"), serial->errorString()); ui->statusBar->showMessage(tr("Open error")); } }