неопределенная ссылка на 'std :: cout'

198

Это будет пример:

#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.

D1X
источник
161
Попробуй g++вместо gcc. gccпредназначен для C и не даст вам доступа к стандартной библиотеке C ++.
juanchopanza
2
Ну, это определенно решило проблему. Как я понимаю, GCC является аббревиатурой от Gnu Compiler Collection. Разве он не должен вызывать компилятор g ++ при необходимости? Поэтому команда gcc вместо этого вызывает компилятор c ...
D1X
1
@ D1X это потому, что вы вызывали компоновщик отдельно от компилятора. когда вы пишете, gcc -o edit main.oон не знает, что main.oпонадобятся библиотеки запуска C ++.
ММ
4
Q: Разве он не должен вызывать компилятор g ++ при необходимости? A: Не более gcc должен вызывать gfortran, gjc, ... и т. Д. И т. Д. По мере необходимости.
paulsm4

Ответы:

280

Скомпилируйте программу с:

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
shauryachats
источник
11
Его можно использовать для компиляции кода C ++, дело в том, что он не связан с библиотекой C ++. gccбудет работать нормально, если вы просто добавите -lstdc++.
Какой-то программист чувак
3
Пожалуйста, всегда включайте, -Wallкогда приводите примеры командной строки gcc / g ++ - это помогает привить новичкам хорошие привычки на ранней стадии и экономит время каждого в будущем. ;-)
Пол Р
4
С каких это пор iostreams и std::coutчасть стандартной библиотеки шаблонов?
ТК
1
Зачем нужен -Werror? Я пересмотрел документацию и, если я правильно понял, сделает ошибки предупреждения и сделает мои проекты менее легкими для компиляции.
D1X
7
@ D1X: Потому что у программистов есть неприятная привычка игнорировать предупреждения. Практически все, о чем -Wallи даже -Wextraпредупреждают, является либо очень реальной проблемой, либо неаккуратным кодированием, которое очень легко исправить. Сообщение здесь должно войти в привычку, где вы считаете предупреждения компилятора полезным указателем на то, где ваш код может быть улучшен, вместо неудобства. Здесь есть сотни вопросов по SO, которые не понадобились бы в первую очередь, если бы использовался OP -Wall -Wextra. -Werrorпросто усиливает это.
DevSolar
42

Да, использование g++команды работает для меня:

g++ my_source_code.cpp
AB
источник
1
затем беги с./a.out
kaleidawave
2

Makefiles

Если вы работаете с make-файлом и оказались здесь, как я, то это, вероятно, то, что вы ищете или:

Если вы используете make-файл, вам нужно изменить его, ccкак показано ниже

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

в

CC = g++

my_executable : main.o
    $(CC) -o my_executable main.o
iggy12345
источник