2013-03-22 4 views
19

मेरी समस्या यह है कि, जब मैं एक वर्ग के लिए एक कन्स्ट्रक्टर कहता हूं जिसे मैंने बनाया है तो मुझे निम्न त्रुटि मिलती है।.cpp फ़ाइल सहित क्लास कन्स्ट्रक्टर के अनिर्धारित संदर्भ

main.cpp: 20: `StaticObject :: StaticObject (ग्राफिक्स *, sf :: स्ट्रिंग,
sf :: Vector2) '

यह समस्या जा सकता है' तय करने के लिए अपरिभाषित संदर्भ 'key.cpp में .cpp फ़ाइल के लिए शामिल करना शामिल है।

... 
#include "GameObjects/StaticObject.cpp" 
... 

हालांकि यह समस्या हल करता है, यह एक खराब समाधान की तरह लगता है और जो मैंने पहले बताया था उसके खिलाफ चला जाता है। क्या इस समस्या को हल करने का कोई और तरीका है? मैं इस कार्यक्रम को कोड/संकलित करने के लिए जी ++ के साथ नेटबीन्स 7.3 का उपयोग कर रहा हूं। नीचे प्रासंगिक कोड है।

main.cpp

... 

#include <SFML/Graphics.hpp> 
#include "Graphics/Graphics.hpp" 
#include "GameObjects/StaticObject.hpp" 

int main(int argc, char** argv) { 

    //SETUP 
    Graphics graphics; 

    background = new StaticObject(&graphics, "Data/Images/BackgroundPlaceholder.png", sf::Vector2f(0,0)); 

... 

main.hpp

... 

#include <SFML/Graphics.hpp> 
#include "GameObjects/StaticObject.hpp" 

... 

// Objects 
StaticObject *background; 
... 

StaticObject.hpp

#include <SFML/Graphics.hpp> 
#include "../Graphics/Graphics.hpp" 

class StaticObject{ 
public: 
    StaticObject(); 
    StaticObject(Graphics *_graphics, sf::String texture_filename, sf::Vector2f _position); 
    StaticObject(const StaticObject& orig); 
    virtual ~StaticObject(); 
private: 
    // The sprite stores the position 
    sf::Sprite *sprite; 
    sf::Texture *texture; 
}; 

StaticObject.cpp

#include "StaticObject.hpp" 
#include <SFML/Graphics.hpp> 
#include "../Graphics/Graphics.hpp" 

StaticObject::StaticObject(){  
} 

StaticObject::StaticObject(Graphics *_graphics, sf::String texture_filename, sf::Vector2f _position) { 
    sprite = _graphics->AddSprite(texture_filename); 
    sprite->setPosition(_position); 
} 

StaticObject::StaticObject(const StaticObject& orig) { 
} 

StaticObject::~StaticObject() { 
} 

मैं निम्न पंक्ति main.cpp में जोड़ने के लिए है, तो त्रुटि गायब हो जाता है।

#include "GameObject/StaticObject.cpp" 

किसी को भी व्याख्या कर सकते हैं करें:

  1. क्यों इससे समस्या हल हो?

  2. क्यों .cpp को .hpp फ़ाइल सहित शामिल नहीं किया गया था?

  3. क्या ऐसा करने का कोई बेहतर तरीका है?

+1

गेमऑब्जेक्ट/StaticObject.cpp आपकी परियोजना में शामिल है? ऐसा लगता है कि यह त्रुटि से है – bizzehdee

+0

'प्रोजेक्ट में' से आपका क्या मतलब है? उपरोक्त के रूप में, #include का उपयोग समस्या को हल करने लग रहा था लेकिन एक बेहतर तरीका होना चाहिए। रास्ते से धन्यवाद :) – OMGtechy

+3

सीपीपी शामिल न करें, इसे संकलित करें और ऑब्जेक्ट फ़ाइल से लिंक करें। – chris

उत्तर

14

undefined reference त्रुटि इंगित करता है कि किसी फ़ंक्शन/विधि (यानी यहां कन्स्ट्रक्टर) की परिभाषा लिंकर द्वारा नहीं मिली थी।

StaticObject::StaticObject(Graphics*, sf::String, sf::Vector2<float>) 

और कारण यह है कि निम्न पंक्ति जोड़कर:

#include "GameObject/StaticObject.cpp" 

फिक्स मुद्दा है, यह main.cpp के हिस्से के रूप कार्यान्वयन में लाता है अपने वास्तविक क्रियान्वयन StaticObject.cpp में है, जबकि है। इस समस्या को ठीक करने के लिए यह गलत तरीका है।

मैंने नेटबीन्स का अधिक उपयोग नहीं किया है, लेकिन सभी परियोजनाओं में सभी .cpp फ़ाइलों को जोड़ने का विकल्प होना चाहिए, ताकि नेटबीन्स सभी .o फ़ाइलों को एक निष्पादन योग्य में जोड़ने का ख्याल रखे।

यदि StaticObject.cpp अपने पुस्तकालय में बनाया गया है (मुझे संदेह है कि यह मामला यहां है), तो आपको इस पुस्तकालय के स्थान का पथ निर्दिष्ट करना पड़ सकता है, ताकि लिंकर कार्यान्वयन पा सके।

यह वही आदर्श होता है जब आप अपने कार्यक्रम का निर्माण होता है:

Compile: StaticObject.cpp -> StaticObject.o 
Compile: main.cpp -> main.o 
Link: StaticObject.o, main.o -> main_program 

यद्यपि में तरीके हैं जीसीसी/जी सभी मध्यवर्ती ओ फ़ाइल पीढ़ियों को छोड़ और सीधे main_program उत्पन्न करते हैं, अगर आप सभी निर्दिष्ट ++ स्रोत कमांड लाइन (और किसी भी पुस्तकालय) एक ही कमांड लाइन में।

+0

धन्यवाद! :) किसी भी तरह, StaticObject फ़ाइलों ने खुद को परियोजना से हटा दिया था। पुनः जोड़ा और समस्या हल हो गई! – OMGtechy

2

लिंकर StaticObject के लिए परिभाषा नहीं मिल रहा है, जिसका अर्थ है आप संकलित और StaticObject.cpp लिंक नहीं किया है। प्रत्येक .cpp फ़ाइल को अलग से संकलित करने की आवश्यकता होती है, और ऑब्जेक्ट फ़ाइलों को प्रत्येक व्यक्ति के लिए कंपाइलर उत्पादक को लिंकर को दिया जाना आवश्यक है।

मेन.cpp कार्यों में StaticObject.cpp सहित कारण यह है कि आप प्रीप्रोसेसर को StaticObject.cpp की सामग्री को मुख्य.cpp में डालने के लिए कह रहे हैं, जिसे आप संकलित कर रहे हैं, इसलिए परिभाषाएं मुख्य.cpp के संकलित का हिस्सा बनती हैं उत्पादन।

2

मुझे नेटबीन के बारे में बहुत कुछ पता नहीं है, लेकिन शायद गेमऑब्जेक्ट/StaticObject.cpp को संकलित करने के लिए स्रोतों के हिस्से के रूप में शामिल नहीं किया गया है।

यही कारण है कि यदि आप इसे मैन्युअल रूप से main.cpp पर शामिल करते हैं तो उसे स्रोत कोड मिला और सबकुछ ठीक है।

3

सीपीपी फ़ाइल समेत संकलक उस फ़ाइल को उस फ़ाइल के हिस्से के रूप में बनाने का कारण बनता है (जिसे आपको नहीं करना चाहिए), आपको जो करना है उसे GameObject/StaticObject.cpp फ़ाइल को अपनी ऑब्जेक्ट के रूप में संकलित करना है, और लिंक करें एक साथ 2 वस्तुओं।

0

मुझे एक ही समस्या थी, लेकिन मेरा कारण था क्योंकि मैं एक्लिप्स सीडीटी और ऑटोटूल प्रोजेक्ट के साथ उपयोग कर रहा हूं। तो मुझे मैन्युअल रूप से .h और .cpp फ़ाइलों को संबंधित Makefile.am पर मैन्युअल रूप से जोड़ना था, और उसके बाद प्रोजेक्ट> पुन: कॉन्फ़िगर करें प्रोजेक्ट, पुनर्निर्माण करें, जो कि था।

संबंधित मुद्दे