2015-01-30 4 views
82

это должно быть примером:неопределенная ссылка на 'станд :: соиЬ'

#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 

Примечание: Я использую Debian Wheezy.

+68

Попробуйте 'г ++' вместо 'gcc'. 'gcc' для C и не даст вам доступ к стандартной библиотеке C++. – juanchopanza

+0

Ну, это определенно решило проблему. Насколько я понимаю, GCC является аббревиатурой для Gnu Compiler Collection. Должен ли он вызвать компилятор g ++, когда это необходимо? Таким образом, команда gcc называет компилятор c ... – D1X

+1

@ D1X это потому, что вы вызывали компоновщик отдельно от компилятора. когда вы пишете 'gcc -o edit main.o', он не знает, что для' main.o' понадобятся библиотеки запуска C++. –

ответ

140

Компиляция программы с:

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

в cout присутствует в стандартной библиотеки C++, которые должны были бы явную связь с -lstdc++ при использовании gcc; g++ связывает стандартную библиотеку по умолчанию.

С gcc (g++ должно быть предпочтительнее gcc)

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

Это * может * использоваться для компиляции кода на C++, дело в том, что оно не * link * с библиотекой C++. 'gcc' будет работать отлично, если вы просто добавите' -lstdC++'. –

+3

Пожалуйста, всегда указывайте '-Wall', когда вы приводите примеры командной строки gcc/g ++ - это помогает получить нубы в хорошие привычки на ранней стадии и экономит время от времени в будущем. ;-) –

+0

Возможно, вы захотите также подбросить в '-Wextra' для хорошей оценки. Я не уверен в редактировании, потому что 'g ++' ** является ** предпочтительнее, чем 'gcc -lstdC++' ... – DevSolar

21

Да, с помощью g++ команда работает для меня:

g++ my_source_code.cpp 
Смежные вопросы