QT中出现“无法解析的外部符号”错误

时间:2022-03-23 00:38:16

串口中我要把奇偶校验等enum数据对应写到一个ComboBox中去,所以需要在我的Settings类中加入一个函数用来转换。

这里,我首先在settings.h的class Settings中加上对该函数的声明

 class Settings : public QDialog
{
Q_OBJECT public:
explicit Settings(QWidget *parent = );
~Settings();
QString &stopbit2string(enum QSerialPort::StopBits stop);
QString &parity2string(enum QSerialPort::Parity parity); private slots:
void on_buttonBox_accepted();

然后在settings.cpp加上这两个函数的实现,壳

 QString &stopbit2string(enum QSerialPort::StopBits stop)
{
QString *ret = new QString("Eitd1");
return *ret;
} QString &parity2string(enum QSerialPort::Parity parity)
{
QString *ret = new QString("Eitd2");
return *ret;
}

这样编译就出错:

error LNK2019: 无法解析的外部符号 "public: class QString __cdecl Settings::parity2string(enum QSerialPort::Parity)"

这回就困惑了,由于我想到QT的编译依赖做得并不是很好,比如.pro文件可能不会随着工程文件的修改而变化,所以我检查了一下该文件,又把工程目录下的debug、release、makefile等都删除了,再清除了工程再重新构建,也还是出同样的错误。

在链接的时候无法解析外部符号,情况多数是这些情况:

1. 符号没有定义而被调用了

2. 符号在某个文件中被定义了,但是当前文件不知道,因为没有声明;

据此为出发点,我再去查找了一下C++对类方法的定义与调用的问题。

结果是有收获的,问题是我没有对Settings::parity2string定义,因为我的代码是用以下代码来定义的

 QString &parity2string(enum QSerialPort::Parity parity)

其实是我疏忽了,写C语言的我,忘记了C++的方法实现需要在前面加上类名,只要把这两个函数改成以下样子就可以了:

 QString & Settings::stopbit2string(enum QSerialPort::StopBits stop)
{
QString *ret = new QString("Eitd1");
return *ret;
} QString & Settings::parity2string(enum QSerialPort::Parity parity)
{
QString *ret = new QString("Eitd2");
return *ret;
}