QT开发报错集锦
1. undefined reference to `__imp__ZN10ObjectTypeC1Ev’
2025.7.14 21:30
解释:说明QT子项目间没有link,例如子项A调用了子项B的代码,但是没有在CMake中使用target_link_libraries将两者link起来。
解决办法:修改CMake,增加:
target_link_libraries(A PRIVATE B)
cmake
2. undefined reference to `Solution::creationCount’
2025.7.14 21:40
解释:说明creationCount作为Solution的静态成员变量没有被初始化。
解决办法:在Solution.cpp中增加:
int Solution::creationCount = 0;
cmake
2. (.rdata$.refptr.NONE[.refptr.NONE]+0x0): undefined reference to `NONE’
2025.7.14 22:19
解释:即便采用了1.中说的方法仍然还有这个问题,那说明是没有对调用的变量或类进行导出声明。
解决办法:在变量或类的声明中增加导出声明,例如_global.h中定义了如下的宏:
/*
* @brief :BaseObject_global.h
* @author :Jiayi XU
* @date :2025-07-11
*/
#ifndef BASEOBJECT_GLOBAL_H
#define BASEOBJECT_GLOBAL_H
#include <QtCore/qglobal.h>
#if defined(OBJECTS_LIBRARY)
#define OBJECTS_EXPORT Q_DECL_EXPORT
#else
#define OBJECTS_EXPORT Q_DECL_IMPORT
#endif
#endif // BASEOBJECT_GLOBAL_H
c++
那么只需要增加OBJECTS_EXPORT的声明即可,例如我们需要在变量NONE前面增加:
extern OBJECTS_EXPORT ObjectType NONE;
c++
即可
4. static assertion failed: The slot requires more arguments than the signal provides.
2025.7.14 22:24
解释:说明SIGNAL函数和SLOT函数的参数不一致
解决办法:保证SIGNAL函数和SLOT函数的参数一致
5. QtXml: No such file or directory 51 | #include
2025.7.17 13:12
解释:说明没有正确导入库,可能用了子项目。例如子项目A中头文件A.h引入了QtXml,并且在子项目A的CMake中正确配置了QtXml,那么子项目A正常。但是子项目B中没有在CMake中正确配置QtXml,却引入了子项目A中头文件A.h,这样就会报错,因为子项目B中没有在CMake中正确配置QtXml
解决办法:在子项目B的CMake中正确配置QtXml
6. 对象为创建完成但调用this导致程序崩溃
2025.7.18 10:08
解释:我有一个子类调用了父类的构造方法,同时在传参的过程中有一个子类方法返回一个变量作为参数传递,此时在子类方法中调用this时导致程序崩溃。现象是程序无任何输出和报错。
//父类
class LineForm : public QWidget {
Q_OBJECT
public:
explicit LineForm(QString text, QWidget *subWidget = nullptr, QWidget *parent = nullptr);
};
//子类
class LineInputForm : public LineForm {
Q_OBJECT
public:
explicit LineInputForm(QString text, QWidget *parent = nullptr);
private:
QLineEdit * inputField;
QWidget * getSubWidegt();
};
//父类构造方法
LineForm::LineForm(QString text,
QWidget *subWidget,
QWidget *parent)
: QWidget(parent)
{
qDebug()<<"LineForm::LineForm到这里来了~";
}
//子类构造方法
LineInputForm::LineInputForm(QString text,
QWidget *parent)
: LineForm(text, getSubWidegt(), parent)
{}
//子类方法
QWidget *LineInputForm::getSubWidegt()
{
inputField = new QLineEdit(this);
inputField->setPlaceholderText("请输入内容");
return inputField;
}
c++
这里的罪魁祸首就是在LineInputForm::getSubWidegt()中使用了this,导致程序崩溃。
解决办法:避免使用this,因为对象实例还未正确创建,因此只需要将LineInputForm::getSubWidegt()的this去掉即可,如果需要QWidget上下文等,可以由子类的构造方法中的参数进行传入。





