Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Вопросы по программированию


Автор: codevias 1.6.2015, 15:02
Здравствуйте! Осваиваю программирование и С++ в частности. Надеюсь на содействие.
Тему создал с целью публиковать в ней нубские вопросы и не плодить новых тем.

Вопрос №1: Простейший код HelloWorld.сpp не компилируется GCC в Debian (пишет, что есть ошибки).
Мне сложно понять в чем именно может быть ошибка в ниже описанно элементарном коде на C++.
Код

#include <iostream>
using namespace std;

int main()
{
    std::cout << "Hello Wordl" << std::endl;
    return 0;
}

Но при попытке запустить в терминале команду gcc /home/debian/Experimental/gcc/Hello.cpp -o /home/debian/Experimental/gcc/Hello, 
терминал выводит на экран консоли следующие сообщения об ошибках:

debian@debian:~$ gcc /home/debian/Experimental/gcc/Hello.cpp
/tmp/ccPiPmej.o: In function `main':
Hello.cpp:(.text+0xa): undefined reference to `std::cout'
Hello.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*)'
Hello.cpp:(.text+0x14): 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> >&)'
Hello.cpp:(.text+0x1c): undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))'
/tmp/ccPiPmej.o: In function `__static_initialization_and_destruction_0(int, int)':
Hello.cpp:(.text+0x4a): undefined reference to `std::ios_base::Init::Init()'
Hello.cpp:(.text+0x59): undefined reference to `std::ios_base::Init::~Init()'
collect2: error: ld returned 1 exit status

Не понимаю, что именно не нравится gcc и что оно от меня хочет?

P.S.
Сейчас читаю нубские темы данной ветки форума, поэтому прошу не выражаться и не посылать меня их читать. Спасибо за понимание!

Автор: rudolfninja 1.6.2015, 15:13
Здравствуйте.
Вы перед функцией main объявили компилятору, что хотите использовать функции из пространства имен std:
Код

using namespace std;

После этой строки все стандартные функции будут выполняться из этого пространства имен.
Далее при выводе на экран вы явно указываете, что используете std::cout
Код

std::cout << "Hello Wordl" << std::endl;

Таким образом, компилятор в пространстве имен std пытается найти еще одно пространство имен std, не находит и не знает откуда взять эти функции.
То есть, если вы написали using namespace std, то явно указывать пространство имено перед функцией не надо.  Хотя, если вы только начинаете, то не пытайтесь вникать в пространство имен и область видимости.
Исправьте строку с выводом на экран на такую:
Код

cout << "Hello Wordl" << endl;

Автор: xvr 1.6.2015, 15:27
Цитата(rudolfninja @  1.6.2015,  15:13 Найти цитируемый пост)
Таким образом, компилятор в пространстве имен std пытается найти еще одно пространство имен std, не находит и не знает откуда взять эти функции.

Это не поможет. Компилятор достаточно умный, что бы искать не только в namespace'ах, упомянутых в using namespace, но и напрямую от корня.

Ошибка не в программе, а в процессе компиляции. Если приглядется к выдаче с ошибками, то видно, что ошибки валятся не от компиляции, а от линковки.

Исправить это просто:
Код

debian@debian:~$ g++ /home/debian/Experimental/gcc/Hello.cpp

При линковке с помощью gcc он подает на линковку только С библиотеки, а std::cout, который вы использовали, находится в С++ библиотеке. Так что линковать надо с помощью g++

Автор: codevias 1.6.2015, 15:28
rudolfninja, спасибо за ответ!

Исправил строку в примере как Вы и подсказали, но к сожалению, эффект от запуска и компиляции остался тем же. 
Цитата

debian@debian:~$  gcc /home/debian/Experimental/gcc/Hello.cpp -o /home/debian/Experimental/gcc/Hello
/tmp/ccOWAlOb.o: In function `main':
Hello.cpp:(.text+0xa): undefined reference to `std::cout'
Hello.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*)'
Hello.cpp:(.text+0x14): 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> >&)'
Hello.cpp:(.text+0x1c): undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))'
/tmp/ccOWAlOb.o: In function `__static_initialization_and_destruction_0(int, int)':
Hello.cpp:(.text+0x4a): undefined reference to `std::ios_base::Init::Init()'
Hello.cpp:(.text+0x59): undefined reference to `std::ios_base::Init::~Init()'
collect2: error: ld returned 1 exit status


Сейчас гуглю undefined reference to нашел сообщения на тему некоего Code Blocks, буду читать и разбираться, а то первый камень в начале познания и тот в простейшем примере.. попробую запустить код в visual studio.

Автор: rudolfninja 1.6.2015, 15:29
xvr, спасибо, я вас понял =)

Добавлено @ 15:30
codevias, смотрите что написал xvr.
Исправьте эту строку на 
Код

