【发布时间】: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,我想你也必须运行它。