簡體   English   中英

對 vtable 的未定義引用。 嘗試編譯 Qt 項目

[英]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 時:

  1. 構建 → 運行 qmake
  2. 構建 → 全部重建

警告:如果您已經有 .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輕松完成。

只需清除項目,然后重建它!

一個原因是當您在類中聲明虛函數並且沒有定義它們的主體時。

我在嘗試使用受保護的虛擬函數時遇到了同樣的問題。 兩件事奏效了。

  1. 更改void process(); void process() = 0;
  2. 使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

參考http://fatalfeel.blogspot.com/2013/11/qt5-c-building.html

我正在使用 Qt creator 編譯和運行我的程序,我不經常使用Qt 命令提示符 我為擺脫煩人的錯誤“ vtable something something ”所做的一件事是將以下幾行添加到.pro文件中。

模板 = 應用程序

QT += 核心

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM