Qt 创建者未定义对 linux 中“class::function”的引用

Posted

技术标签:

【中文标题】Qt 创建者未定义对 linux 中“class::function”的引用【英文标题】:Qt creator Undefined reference to "class::function" in linux 【发布时间】:2018-11-07 18:28:00 【问题描述】:

这个问题与之前提出的问题类似,但我在 Qt 识别我的类和函数时遇到了问题,尽管它们已被定义。我在 linux 中执行此操作,其中 Qt 版本仅为 5.5,而 Windows 版本为 5.11。在 Windows 中运行相同的程序时,我没有收到任何错误。

我收到“对QCanBus::instance() 的未定义引用”错误

每个QCanBus 函数都会发生这种情况。在我来自connectdialogue.cpp 的代码 sn-p 中,只有第一次出现是特色,可以在倒数第二行找到并给出错误:

“未定义对QCanBus::instance()的引用”

“未定义对QCanBus::plugins()的引用”

尽管在 qcanbus.h 头文件中定义了这些错误。

我尝试在我的connectdialogue.cpp#include 行下添加行static QCanBus *instance()QCanBus *instance(),但随后我收到警告: “QCanBus::instance() 已定义,但未使用”,明确用于特色代码 sn-p 的倒数第二行。

如何修复这些错误?

connectdialogue.cpp

 #include "connectdialog.h"
 #include "ui_connectdialog.h"

 #include "qcanbus.h"

ConnectDialog::ConnectDialog(QWidget *parent) :
     QDialog(parent),
     m_ui(new Ui::ConnectDialog)

m_ui->setupUi(this);

m_ui->errorFilterEdit->setValidator(new QIntValidator(0, 0x1FFFFFFFU, this));

m_ui->loopbackBox->addItem(tr("unspecified"), QVariant());
m_ui->loopbackBox->addItem(tr("false"), QVariant(false));
m_ui->loopbackBox->addItem(tr("true"), QVariant(true));

m_ui->receiveOwnBox->addItem(tr("unspecified"), QVariant());
m_ui->receiveOwnBox->addItem(tr("false"), QVariant(false));
m_ui->receiveOwnBox->addItem(tr("true"), QVariant(true));

m_ui->canFdBox->addItem(tr("false"), QVariant(false));
m_ui->canFdBox->addItem(tr("true"), QVariant(true));

m_ui->dataBitrateBox->setFlexibleDateRateEnabled(true);

connect(m_ui->okButton, &QPushButton::clicked, this, &ConnectDialog::ok);
connect(m_ui->cancelButton, &QPushButton::clicked, this, &ConnectDialog::cancel);
connect(m_ui->useConfigurationBox, &QCheckBox::clicked,
        m_ui->configurationBox, &QGroupBox::setEnabled);
connect(m_ui->backendListBox, &QComboBox::currentTextChanged,
        this, &ConnectDialog::backendChanged);
connect(m_ui->interfaceListBox, &QComboBox::currentTextChanged,
        this, &ConnectDialog::interfaceChanged);
m_ui->rawFilterEdit->hide();
m_ui->rawFilterLabel->hide();

m_ui->backendListBox->addItems(QCanBus::instance()->plugins());

updateSettings();
 

qcanbus.h

#ifndef QCANBUS_H
#define QCANBUS_H

#include <QtCore/qobject.h>
#include "qserialbusglobal.h"
#include "qcanbusdevice.h"
#include "qcanbusdeviceinfo.h"

QT_BEGIN_NAMESPACE

class Q_SERIALBUS_EXPORT QCanBus : public QObject

    Q_OBJECT

public:
    static QCanBus *instance();
    QStringList plugins() const;

    QList<QCanBusDeviceInfo> availableDevices(const QString &plugin, QString *errorMessage = nullptr) const;

    QCanBusDevice *createDevice(const QString &plugin,
                                const QString &interfaceName,
                                QString *errorMessage = nullptr) const;

private:
    QCanBus(QObject *parent = nullptr);

    Q_DISABLE_COPY(QCanBus)
;

QT_END_NAMESPACE

#endif // QSERIALBUS_H

【问题讨论】:

"未定义对 的引用" 通常意味着您忘记链接实现 foo 的库或目标文件(或以错误的顺序链接它们)。 标题中没有定义。 @molbdnilo 我需要在哪里/如何定义它? static QCanBus *instance(); 行是否没有定义 QCanBus::instance() @JesperJuhl 这完全有可能,因为我正在从 Windows 导入 linux 中丢失的文件。我怎样才能找到丢失的库或目标文件?我已经拥有了所有依赖的#include 文件。 @viduwoy 您可以查看源代码以找到定义符号的任何内容,然后查看您的构建系统文件以查看该源代码被构建到的内容。您可以只 objdump 所有对象/库文件并 grep 查找有问题的符号。您可以阅读文档以查看它是否告诉您链接的内容。有很多方法可以找出答案。 【参考方案1】:

QCanBus 缺少 QCanBus.cpp 且未声明。

【讨论】:

以上是关于Qt 创建者未定义对 linux 中“class::function”的引用的主要内容,如果未能解决你的问题,请参考以下文章

QT Subdir - 未定义的参考

在树莓派上原生构建 qt5.7.1 得到错误:/usr/lib/arm-linux-gnueabihf/libQt5Quick.so.5: 未定义对 `QV8Engine::toVariant 的引用

使用 Qt 对 vtable 的未定义引用

在 Qt 应用程序中包含 Python.h 会导致对 Qt 函数的未定义引用

使用 QT 时对构造函数的未定义引用 [重复]

qt5 未定义对 'QApplication::QApplication(int&, char**, int)' 的引用