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,并且在子项目ACMake中正确配置了QtXml,那么子项目A正常。但是子项目B中没有在CMake中正确配置QtXml,却引入了子项目A中头文件A.h,这样就会报错,因为子项目B中没有在CMake中正确配置QtXml

解决办法:在子项目BCMake中正确配置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上下文等,可以由子类的构造方法中的参数进行传入。

打赏
  • 微信
  • 支付宝
评论
来发评论吧~
···

歌手: