Qt5 VS 2010 - QtSerialPort 库失败

Posted

技术标签:

【中文标题】Qt5 VS 2010 - QtSerialPort 库失败【英文标题】:Qt5 VS 2010 - QtSerialPort Library Failure 【发布时间】:2013-11-07 22:14:32 【问题描述】:

我正在尝试使用 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 个错误中的两个。正如我在 cmets 中提到的,Visual Studio 2010 或 Qt Creator 似乎都无法识别 QtSerialPort 库。

【问题讨论】:

到底是什么问题?没有 QtSerialPort 专用文档,因为它只是 Qt 方式......我认为我们不应该添加更多。 @LaszloPapp 关联的库无法被 Qt 使用 Visual Studio 2010 或随 5.1.1 安装的 Qt Creator 来识别和引用。它应该开箱即用吗? 是的,它应该默认工作...我不知道为什么它不工作。 @LaszloPapp 我想通了。从 1.2.2 开始,QtSerialPort 不是 Qt5 插件中的可用模块,所以我必须自己弄清楚配置。另外,我没有进行完整的安装,只有 Qt5.1.1 的默认安装,因此源文件不可用。重新安装解决了这个问题。 很高兴你解决了。 :) 【参考方案1】:

好的,在尝试了一堆不同的东西并结合了来自不同地方的信息之后,我设法弄清楚了一切并开始工作。

它不起作用的原因当然很简单,该模块没有通过 Qt5 插件包含在 Visual Studio 中,原因很简单,即它没有显示为可用模块。另一个问题是我没有安装 Qt 5.1.1 并安装了 Source Dependencies,我只是选择了默认安装,它不包含任何 QtSerialPort 所需的内容。重新安装后,我在以下位置修改了我的 VS 项目设置:

    项目属性 -> 配置属性 -> C/C++ -> 常规 -> 附加包含目录,添加行:$(QTDIR)\include\QtSerialPort 项目属性 -> 配置属性 -> C/C++ -> 预处理器 -> 预处理器定义,添加行:QT_SERIALPORT_LIB 项目属性->配置属性->链接器->输入->附加依赖,添加行:Qt5SerialPort.lib

注意:$(QTDIR) = C:\Qt\Qt5.1.1\5.1.1\msvc2010_opengl\

之后,我将 Qt5SerialPort.dll 和 Qt5SerialPortd.dll 分别添加到我的项目中的 Release 和 Debug 文件夹中。

我相当肯定这些是我所做的唯一更改。我希望这对其他人有用!

【讨论】:

对于 QT 5.3.2,我必须在项目 .pro 文件中添加以下内容:'QT += serialport'(不带引号)【参考方案2】:

我用 Qt5.0.2 和 QSerialPort 做了一个小项目,在 Linux 和 Windows XP/7 上运行良好。 在 Linux 上编译它非常轻松,因为所有库都已经到位。 为了在 Windows 上编译它,我使用了安装在 Windows 上的 QtCreator(不是 Visual Studio)(没有交叉编译)。

首先你必须检查,如果 QtCreator 可以找到 QSerialPort,那么它实际上应该已经可以在 Windows 下的 QtCreator 下编译它。要部署程序,您必须确保所有使用的 QtLibraries 都已到位。最简单的方法是将其放在与您的程序相同的目录中。 对于我的程序,这看起来像这样:

+platforms(有以下两个dll的目录)

-qminimal.dll

-qwindows.dll

icudt51.dll

icuin51.dll icuuc51.dll libEGL.dll libGLESv2.dll Qt5Core.dll Qt5Gui.dll Qt5SerialPort.dll Qt5Widgets.dll

应注意使用的 dll 与您的编译器匹配32bit vs 64bit 以及匹配使用的编译器(MinGW 或 Visual Studio Compiler)。

代码 sn-p 打开我的串口:

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"));


【讨论】:

以上是关于Qt5 VS 2010 - QtSerialPort 库失败的主要内容,如果未能解决你的问题,请参考以下文章

怎样VS2013下安装Qt5的插件

怎样VS2013下安装Qt5的插件

怎样VS2013下安装Qt5的插件

VS2010配置QT5.5.0开发环境

qt5的.ui文件在VS2010中无法编译问题

qt5.5.1+vs2010发送邮件