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
上下文等,可以由子类的构造方法中的参数进行传入。