Форум русскоязычного сообщества Ubuntu


Автор Тема: Первое действие первая ошибка.  (Прочитано 545 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн OPENANDFREEALEX

  • Автор темы
  • Любитель
  • *
  • Сообщений: 51
    • Просмотр профиля
Первое действие первая ошибка.
« : 22 Февраль 2012, 14:42:39 »
Новичек.

Программа:

#include <iostream>

int main ()

{
  std::cout << "welcome to c++!\n";

   return 0;
}



Компилю

gcc -o asd asd.cpp

Ошибки

/tmp/ccsM4zCe.o: In function `main':
asd.cpp:(.text+0x14): undefined reference to `std::cout'
asd.cpp:(.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*)'
/tmp/ccsM4zCe.o: In function `__static_initialization_and_destruction_0(int, int)':
asd.cpp:(.text+0x41): undefined reference to `std::ios_base::Init::Init()'
asd.cpp:(.text+0x46): undefined reference to `std::ios_base::Init::~Init()'
collect2: выполнение ld завершилось с кодом возврата 1

Вопрос что он хочет?

Оффлайн Alie Alexandross

  • Старожил
  • *
  • Сообщений: 1580
    • Просмотр профиля
Re: Первое действие первая ошибка.
« Ответ #1 : 22 Февраль 2012, 15:03:04 »
#include <iostream.h>ЕМНИП - так.
Подпись автора jillsmitt истинна...

andrey_p

  • Гость
Re: Первое действие первая ошибка.
« Ответ #2 : 22 Февраль 2012, 16:07:20 »
Нет, тут все правильно. Надо использовать g++ - это же с++, не просто с (если нет, то установить - sudo apt-get build-essential)
g++ -o asd asd.cpp
« Последнее редактирование: 22 Февраль 2012, 16:17:49 от andrey_p »

Оффлайн Olej

  • Активист
  • *
  • Сообщений: 884
    • Просмотр профиля
Re: Первое действие первая ошибка.
« Ответ #3 : 22 Февраль 2012, 17:19:54 »
Компилю

gcc -o asd asd.cpp

Ошибки

не, ошибки не в том! ;) :

1-я и главная ошибка: что ж вас всех прёт на С++ когда ещё легендарную программу "Hello world!" не научились писать?
С и только С, в редакции K&R!
тем более, что весь Linux написан на классическом С.
и только потом, бегло пользуясь С, для тех задач где он уместен - С++.

2. от расширения .cpp - отвыкайте, это так в виндузях было, в UNIX/GCC - расширение .cc

3. компилятор указываем как gcc - для кода С, g++ - для кода С++
это по дефаулту, или указываем опциями gcc язык, или расширение файла программы .сс (см. пред. п.).

Оффлайн Señor_Gaga

  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Re: Первое действие первая ошибка.
« Ответ #4 : 22 Февраль 2012, 18:04:21 »
#include <iostream>
using namespace std; // зри эту строку!

Оффлайн OPENANDFREEALEX

  • Автор темы
  • Любитель
  • *
  • Сообщений: 51
    • Просмотр профиля
Re: Первое действие первая ошибка.
« Ответ #5 : 22 Февраль 2012, 18:17:37 »
Мне препод дал книгу, это первый пример. Под Линукс сижу месяц. Нравиться. :)

Всем спосибо, приду проверю, должно заработать.

andrey_p

  • Гость
Re: Первое действие первая ошибка.
« Ответ #6 : 22 Февраль 2012, 18:58:54 »
Господа, отвечаете, ну проверьте сначала.

1. <HEADER.h> в современном С++ включает старый (90-какого то года) стандарт с++, соответственно <header> - новый стандарт, с пространствами имен.

2. Для gcc глубоко фиолетово какое расширение имеют файлы с++ - .cxx, cpp, cc, C Также это глубоко фиолетово с точки зрения ОС.

3. Если используются полные идентификаторы, такие как std::cout, то использовать using namespace не надо. Мало того, многие это вообще считают вредной привычкой.
« Последнее редактирование: 22 Февраль 2012, 19:32:39 от andrey_p »

Оффлайн Olej

  • Активист
  • *
  • Сообщений: 884
    • Просмотр профиля
Re: Первое действие первая ошибка.
« Ответ #7 : 22 Февраль 2012, 19:14:41 »
1. <HEADER.h> в современном С++ включает старый (90-какого то года) стандарт с++, соответственно <header> - новый стандарт, с пространствами имен.
это не обязательно, а рекомендательно.
в хэдерах присутствуют и <header.h> (старый стиль) и <header> ... естественно, с новым должны использоваться namespace, а со старым нет, и не смешивать одно с другим.

2. Для gcc глубоко фиолетово какое расширение имеют файлы с++ - .cxx, cpp, cc, C Также это глубоко фиолетово с точки зрения ОС.
никак не фиолетово, и определяется дефаултными настройками, который установят для gcc дистрибьюторы, в разных ОС (Linux, Solaris, QNX) эти дефаултные настройки меняются, и даже между дистрибутивами Linux и версиями gcc, поэтому с .cpp лучше не экспериментировать;
но ещё хуже другое: вторым экспериментом автор начнёт вместо gcc использовать make, и что там будет с суффиксами и дефаултными правилами (Implicit Rules) трудно предсказать в зависимости от версий, посмотрите сюда:
$ make -p



Пользователь решил продолжить мысль 22 Февраль 2012, 19:47:16:
Нет, тут все правильно. Надо использовать g++ - это же с++, не просто с (если нет, то установить - sudo apt-get build-essential)
g++ -o asd asd.cpp

это так,
но нужно иметь в виду, что в проекте GCC нет отдельных компиляторов для С, С++ ... ADA, FORTRAN - это всё один и тот же компилятор, но с разными настройками в опциях при запуске.
это бывает интересно посмотреть вот так:
[olej@notebook ~]$ which g++
/usr/lib/ccache/g++
[olej@notebook ~]$ ls -l /usr/lib/ccache/
итого 0
lrwxrwxrwx 1 root root 16 Май 25  2011 c++ -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 Май 25  2011 cc -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 Май 25  2011 g++ -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 Май 25  2011 gcc -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 Май 25  2011 i686-redhat-linux-c++ -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 Май 25  2011 i686-redhat-linux-g++ -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 Май 25  2011 i686-redhat-linux-gcc -> ../../bin/ccache
- это всё ссылки!

(make по дефаулту, кстати, определяет имя С-компилятора как сс, а не gcc, так что лучше имя gcc вообще не использовать, а использовать cc - в Linux это будет gcc, а в Solaris - Sun Compiler)
 
так что можете, в конце концов, использовать любое имя ... а для языка предполагаемого указывать явно опцию:
$ gcc --help
...
  -x <язык>                Задать язык последующих входных файлов.
                           <язык> может быть: c c++ assembler none
                           'none' означает, что далее язык нужно
                           определять по расширению имени файла
...
(подробнее посмотрите в man gcc).
« Последнее редактирование: 22 Февраль 2012, 19:47:16 от Olej »

Оффлайн OPENANDFREEALEX

  • Автор темы
  • Любитель
  • *
  • Сообщений: 51
    • Просмотр профиля
Re: Первое действие первая ошибка.
« Ответ #8 : 22 Февраль 2012, 21:03:26 »
Да спасибо помогло!  :)

 

Страница сгенерирована за 0.076 секунд. Запросов: 24.