2012-12-23 15 views
29

के क्यूटी अनिर्धारित संदर्भ मैं क्यूटी प्रोग्रामिंग के लिए शुरुआत करने वाला हूं और अपने प्रोग्रामिंग के लिए कोडब्लॉक का उपयोग करता हूं।क्यूटी

communicate.h

#ifndef COMMUNICATE_H 
    #define COMMUNICATE_H 

    #include <QWidget> 
    #include <QApplication> 
    #include <QPushButton> 
    #include <QLabel> 

    class Communicate : public QWidget 
    { 
     Q_OBJECT 

     public: 
     Communicate(QWidget *parent = 0); 


     private slots: 
     void OnPlus(); 
     void OnMinus(); 

     private: 
     QLabel *label; 

    }; 

    #endif 

communicate.cpp

#include "communicate.h" 

Communicate::Communicate(QWidget *parent) 
    : QWidget(parent) 
{ 
    QPushButton *plus = new QPushButton("+", this); 
    plus->setGeometry(50, 40, 75, 30); 

    QPushButton *minus = new QPushButton("-", this); 
    minus->setGeometry(50, 100, 75, 30); 

    label = new QLabel("0", this); 
    label->setGeometry(190, 80, 20, 30); 

    connect(plus, SIGNAL(clicked()), this, SLOT(OnPlus())); 
    connect(minus, SIGNAL(clicked()), this, SLOT(OnMinus())); 
} 

void Communicate::OnPlus() 
{ 
    int val = label->text().toInt(); 
    val++; 
    label->setText(QString::number(val)); 
} 

void Communicate::OnMinus() 
{ 
    int val = label->text().toInt(); 
    val--; 
    label->setText(QString::number(val)); 
} 

main.cpp: मैं 3 फ़ाइलें communicate.h, commmunicate.cpp और main.cpp इस प्रकार बनाया

#include "communicate.h" 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 

    Communicate window; 

    window.setWindowTitle("Communicate"); 
    window.show(); 

    return app.exec(); 
} 

और उसके दिखा त्रुटियों इस प्रकार है:

obj\Debug\main.o(.text$_ZN11CommunicateD1Ev[Communicate::~Communicate()]+0xb)||In function `ZN7QStringC1EPKc':| 
C:\Qt\4.4.3\include\QtCore\..\..\src\corelib\arch\qatomic_windows.h||undefined reference to `vtable for Communicate'| 
obj\Debug\main.o(.text$_ZN11CommunicateD1Ev[Communicate::~Communicate()]+0x17):C:\Qt\4.4.3\include\QtCore\..\..\src\corelib\arch\qatomic_windows.h||undefined reference to `vtable for Communicate'| 
obj\Debug\communicate.o(.text+0x172)||In function `ZN11CommunicateC2EP7QWidget':| 
E:\Project\cam2\communicate.cpp|5|undefined reference to `vtable for Communicate'| 
obj\Debug\communicate.o(.text+0x17e):E:\Project\cam2\communicate.cpp|5|undefined reference to `vtable for Communicate'| 
obj\Debug\communicate.o(.text+0x63a)||In function `ZN11CommunicateC1EP7QWidget':| 
E:\Project\cam2\communicate.cpp|5|undefined reference to `vtable for Communicate'| 
obj\Debug\communicate.o(.text+0x646):E:\Project\cam2\communicate.cpp|5|more undefined references to `vtable for Communicate' follow| 
||=== Build finished: 6 errors, 0 warnings ===| 

लोग कृपया मदद ... नहीं कर सकते यह पता लगा ...

+2

सुनिश्चित करें कि आपके प्रोजेक्ट फ़ाइल (.pro) हेडर अनुभाग – Zeks

+0

में communicate.h फ़ाइल शामिल यह कोई डुप्लिकेट भी स्थानीय नहीं –

+4

सर्वश्रेष्ठ उत्तर मैंने पाया है, और कहा कि यहां उल्लेख नहीं है qmake लौटा है बनाने के लिए: http : //stackoverflow.com/a/3650758/258418 – ted

उत्तर

17

यह एक सूक्ष्म बग है (और शायद आंशिक रूप से कम से कम एक संकलक बग) कि मैंने पहले देखा है। चूंकि QWidget में वर्चुअल विनाशक है, इसलिए कंपाइलर को आपकी कक्षा के लिए एक vtable की आवश्यकता होती है। लेकिन आपकी कक्षा में कोई वर्चुअल फ़ंक्शन नहीं है, इसलिए यह आपके संचार वर्ग के लिए एक नहीं बनाया गया है।

अपनी कक्षा में virtual ~Communicate() {}; जोड़ें, और सभी ठीक होंगे।

हां, मुझे यह समझने में कुछ समय लगा!

+7

आप सही नहीं हैं। मैंने अभी इस वर्ग का परीक्षण किया है: कक्षा परीक्षण: सार्वजनिक QObject {Q_OBJECT} और यह संकलित करता है कि ठीक हैडरिंग फ़ाइल हैडर फ़ाइल में रहता है .pro जिस क्षण मैं इसे टिप्पणी करता हूं - मुझे vtable – Zeks

+0

ठीक से संदर्भ नहीं मिलता है, मैंने यह समस्या देखी है एक अलग सेटअप, जहां क्यूटी बिल्कुल शामिल नहीं था, और समस्या एक विनाशक घोषित नहीं होने के कारण हुई थी। तो हो सकता है कि एमओसी फ्लाई पर इस तरह की चीज़ "फिक्सिंग" कर रहा हो? –

+0

यदि आप संवाद जोड़ते हैं तो कोड ठीक से संकलित होता है।एच हेडर अनुभाग में एच। – Kikohs

4

आपको विनाशक को परिभाषित करने की आवश्यकता है। भले ही यह QObject से निकला है, यह संकलक के लिए डिफ़ॉल्ट कन्स्ट्रक्टर/विनाशकों का उपयोग करने के लिए पर्याप्त नहीं है।

Qt Linker Error: "undefined reference to vtable"

+0

के साथ सार्वजनिक रूप से मेरे जीवन को बचाया! जोडना! – Shum

12

एमओसी (मेटा वस्तु संकलक) (साथ ही साथ किसी भी अन्य Q_OBJECT'ed वर्गों के रूप में) अपना काम करने में अपने communicate.h के बारे में पता करने की जरूरत है। जब तक आप उन्हें हेडर अनुभाग के अंतर्गत .pro फ़ाइल में जगह - आप इस "अपरिभाषित संदर्भ"

+0

मैं विंडोज 7 में कोडब्लॉक का उपयोग कर रहा हूं। मुझे प्रोजेक्ट निर्देशिका के साथ कोई .pro फ़ाइल नहीं मिल सकती है ... क्या आप अधिक विशिष्ट हो सकते हैं? –

+0

@Zeks हाँ आप सही हैं, क्यूटी को कस्टम हेडर भी जानना आवश्यक है – jondinham

18

समस्या को हल करने के लिए Q_OBJECT मैक्रो को दूर किया जाता है एक त्वरित विकल्प मिल जाएगा, यह आप संकलित करके उसे अपने आवेदन का परीक्षण करने की अनुमति देगा , लेकिन सही विकल्प नहीं, यदि आप सीबी पर क्यूटी के साथ हर दिन काम करना चाहते हैं तो अपने पर्यावरण को कॉन्फ़िगर करना होगा।

एक विकल्प जिसे मैं व्यक्तिगत रूप से अधिक पसंद करता हूं और एक कस्टम मेकफ़ाइल और फ़ाइल बनाता हूं। एप्लिकेशन के लिए "समर्थक" यह अन्य वातावरणों में आसानी से परिवहन योग्य है "क्यूटी क्रिएटर" "नेटबीनसाइड", आदि

मैं जल्दी से समझाऊंगा कि अनुसरण करने के लिए क्या कदम हैं। यदि आपने QtCreator स्थापित किया है तो QtCreator फ़ाइल द्वारा स्वयं-जेनरेट किए गए समर्थन का हकदार है, और थोड़ा सा अनुभव आपकी अपनी फाइलें बना सकता है।

यह उदाहरण केवल आप के तहत "लक्ष्य विज्ञप्ति" संकलन और फ़ाइलों को चलाने की अनुमति बाद में आप अपने काम के माहौल

  • अनुकूलित करने के लिए फ़ाइल बनाएँ होगा: Makefile


####### Compiler, tools and options 

PROJECT_NAME = Communicate 
QT_INCLUDE = /usr/local/QtSDK/Desktop/Qt/4.8.1/gcc/include/ 
QT_MKSPECS = /usr/local/QtSDK/Desktop/Qt/4.8.1/gcc/mkspecs/ 
QT_LIB  = /usr/local/QtSDK/Desktop/Qt/4.8.1/gcc/lib 
QT_QMAKE  = /usr/local/QtSDK/Desktop/Qt/4.8.1/gcc/bin/ 
CC   = gcc 
CXX   = g++ 
DEFINES  = -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED 
CFLAGS  = -pipe -O2 -Wall -W -D_REENTRANT $(DEFINES) 
CXXFLAGS  = -pipe -O2 -Wall -W -D_REENTRANT $(DEFINES) 
INCPATH  = -I$(QT_MKSPECS)linux-g++ -I../$(PROJECT_NAME) -I$(QT_INCLUDE)QtCore -I$(QT_INCLUDE)QtGui -I/usr/local/QtSDK/Desktop/Qt/4.8.1/gcc/include -I. -I../$(PROJECT_NAME) -I. 
LINK   = g++ 
LFLAGS  = -Wl,-O1 -Wl,-rpath,$(QT_LIB) 
LIBS   = $(SUBLIBS) -L$(QT_LIB) -lQtGui -L$(QT_LIB) -L/usr/X11R6/lib -lQtCore -lpthread 
AR   = ar cqs 
RANLIB  = 
QMAKE   = $(QT_QMAKE)qmake 
TAR   = tar -cf 
COMPRESS  = gzip -9f 
COPY   = cp -f 
SED   = sed 
COPY_FILE  = $(COPY) 
COPY_DIR  = $(COPY) -r 
STRIP   = strip 
INSTALL_FILE = install -m 644 -p 
INSTALL_DIR = $(COPY_DIR) 
INSTALL_PROGRAM = install -m 755 -p 
DEL_FILE  = rm -f 
SYMLINK  = ln -f -s 
DEL_DIR  = rmdir 
MOVE   = mv -f 
CHK_DIR_EXISTS= test -d 
MKDIR   = mkdir -p 

####### Output directory 

OBJECTS_DIR = ./Release 

####### Files 

SOURCES  = ../$(PROJECT_NAME)/main.cpp \ 
     ../$(PROJECT_NAME)/communicate.cpp moc_communicate.cpp 
OBJECTS  = main.o \ 
     communicate.o \ 
     moc_communicate.o 
DIST   = $(QT_MKSPECS)common/unix.conf \ 
     $(QT_MKSPECS)common/linux.conf \ 
     $(QT_MKSPECS)common/gcc-base.conf \ 
     $(QT_MKSPECS)common/gcc-base-unix.conf \ 
     $(QT_MKSPECS)common/g++-base.conf \ 
     $(QT_MKSPECS)common/g++-unix.conf \ 
     $(QT_MKSPECS)qconfig.pri \ 
     $(QT_MKSPECS)modules/qt_webkit_version.pri \ 
     $(QT_MKSPECS)features/qt_functions.prf \ 
     $(QT_MKSPECS)features/qt_config.prf \ 
     $(QT_MKSPECS)features/exclusive_builds.prf \ 
     $(QT_MKSPECS)features/default_pre.prf \ 
     $(QT_MKSPECS)features/release.prf \ 
     $(QT_MKSPECS)features/default_post.prf \ 
     $(QT_MKSPECS)features/unix/gdb_dwarf_index.prf \ 
     $(QT_MKSPECS)features/warn_on.prf \ 
     $(QT_MKSPECS)features/qt.prf \ 
     $(QT_MKSPECS)features/unix/thread.prf \ 
     $(QT_MKSPECS)features/moc.prf \ 
     $(QT_MKSPECS)features/resources.prf \ 
     $(QT_MKSPECS)features/uic.prf \ 
     $(QT_MKSPECS)features/yacc.prf \ 
     $(QT_MKSPECS)features/lex.prf \ 
     $(QT_MKSPECS)features/include_source_dir.prf \ 
     ../$(PROJECT_NAME)/$(PROJECT_NAME).pro 
QMAKE_TARGET = $(PROJECT_NAME) Release 
DESTDIR  = $(OBJECTS_DIR) 
TARGET  = $(PROJECT_NAME) 

first: all 
####### Implicit rules 

.SUFFIXES: .o .c .cpp .cc .cxx .C 

.cpp.o: 
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "[email protected]" "$<" 

.cc.o: 
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "[email protected]" "$<" 

.cxx.o: 
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "[email protected]" "$<" 

.C.o: 
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "[email protected]" "$<" 

.c.o: 
    $(CC) -c $(CFLAGS) $(INCPATH) -o "[email protected]" "$<" 

####### Build rules 

all: Makefile $(TARGET) 

$(TARGET): $(OBJECTS) 
    $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS) 

Makefile: ../$(PROJECT_NAME)/$(PROJECT_NAME).pro $(QT_MKSPECS)linux-g++/qmake.conf $(QT_MKSPECS)common/unix.conf \ 
     $(QT_MKSPECS)common/linux.conf \ 
     $(QT_MKSPECS)common/gcc-base.conf \ 
     $(QT_MKSPECS)common/gcc-base-unix.conf \ 
     $(QT_MKSPECS)common/g++-base.conf \ 
     $(QT_MKSPECS)common/g++-unix.conf \ 
     $(QT_MKSPECS)qconfig.pri \ 
     $(QT_MKSPECS)modules/qt_webkit_version.pri \ 
     $(QT_MKSPECS)features/qt_functions.prf \ 
     $(QT_MKSPECS)features/qt_config.prf \ 
     $(QT_MKSPECS)features/exclusive_builds.prf \ 
     $(QT_MKSPECS)features/default_pre.prf \ 
     $(QT_MKSPECS)features/release.prf \ 
     $(QT_MKSPECS)features/default_post.prf \ 
     $(QT_MKSPECS)features/unix/gdb_dwarf_index.prf \ 
     $(QT_MKSPECS)features/warn_on.prf \ 
     $(QT_MKSPECS)features/qt.prf \ 
     $(QT_MKSPECS)features/unix/thread.prf \ 
     $(QT_MKSPECS)features/moc.prf \ 
     $(QT_MKSPECS)features/resources.prf \ 
     $(QT_MKSPECS)features/uic.prf \ 
     $(QT_MKSPECS)features/yacc.prf \ 
     $(QT_MKSPECS)features/lex.prf \ 
     $(QT_MKSPECS)features/include_source_dir.prf \ 
     $(QT_LIB)/libQtGui.prl \ 
     $(QT_LIB)/libQtCore.prl 
    $(QMAKE) -spec $(QT_MKSPECS)linux-g++ -o Makefile ../$(PROJECT_NAME)/$(PROJECT_NAME).pro 
$(QT_MKSPECS)common/unix.conf: 
$(QT_MKSPECS)common/linux.conf: 
$(QT_MKSPECS)common/gcc-base.conf: 
$(QT_MKSPECS)common/gcc-base-unix.conf: 
$(QT_MKSPECS)common/g++-base.conf: 
$(QT_MKSPECS)common/g++-unix.conf: 
$(QT_MKSPECS)qconfig.pri: 
$(QT_MKSPECS)modules/qt_webkit_version.pri: 
$(QT_MKSPECS)features/qt_functions.prf: 
$(QT_MKSPECS)features/qt_config.prf: 
$(QT_MKSPECS)features/exclusive_builds.prf: 
$(QT_MKSPECS)features/default_pre.prf: 
$(QT_MKSPECS)features/release.prf: 
$(QT_MKSPECS)features/default_post.prf: 
$(QT_MKSPECS)features/unix/gdb_dwarf_index.prf: 
$(QT_MKSPECS)features/warn_on.prf: 
$(QT_MKSPECS)features/qt.prf: 
$(QT_MKSPECS)features/unix/thread.prf: 
$(QT_MKSPECS)features/moc.prf: 
$(QT_MKSPECS)features/resources.prf: 
$(QT_MKSPECS)features/uic.prf: 
$(QT_MKSPECS)features/yacc.prf: 
$(QT_MKSPECS)features/lex.prf: 
$(QT_MKSPECS)features/include_source_dir.prf: 
$(QT_LIB)/libQtGui.prl: 
$(QT_LIB)/libQtCore.prl: 
qmake: FORCE 
    @$(QMAKE) -spec $(QT_MKSPECS)linux-g++ -o Makefile ../$(PROJECT_NAME)/$(PROJECT_NAME).pro 

dist: 
    @$(CHK_DIR_EXISTS) .tmp/$(PROJECT_NAME)1.0.0 || $(MKDIR) .tmp/$(PROJECT_NAME)1.0.0 
    $(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/$(PROJECT_NAME)1.0.0/ && $(COPY_FILE) --parents ../$(PROJECT_NAME)/communicate.h .tmp/$(PROJECT_NAME)1.0.0/ && $(COPY_FILE) --parents ../$(PROJECT_NAME)/main.cpp ../$(PROJECT_NAME)/communicate.cpp .tmp/$(PROJECT_NAME)1.0.0/ && (cd `dirname .tmp/$(PROJECT_NAME)1.0.0` && $(TAR) $(PROJECT_NAME)1.0.0.tar $(PROJECT_NAME)1.0.0 && $(COMPRESS) $(PROJECT_NAME)1.0.0.tar) && $(MOVE) `dirname .tmp/$(PROJECT_NAME)1.0.0`/$(PROJECT_NAME)1.0.0.tar.gz . && $(DEL_FILE) -r .tmp/$(PROJECT_NAME)1.0.0 


clean:compiler_clean 
    -$(DEL_FILE) $(OBJECTS) 
    -$(DEL_FILE) *~ core *.core 


####### Sub-libraries 

distclean: clean 
    -$(DEL_FILE) $(TARGET) 

#-$(DEL_FILE) Makefile 


check: first 

mocclean: compiler_moc_header_clean compiler_moc_source_clean 

mocables: compiler_moc_header_make_all compiler_moc_source_make_all 

compiler_moc_header_make_all: moc_communicate.cpp 
compiler_moc_header_clean: 
    -$(DEL_FILE) moc_communicate.cpp 
moc_communicate.cpp: ../$(PROJECT_NAME)/communicate.h 
    $(QT_QMAKE)moc $(DEFINES) $(INCPATH) ../$(PROJECT_NAME)/communicate.h -o moc_communicate.cpp 

compiler_rcc_make_all: 
compiler_rcc_clean: 
compiler_image_collection_make_all: qmake_image_collection.cpp 
compiler_image_collection_clean: 
    -$(DEL_FILE) qmake_image_collection.cpp 
compiler_moc_source_make_all: 
compiler_moc_source_clean: 
compiler_uic_make_all: 
compiler_uic_clean: 
compiler_yacc_decl_make_all: 
compiler_yacc_decl_clean: 
compiler_yacc_impl_make_all: 
compiler_yacc_impl_clean: 
compiler_lex_make_all: 
compiler_lex_clean: 
compiler_clean: compiler_moc_header_clean 

####### Compile 

main.o: ../$(PROJECT_NAME)/main.cpp ../$(PROJECT_NAME)/communicate.h 
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o main.o ../$(PROJECT_NAME)/main.cpp 

communicate.o: ../$(PROJECT_NAME)/communicate.cpp ../$(PROJECT_NAME)/communicate.h 
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o communicate.o ../$(PROJECT_NAME)/communicate.cpp 

moc_communicate.o: moc_communicate.cpp 
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_communicate.o moc_communicate.cpp 

####### Install 

install: FORCE 

uninstall: FORCE 

FORCE: 


  • परियोजना फ़ाइल बनाएँ: Communicate.pro


QT  += core gui 

TARGET = Communicate 
TEMPLATE = app 


SOURCES += main.cpp\ 
     communicate.cpp 

HEADERS += communicate.h 


  • सेटअप कस्टम Makefile ... परियोजना> गुण:

Setup Makefile

  • सेटअप चलाएँ कार्रवाई ... परियोजना> गुण:

Set run action

  • भागो

Run

हालांकि कि सीबी wxWidgets, और C/C++ सामान्य रूप में साथ काम करने के लिए एक इष्टतम वातावरण है, मैं व्यक्तिगत रूप से लगता है कि क्यूटी के साथ काम करने के मामले में, QtCreator अधिक देशी और के साथ काम करने के लिए अनुकूलित एक विकास वातावरण प्रदान करता है आपके परियोजना क्यूटी।