Qt5 VS 2010 - QtSerialPort库故障

时间:2013-11-07 22:14:33

标签: c++ visual-studio-2010 qt qt5 qtserialport

我正在尝试在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库。

2 个答案:

答案 0 :(得分:2)

好吧,在尝试了一堆不同的东西并结合来自不同地方的信息后,我设法让一切都搞清楚了。

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

  1. 项目属性 - >配置属性 - > C / C ++ - >一般 - >附加包含目录,添加行:$(QTDIR)\ include \ QtSerialPort
  2. 项目属性 - >配置属性 - > C / C ++ - >预处理器 - >预处理器定义,添加行:QT_SERIALPORT_LIB
  3. 项目属性 - >配置属性 - >链接器 - >输入 - >附加依赖项,添加行:Qt5SerialPort.lib
  4. 注意:$(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的目录)

    • -qminimal.dll
    • -qwindows.dll

    • icudt51.dll

    • icuin51.dll
    • icuuc51.dll
    • libEGL.dll
    • libGLESv2.dll
    • Qt5Core.dll
    • Qt5Gui.dll
    • Qt5SerialPort.dll
    • Qt5Widgets.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"));
}
}