【问题标题】:Linkage failure when building qt class with Makefile使用 Makefile 构建 qt 类时链接失败
【发布时间】:2013-09-11 15:27:27
【问题描述】:

我正在尝试将此类添加到项目中^

//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 lib文件夹添加到LIBS:LIBS+="-l/path/to/qt/lib"
  • 我加了,在QT_STUFF里面是-L/usr/lib/x86_64-linux-gnu
  • 是否也会传递给链接器?
  • 是的,因为整个 QT_STUFF 都通过了
  • kopalvich:为什么不使用 LIBS?此外,您不应该使用“moc CESMEmitter.h > CESMEmitter.moc”,但您可以使用 moc 的输出选项...

标签: c++ qt makefile


【解决方案1】:

尽管它可能会起作用,但您不应该只有一个 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 可能会更容易,然后您可以对其进行调整。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 2016-07-29
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多