Очень простая программа не работает на С++?

Я не могу понять, почему это не работает...

я работаю в линуксе

г++ ничего не делает

gcc выводит следующее:

/tmp/ccyg7NDd.o: In function `main':
test.cc:(.text+0x14): undefined reference to `std::cout'
test.cc:(.text+0x19): 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*)'
test.cc:(.text+0x21): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)'
test.cc:(.text+0x29): undefined reference to `std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))'
/tmp/ccyg7NDd.o: In function `__static_initialization_and_destruction_0(int, int)':
test.cc:(.text+0x51): undefined reference to `std::ios_base::Init::Init()'
test.cc:(.text+0x56): undefined reference to `std::ios_base::Init::~Init()'
/tmp/ccyg7NDd.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status

Код:

#include<iostream>
#include<stdio.h>

int main(){

std::cout<<"test "<<std::endl;
return 0;

};

person spatara    schedule 25.02.2012    source источник
comment
Что вы имеете в виду, что g++ ничего не делает?   -  person Troubadour    schedule 25.02.2012
comment
gcc — это компилятор C, вам нужно использовать g++. Что значит g++ ничего не делает? Вы должны выполнить скомпилированный двоичный файл после его сборки (т.е. когда g++ завершится).   -  person hmjd    schedule 25.02.2012
comment
@hmjd: g++ является gcc, он просто автоматически связывается с libstdc++. Вы можете получить тот же эффект с gcc, указав -lstdc++.   -  person Oliver Charlesworth    schedule 25.02.2012
comment
Что сказал @hmjd: после запуска g++ вы хотите запустить файл, который без других опций называется a.out.   -  person smparkes    schedule 25.02.2012
comment
под этим ничего не делается, я имею в виду, что он не выводит на консоль... что, я думаю, должно быть   -  person spatara    schedule 25.02.2012
comment
@spatara: компилятор напечатает что-то только в случае возникновения проблемы. Как и в большинстве программ в стиле Unix, молчание означает успех. Вы должны найти программу с именем a.out или как-то еще, если вы дали компилятору опцию -o; работает, что должно вывести test на консоль.   -  person Mike Seymour    schedule 26.02.2012
comment
@spatara Если вам не нравится тишина, вы можете передать флаг --verbose, и он расскажет вам больше, чем вы хотите знать.   -  person Daniel Fischer    schedule 26.02.2012
comment
g++ ничего не делает? Посмотрите на новый файл в папке. Ничего не делать - успех компиляции!   -  person ihsoy ih    schedule 20.12.2012


Ответы (5)


gcc - это компилятор C, вам нужно использовать g++ (или использовать gcc с опцией -lstdc++, как указано другими). Если ничего не печатается после того, как вы используете g++, это то, что вы имеете в виду, вы должны выполнить скомпилированный двоичный файл после его сборки (т.е. когда g++ завершится).

основной.cpp:

#include<iostream>

int main(){

std::cout<<"test "<<std::endl;
return 0;

};

Строить:

g++ main.cpp -o main

Выполнять:

./main

Выход:

test 
person hmjd    schedule 25.02.2012

Это код C++, поэтому вы должны использовать g++, а не gcc. Также #include<stdio.h> не нужен

person sank    schedule 25.02.2012

Я думаю, вы по ошибке связываетесь с командой компилятора C вместо команды компилятора C++. Попробуй это:

g++ test.cc -o тест

person Thomas Padron-McCarthy    schedule 25.02.2012

Я думаю, что основная проблема заключается в том, что двоичное имя «тест» на самом деле уже является частью системы Linux. При вводе «man test» отображается руководство для тестового двоичного файла. У меня была ТОЧНО такая же проблема. Это было решено просто путем компиляции двоичного файла во что-то отличное от «теста».

person jjdaybr    schedule 28.08.2014

person    schedule
comment
Буквы и '‹' не могут принадлежать одному и тому же токену (конечно, за исключением строковых литералов), поэтому пробелы не нужны для компилятора (но для удобочитаемости, только это не является частью стандарта). - person Daniel Fischer; 26.02.2012
comment
Это абсолютно неверно. Компиляторам C++ пробелы нужны только в очень немногих ситуациях, когда они не могут размечать входные данные или когда они размечают их неправильно (например, проблема со старым шаблонным шаблоном ‹x‹y››, с которой новые компиляторы теперь работают в любом случае). - person Shadow Radiance; 29.08.2014