使用 Makefile 构建 qt 类时链接失败

Linkage failure when building qt class with Makefile

本文关键字:链接 失败 qt Makefile 构建 使用      更新时间:2023-10-16

我正在尝试将这样的类添加到项目中^

//Emitter.h
#ifndef EMITTER_H
#define EMITTER_H
#include <QObject>
#include <QDBusInterface>
#include <QDBusAbstractAdaptor>
#include <QDBusVariant>
class Emitter:public QObject
{
    Q_OBJECT
public:
    Emitter();
private:
    QDBusInterface * m_interface;
    QString m_interfaceName;
};
#endif // EMITTER_H

//Emitter.cpp 
#include "CESMEmitter.moc"
#include "Emitter.h"
Emitter::Emitter( QObject * parent )
     : QObject( parent )
{
}

我通过使用moc收到的CESMEmitter.moc文件,如下所示:

moc CESMEmitter.h > CESMEmitter.moc

尝试使用 Makefile 构建后,我收到一个错误,说找不到 Qt 包含文件。

所以我添加了变量

QT_STUFF = -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtDBus -I/usr/include/qt4 -L/usr/lib/x86_64-linux-gnu -lQtGui -lQtCore -lQtDBus -lpthread 

并应用了它。

找到包含文件,但出现其他错误:

error: undefined reference to `QObject::QObject(QObject*)'
error: undefined reference to `qt_assert(char const*, char const*, int)'
error: undefined reference to `QString::shared_null'
error: undefined reference to `QString::shared_null'

任何人都可以提供建议吗?

尽管它可能碰巧有效,但您不应该只有一个QT_STUFF变量。您需要一个单独的编译(使用 -I-D)和链接(使用 -L/-l )。您还可能缺少编译所需的定义。Qt 4 需求

-DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED

以及您使用的所有Qt库的类似内容。Qt 5 需求

-DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB

你也确定链接器不会抱怨缺少Qt库吗?

至少让 qmake 生成初始 Makefile 然后可以进行调整可能会更容易。