【问题标题】:undefined reference linker error with signals and slots带有信号和插槽的未定义参考链接器错误
【发布时间】:2011-03-01 23:08:10
【问题描述】:

使用 Qt Creator,我正在 Qt 中创建一个带有自定义插槽的类:

class CustomEdit : public QTextEdit { Q_OBJECT public: CustomEdit(QWidget* parent); public slots: void onTextChanged (); };

但是,我收到此链接器错误:

undefined reference to 'vtable for CustomEdit'

文档说:

如果您收到“未定义对 LcdNumber 的 vtable 的引用”的编译器错误,您可能忘记运行 moc 或在链接命令中包含 moc 输出。

...但这意味着什么并不明显。

有什么我需要添加到我的班级或 .pro 文件中的吗?

编辑 -- 这是我的 .pro 文件:

QT += 网络\ 脚本 \ 网络套件\ xml 目标 = 我的应用 模板 = 应用程序 来源 += main.cpp \ 主窗口.cpp \ 自定义编辑.cpp 标题 += MainWindow.h \ 自定义编辑.h 表格 += 主窗口.ui

编辑:

This question 处理相同的问题,但答案并不清楚我如何在 Qt Creator 中解决此问题。我是否需要将 moc 生成的 .cpp 文件显式添加到要链接的文件列表中?这似乎很痛苦。

【问题讨论】:

  • 您是否尝试在 SO 中搜索? ;-) stackoverflow.com/questions/1552069/…
  • 谢谢,但我没有运行 qmake,我使用的是 Qt Creator
  • 仅供参考,我在 SOURCES 而不是 HEADERS 中放错了一些 .h 搞砸了,它会产生相同类型的错误。

标签: qt signals signals-slots slot moc


【解决方案1】:

Qt creator 是一个用于创建 Qt 项目的 IDE。就这样。但是 qmake 允许您构建项目。来自qmake manual

qmake 自动生成 Makefile,因此创建每个 Makefile 只需要几行信息。 qmake 根据项目文件中的信息生成 Makefile。 qmake 包含支持使用 Qt 进行开发的附加功能,自动包含 moc 和 uic 的构建规则。

您不必单独包含您的 moc 文件,但您必须运行 qmake,其中包含有关所需 moc 文件的所有信息。查看 qmake 后生成的Makefile.debugMakefile.release,您会发现所有的 moc 文件都将包含在内。

现在要在 Qt creator 中运行 qmake,只需转到 Build->RebuildAll,它将运行 qmake,所有 (moc) 文件也将生成并链接(在 Makefile.debug 中)。

希望这将消除您未定义的引用。

【讨论】:

  • 成功了,谢谢。我还意识到,当我在 Qt Creator 中创建一个新类时,我必须指定“继承 QWidget”作为类型信息。考虑到我已经告诉 IDE 我的类派生自 Qt 类,我必须明确指定这一点似乎很奇怪,但这可以解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-04
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 2015-03-14
相关资源
最近更新 更多