【问题标题】:Undefined symbol vtable未定义符号 vtable
【发布时间】:2015-04-08 20:47:23
【问题描述】:

编译 Qt cpp 代码并收到此错误:

Running ld for x86_64 ...
Undefined symbols for architecture x86_64:
  "vtable for HelixButton", referenced from:
      HelixButton::HelixButton(QString const&, QWidget*) in helixQtCmd.o
      HelixButton::HelixButton(QString const&, QWidget*) in helixQtCmd.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.

我的 .h 文件如下所示:

class HelixButton : public QPushButton
{
    Q_OBJECT

public:
            HelixButton(const QString& text, QWidget* parent = 0);
    virtual ~HelixButton();
};

以及对应的cpp:

HelixButton::HelixButton(const QString& text, QWidget* parent)
:   QPushButton(text, parent)
{}

HelixButton::~HelixButton()
{}

pro 文件包含正确的标题:

include(qtconfig)
    INCLUDEPATH += /Users/laurent/Dropbox/Dev/Maya/qt/include
    INCLUDEPATH += /Users/laurent/Dropbox/Dev/Maya/qt/include/QtGui
    INCLUDEPATH += /Users/laurent/Dropbox/Dev/Maya/qt/include/QtCore
    INCLUDEPATH += /Users/laurent/Dropbox/Dev/Maya/qt/include/QtUiTools

TARGET = helixQtCmd
HEADERS += helixQtCmd.h
SOURCES += helixQtCmd.cpp

qtconfig 文件的内容:

TEMPLATE = lib
CONFIG -= debug
CONFIG += qt warn_on plugin

_DEVKIT_LOCATION = $$(MAYA_LOCATION)/../../devkit
_MAYA_INCLUDE_DIR = $${_DEVKIT_LOCATION}/include

DEFINES     += CC_GNU_ OSMac_ OSMacOSX_ Bits32_  REQUIRE_IOSTREAM \
            OSMac_MachO_ _LANGUAGE_C_PLUS_PLUS 
INCLUDEPATH += .. "$${_MAYA_INCLUDE_DIR}"
TARGET_EXT  = bundle
QMAKE_EXTENSION_SHLIB   = bundle

QMAKE_CC    = clang
QMAKE_CXX   = clang++

_CFLAGS     = -O3 -include "$${_MAYA_INCLUDE_DIR}/maya/OpenMayaMac.h"
QMAKE_CFLAGS    += $${_CFLAGS}

QMAKE_CXXFLAGS  += $${_CFLAGS} -stdlib=libstdc++ $(WARNFLAGS) $(ERROR_FLAGS) \
            -fno-gnu-keywords -fpascal-strings

_DYNLIB_LOCATION    = $$(MAYA_LOCATION)/MacOS
_LREMAP         = -Wl,-executable_path,"$${_DYNLIB_LOCATION}"

LIBS        += -L"$${_DYNLIB_LOCATION}" $${_LREMAP} -lOpenMaya -lFoundation \
            -framework System -framework CoreServices \
            -framework SystemConfiguration \
            -framework Carbon -framework Cocoa \
            -framework ApplicationServices \
            -framework IOKit \
            -framework QtCore \
            -framework QtGui

QMAKE_LFLAGS    += -stdlib=libstdc++ -fno-gnu-keywords -fpascal-strings  \
            -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk -bundle

QMAKE_LINK      = $${QMAKE_CXX}
QMAKE_MAC_SDK   = /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk

MAKEFILE = $${TARGET}.mak

在互联网上阅读多篇文章显示析构函数声明存在问题,但似乎是正确的。

删除 Q_OBJECT 使其工作,但我真的需要信号。

编译时不生成moc文件。

有什么可能出错的线索吗?

谢谢

【问题讨论】:

  • 'Clean all' 并尝试手动运行qmake(如果您使用它,可以从 Qt Creator 的菜单中)
  • 你在你的cpp文件中定义了createHelix()方法并重新编译了吗?
  • 是的,它已定义。没有添加它以减少有问题的空间。 void HelixButton::createHelix(bool){}。
  • 我没有使用 QtCreator。我确实使用 make -f Makefile.qt myPlugin.bundle 进行编译并使用 make -f Makefile.qt clean 进行清理。但同样的问题。有没有更好的命令行清理方法?
  • 注意 qmake 中的 q,我想你也必须运行它。

标签: c++ qt vtable qobject


【解决方案1】:

您必须在该文件夹中运行qmake,Qt 才能根据您的项目设置生成makefile

之后你就可以运行make了。

另外,在运行qmake 时,您可能需要指定.pro 文件。

检查qmakedocumentation

this 以获得完整的概述。

【讨论】:

  • 当我没有 Q_OBJECT 时,qmake 会正确执行,所以我不确定这是否真的是问题;
  • 那么你可能在你的 pro 文件中缺少必需的定义,你介意显示完整的 pro。还可以查看完整的 qmake 文档,如何针对您的项目编写 pro 文档
  • 好的,我已经用完整的 Pro 文件和 qtconfig 更新了我的问题。谢谢。
  • 您在哪里定义了将创建什么类型的应用程序以及 qt += qt 调试或发布等。请阅读有关项目文件的完整概述链接
  • 编译时我给出了 myplugin.bundle 作为参数,所以它知道这将是一个 Maya 包。删除 Q_OBJECT 使其编译正确,我可以在 Maya 中执行它,但按钮没有响应。因此,我认为这个问题与应用类型并没有真正的关系。
【解决方案2】:

我的 makefile 缺少 moc 生成命令。一旦 moc_file.cpp 从主 cpp 文件生成并包含在内,一切都会正确编译。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 2012-08-14
    相关资源
    最近更新 更多