[英]Undefined reference to vtable. Trying to compile a Qt project
我正在使用Code::Blocks 8.02 和 mingw 5.1.6 編譯器。 編譯 Qt 項目時出現此錯誤:
C:\Documents and Settings\The Fuzz\Desktop\GUI\App_interface.cpp|33|未定義對“地址簿的 vtable”的引用
文件地址簿.h:
#ifndef ADDRESSBOOK_H
#define ADDRESSBOOK_H
#include <QWidget>
class QLabel;
class QLineEdit;
class QTextEdit;
class AddressBook : public QWidget
{
Q_OBJECT
public:
AddressBook(QWidget *parent = 0);
private:
QLineEdit *nameLine;
QTextEdit *addressText;
};
#endif
文件地址簿.cpp:
#include <QtGui>
#include "addressbook.h"
AddressBook::AddressBook(QWidget *parent)
: QWidget(parent)
{
QLabel *nameLabel = new QLabel(tr("Name:"));
nameLine = new QLineEdit;
QLabel *addressLabel = new QLabel(tr("Address:"));
addressText = new QTextEdit;
QGridLayout *mainLayout = new QGridLayout;
mainLayout->addWidget(nameLabel, 0, 0);
mainLayout->addWidget(nameLine, 0, 1);
mainLayout->addWidget(addressLabel, 1, 0, Qt::AlignTop);
mainLayout->addWidget(addressText, 1, 1);
setLayout(mainLayout);
setWindowTitle(tr("Simple Address Book"));
}
使用 Qt Creator 時:
警告:如果您已經有 .pro 文件,請不要這樣做 - 您會丟失它!
為了自動保證生成所有的moc cpp文件,你可以讓qmake自動為你生成一個.pro文件,而不是自己寫一個。
跑步
qmake -project
在項目目錄中,qmake 將掃描您的目錄以查找所有 C++ 頭文件和源文件,以生成 moc cpp 文件。
問題幾乎可以肯定是您沒有在生成的 moc_AddressBook.cpp 文件中進行編譯或鏈接。 (它應該是為您生成的——在編譯之前,您正在代碼上運行 Qt 的moc
,對嗎?)
為了更徹底地回答, Q_OBJECT
宏通知 Qt 的moc
工具創建一個額外的實現文件,其中包含支持QObject
元信息系統所需的代碼。 如果您有任何信號或插槽,它也會為它們做一些事情。
另一種解決方案可能是刪除Q_OBJECT
宏。 您可能不想這樣做,但它會幫助解決眼前的問題,而且對於您提供的代碼來說,這並不是絕對必要的。
另外,我會注意到你的線路:
#include "addressbook.h"
應該是:
#include "AddressBook.h"
根據您在問題中顯示文件名的方式。
假設您使用 qmake 生成 Makefile,請確保在 .pro 文件的 HEADERS 變量中指定了 AddressBook.h,例如
HEADERS = AddressBook.h
對於 CMake 項目,將 CMAKE_AUTOMOC 設置為 ON,這解決了我的問題。
#Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# Instruct CMake to run moc automatically when needed.
set(CMAKE_AUTOMOC ON)
我在使用純虛函數時得到了這個。 例如,
virtual void process();
給出了這個錯誤,而
virtual void process() = 0;
讓它消失了。
對於在 Google 上搜索此問題的任何人,請檢查是否已定義所有虛函數。 (通過“= 0”或源文件中的完整定義)我將 Netbeans 與 MinGW 編譯器一起使用。
我在使用 CLion 時遇到了同樣的問題,並通過將這些行添加到 CMakeLists.txt 來解決它
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
請參閱https://www.jetbrains.com/help/clion/qt-tutorial.html#qt-setup-in-clion
我遇到了同樣的問題,但是一旦我在頭文件而不是 .cpp 中定義了我的構造函數,錯誤就消失了。 此外,文件系統和 Makefile 部分“compiler_moc_header_make_all”中也缺少相應的 moc 文件。 我跑了一個 qmake 然后最后一切都成功了。 我去檢查了 Makefile,它現在就在那里。
刪除了構建文件夾,重新啟動了 Qt Creator 並且它工作了
我遇到了同樣的問題,重建項目從不更新 Makefile,我刪除了 Makefile 並重建,問題消失了。 ps:從命令行運行'make'可能會為您提供比IDE更詳細的信息,並有助於解決真正的問題。
在我的情況下,全部重建還不夠,我必須刪除構建目錄並進行全部重建 - 然后它起作用了!
只需為您的項目Run qmake
。 這可以通過右鍵單擊項目名稱並單擊Run qmake
輕松完成。
只需清除項目,然后重建它!
一個原因是當您在類中聲明虛函數並且沒有定義它們的主體時。
我在嘗試使用受保護的虛擬函數時遇到了同樣的問題。 兩件事奏效了。
void process();
void process() = 0;
process()
公開而不是私有轉到 .pro 文件並確保 .h 文件之前有“include”。 HEADERS += include/file.h \\ include/file2.h
如果您不小心添加了析構函數原型,您將收到相同的錯誤消息。 添加一個空的析構函數定義或刪除原型。
moc 編譯的頭文件應該包含在 HEADERS += ... 變量中:
我已將 Myproject.pro 中的頭文件移動到 SOURCES += ... 部分,因為我希望將 mySource.h 和 mySource.cpp 放在同一個樹元素中。 但這對 QT Creator 來說是錯誤的。 結果出現錯誤“未定義對 vtable 的引用”。 似乎是:QT 僅在 HEADERS +=... 部分(或變量)中檢測到 moc 編譯的標頭。 另請參閱其他 stackoverflow 答案中的正確解釋第二個答案“我已經看到了很多解決問題的方法,但沒有解釋為什么會發生,所以這里是。”。 在我看來,這是對問題的准確解釋,它幫助我發現並解決了我的問題。
制作
使用 CMake 時,有趣的是,如果我的 .cpp 和 .h 文件不在同一個文件夾中,默認情況下 moc 無法生成元文件:)
使用 Q_OBJECT 但不生成 moc 文件的最多錯誤
moc 文件定義
類名::元對象
靜態元對象
qt_metacall
這是一個例子:
當源或 header 使用 Q_OBJECT
/opt/qt/bin/moc./window.h -o./moc_window.cpp
Makefile 在OBJS中添加moc_window.o
例如:OBJS=main.o window.o moc_window.o
試試這個來源
https://www.mediafire.com/file/anjeah1jmm07mfe/qt_group_box.tar.gz
我正在使用 Qt creator 編譯和運行我的程序,我不經常使用Qt 命令提示符。 我為擺脫煩人的錯誤“ vtable something something ”所做的一件事是將以下幾行添加到.pro
文件中。
模板 = 應用程序
QT += 核心
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.