printf("Hello world\n");

Только сначала подключите stdio.h
Или компилируйте так, как сказал xvr.

Автор: codevias 1.6.2015, 15:31
xvr, пробовал вписывать в начале команды g++, но консоль ругается, что такой команды нет.
Цитата

debian@debian:~$ g++ /home/debian/Experimental/gcc/Hello.cpp -o /home/debian/Experimental/gcc/Hello
bash: g++: команда не найдена

GCC устанавливал командой - "aptitude install gcc".

Что такое "линковка"?

rudolfninja, и что у C++ в разных системах разные функции для вывода?  smile 

P.S.
Выбрал дебиан решив, что если справлюсь с освоением этой системы, то и с остальными ubuntu, fedora и прочих проблем не будет,
но как работать с ОС у которой в GCC после установки нет g++ внутри..  smile 

Автор: rudolfninja 1.6.2015, 15:38
Цитата(codevias @  1.6.2015,  15:31 Найти цитируемый пост)
но как работать с ОС у которой в GCC после установки нет g++ внутри..

Странно, что выбрав debian вы выбрали C++, а не C =)
В большинстве, у пользователе линукса в целом идеология такая, что они C++ редко используют =) Большинстов матерых линукс-программистов пишут на C.

Автор: codevias 1.6.2015, 15:47
rudolfninja, хочу приложения писать на C++, о системном программировании я не задумывался, когда выбирал Debian, хотел найти альтернативу Windows, которая после долгого использования показалась мне намного приятней, шустрее и лучше. После GCC планировал перейти на qt или что нибудь подобное, конкурента дорогой VS. С освоением того же python, проблем не возникло, его стандартный IDLE работает в debian "без сучка, без задоринки". А вот с C++ вообще беда, но всё равно хочу его, он превосходит Python и компилируемый. Ubuntu и лоли-дистры мне пока не интересны, а то буду как в Windows сидеть, решение проблем в которой - это перезагрузка.

Автор: rudolfninja 1.6.2015, 15:50
К сожалению, я по линуксу вам не помогу. 
Вот https://packages.debian.org/ru/squeeze/g++ на g++ для дебиан, попробуйте скачать оттуда.

Автор: xvr 1.6.2015, 15:53
gcc - это целый набор компиляторов. Видимо С++ у базу не входит (точнее компилятор входит, а вот библиотеки видимо нет)
Попробуйте aptitude install g++

Автор: codevias 1.6.2015, 16:02
rudolfninja, спасибо большое!
xvr, попробовал, заработала шарманка! Скомпилировал и запустил, всё работает.

Всем кому могу презентую плюсик! Не могу, надо 100 постов набить. 
Ничего, время есть, наскребу сотню другую вопросов.  smile 

Автор: baldina 1.6.2015, 16:17
Цитата(codevias @  1.6.2015,  15:02 Найти цитируемый пост)
gcc /home/debian/Experimental/gcc/Hello.cpp

Код

$ make Hello

makefile (в отличие от gcc) по умолчанию знает какие библиотеки подключать
когда ваши проекты станут больше, будете пользоваться какой-нибудь ide, или научитесь писать свои файлы для https://ru.wikipedia.org/wiki/Make

Автор: codevias 1.6.2015, 16:25
baldina, спасибо, буду знать. Cmake случаем не того же поля ягода?

Автор: baldina 1.6.2015, 16:45
того

Автор: konshyn 1.6.2015, 19:06
Цитата(xvr @  1.6.2015,  15:53 Найти цитируемый пост)
gcc - это целый набор компиляторов. Видимо С++ у базу не входит 

вообще-то,  gcc - это компилятор С.
а вот GCC (аббревиатура) - это коллекция компиляторов. Туда входят и gcc и g++.
GCC и gcc путают многие.

Автор: codevias 1.6.2015, 19:26
konshyn,  smile 

http://forum.vingrad.ru/forum/topic-48015.html как должен себя вести нуб, есть такой пункт:
Цитата

5) Не нужно плодить тем, достаточно просто бросать все вопросы по сокетам в тему "CSocket: третий параметр конструктора"

То есть концентрировать вопросы в одной теме не приветствуется, надо создавать отдельные темы по каждому вопросу с вдумчивым названием?

Автор: codevias 1.6.2015, 20:59
Цитата(rudolfninja @ 1.6.2015,  15:29)
Исправьте эту строку на 
Код

printf("Hello world\n");

Только сначала подключите stdio.h

https://ru.wikipedia.org/wiki/Iostream 

printf("Hello world\n"); - для языка Си, а не Си++

Автор: codevias 6.6.2015, 17:18
Какая есть разница между /n и endl?

Ответы:
https://toster.ru/q/62780
http://demin.ws/blog/russian/2012/04/25/endl-vs-new-line/


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)