невизначене посилання на '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

Примітка: я використовую Debian Wheezy.


161
Спробуйте g++замість цього gcc. gccпризначено для C і не надасть вам доступ до стандартної бібліотеки C ++.
juanchopanza

2
Добре, що напевно вирішило проблему. Як я розумію, GCC - це абревіатура для колекції Gnu Compiler. Чи не повинен він викликати компілятор g ++ при необхідності? Тож команда gcc замість цього викликає компілятор c ...
D1X

1
@ D1X це тому, що ви викликали посилання окремо від компілятора. коли ви пишете, gcc -o edit main.oце не знає, що main.oзнадобляться бібліотеки запуску C ++.
М.М.


4
З: Чи не повинен він викликати компілятор g ++ при необхідності? Відповідь: Не більше ніж gcc повинні називати gfortran, gjc, ... і т. Д. І т.д.
paulsm4

Відповіді:


278

Скомпілюйте програму:

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

11
Його можна використовувати для компіляції коду C ++, річ у тому, що він не зв’язується з бібліотекою C ++. gccбуде добре працювати, якщо ви просто додасте -lstdc++.
Якийсь програміст чувак

3
Будь-ласка, завжди -Wallвказуйте приклади командного рядка gcc / g ++ - це допомагає наближатись до ноб у хороших звичках на ранній стадії та економить час для подальшого життя у дорозі. ;-)
Пол Р

4
З якого часу iostreams та std::coutчастина бібліотеки стандартних шаблонів?
ТЦ

1
Чому потрібен -Werror? Я переглянув документацію і, якщо я добре розумію, зроблять помилки попереджень і зроблять мої проекти менш простими для складання.
D1X

7
@ D1X: Тому що серед програмістів існує неприємна звичка ігнорувати попередження. Практично все, про що -Wallі навіть -Wextraпопереджають, це або дуже реальна проблема, або неохайне кодування, яке дуже легко можна виправити. Повідомлення тут полягає в тому, щоб ввійти в звичку, коли ви вважаєте попередження компілятора корисним вказівником на те, де ваш код можна було б покращити замість неприємностей. Тут є сотні запитань щодо ТА, які не були б необхідні в першу чергу, якби ОП використовувала -Wall -Wextra. -Werrorпросто підкріплює це.
DevSolar

42

Так, використовуючи g++команду, яка працювала на мене:

g++ my_source_code.cpp

1
потім біжіть з./a.out
kaleidawave

2

Makefiles

Якщо ви працюєте з makefile, і ви опинилися тут, як я, то це, мабуть, те, що ви шукаєте, або:

Якщо ви використовуєте makefile, його потрібно змінити, ccяк показано нижче

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

до

CC = g++

my_executable : main.o
    $(CC) -o my_executable main.o
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.