'std :: cout' के लिए अपरिभाषित संदर्भ


197

क्या यह उदाहरण होगा:

#include <iostream>
using namespace std;
int main()
{
    cout << "Hola, moondo.\n";
}

यह त्रुटि फेंकता है:

gcc -c main.cpp gcc -o edit main.o  main.o: In function `main':
main.cpp:(.text+0xa): undefined reference to `std::cout'
main.cpp:(.text+0xf): undefined reference to `std::basic_ostream<char,std::char_traits<char> >& std::operator<< <std::char_traits<char>>(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
main.o: In function `__static_initialization_and_destruction_0(int,int)':
main.cpp:(.text+0x3d): undefined reference to `std::ios_base::Init::Init()'
main.cpp:(.text+0x4c): undefined reference to `std::ios_base::Init::~Init()' collect2: error: ld
returned 1 exit status make: *** [qs] Error 1

इसके अलावा, यह उदाहरण:

#include <iostream>
int main()
{
    std::cout<<"Hola, moondo.\n";
}

त्रुटि फेंकता है:

gcc -c main.cpp gcc -o edit main.o  main.o: In function `main':
main.cpp:(.text+0xa): undefined reference to `std::cout'
main.cpp:(.text+0xf): undefined reference to `std::basic_ostream<char,std::char_traits<char> >& std::operator<<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char> >&, char const*)'
main.o: In function `__static_initialization_and_destruction_0(int,int)': main.cpp:(.text+0x3d): undefined reference to `std::ios_base::Init::Init()'
main.cpp:(.text+0x4c): undefined reference to `std::ios_base::Init::~Init()' collect2: error: ld
returned 1 exit status make: *** [qs] Error 1

नोट: मैं डेबियन व्हीजी का उपयोग कर रहा हूं।


159
g++इसके बजाय प्रयास करें gccgccC के लिए है और आपको C ++ मानक लाइब्रेरी तक पहुंच प्रदान नहीं करेगा।
जुआनकोपंजा

2
खैर, यह निश्चित रूप से समस्या हल हो गई। जैसा कि मैं समझता हूं, GCC Gnu कंपाइलर संग्रह के लिए संक्षिप्त नाम है। जरूरत पड़ने पर क्या इसे g ++ संकलक नहीं कहना चाहिए? इसलिए कमांड gcc के बजाय c संकलक को बुलाता है ...
D1X

1
@ D1X यह इसलिए है क्योंकि आपने संकलक से अलग से लिंकर को लागू किया है। जब आप लिखते हैं gcc -o edit main.oतो यह नहीं पता होता main.oहै कि C ++ स्टार्टअप लाइब्रेरी की जरूरत है।
MM


4
प्रश्न: क्या जरूरत पड़ने पर इसे जी ++ कंपाइलर नहीं कहना चाहिए? A: gcc से अधिक gfortran, gjc, ... आदि आदि को आवश्यकतानुसार नहीं बुलाना चाहिए।
पल्सम ४

जवाबों:


277

इसके साथ कार्यक्रम संकलित करें:

g++ -Wall -Wextra -Werror -c main.cpp -o main.o
     ^^^^^^^^^^^^^^^^^^^^ <- For listing all warnings when your code is compiled.

के रूप में coutसी ++ मानक पुस्तकालय है, जो आवश्यकता होगी में मौजूद है स्पष्ट जोड़ने के साथ -lstdc++का उपयोग करते समय gcc; g++डिफ़ॉल्ट रूप से मानक लाइब्रेरी लिंक करता है।

के साथ gcc, ( g++को प्राथमिकता दी जानी चाहिए gcc)

gcc main.cpp -lstdc++ -o main.o

11
इसका उपयोग C ++ कोड को संकलित करने के लिए किया जा सकता है, बात यह है कि यह C ++ लाइब्रेरी के साथ लिंक नहीं करता है । gccयदि आप बस जोड़ते हैं तो ठीक काम करेगा -lstdc++
कुछ प्रोग्रामर

3
कृपया -Wallgcc / g ++ कमांड लाइन उदाहरण देते समय हमेशा शामिल करें - यह शुरुआती चरण में अच्छी आदतों में नॉब प्राप्त करने में मदद करता है और हर समय सड़क से आगे के समय को बचाता है। ;-)
पॉल आर

4
कब से आईओस्ट्रीम और std::coutस्टैंडर्ड टेम्पलेट लाइब्रेरी का हिस्सा है?
टीसी

1
-वेरर की आवश्यकता क्यों है? मैंने दस्तावेज़ीकरण को संशोधित किया है और अगर मैं अच्छी तरह से समझता हूं कि चेतावनियों को गलत कर देगा और मेरी परियोजनाओं को संकलित करना कम आसान बना देगा।
D1X

7
@ D1X: क्योंकि चेतावनी को अनदेखा करने के लिए प्रोग्रामर के बीच एक बुरा आदत है । वस्तुतः सब कुछ है कि -Wallऔर यहां तक -Wextraकि के बारे में चेतावनी दी या तो एक बहुत ही वास्तविक समस्या है, या मैला कोडिंग है कि बहुत आसानी से तय किया जा सकता है। यहां संदेश यह है कि आप एक ऐसी आदत में पड़ जाएं, जहां आप कंपाइलर चेतावनियों को एक उपयोगी पॉइंटर मानते हैं, जहां एक उपद्रव के बजाय आपका कोड बेहतर हो सकता है। कर रहे हैं सैकड़ों सवाल इतने पर यहाँ है कि पहली जगह में आवश्यक नहीं होता है, तो ओ पी का इस्तेमाल किया था की -Wall -Wextra-Werrorबस इसे मजबूत कर रहा है।
DevSolar 11

42

हां, g++कमांड का उपयोग करना मेरे लिए काम कर रहा है:

g++ my_source_code.cpp

तो साथ चलाने./a.out
kaleidawave

2

makefiles

यदि आप एक मेकफाइल के साथ काम कर रहे हैं और आप मेरी तरह यहां समाप्त हो गए हैं, तो संभवतः यह वही है जो आप देख रहे हैं या:

यदि आप मेकफाइल का उपयोग कर रहे हैं, तो आपको ccनीचे दिखाए अनुसार बदलना होगा

my_executable : main.o
    cc -o my_executable main.o

सेवा

CC = g++

my_executable : main.o
    $(CC) -o my_executable main.o
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.