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


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Программа на С++, работающая под виндой, с Ubuntu не компилируется.  (Прочитано 2751 раз)

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

Оффлайн Oleg_Ponomaryov

  • Автор темы
  • Новичок
  • *
  • Сообщений: 41
    • Просмотр профиля
Приспичило освоиться с кодингом C++ под Ubuntu. Дошёл до работы с текстовыми файлами, и тут загвоздка. Использую простенькую программу (находит количество костей в домино с таким-то максимальным количеством точек):
#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;


int main()
{
int k;
ifstream fin;
ofstream fout;
fin.open("domino.in",ios::in);
fout.open("domino.out",ios::out);
fin>>k; // получаем значение максимального количества точек
fout<<((k+1)*(k+2))/2; // выводим результат расчёта количества костей домино
return 0;
}
В Visual C++ под Windows всё работало отлично, но с Ubuntu получается вот это:
oleg@Dell-Inspiron:~/Документы/C++/Files$ gcc files.cpp
files.cpp:1:20: фатальная ошибка: stdafx.h: Нет такого файла или каталога
компиляция прервана.
Подскажите полному новичку в программировании под Linux, как исправить проблему?

Оффлайн JmAbuDabi

  • Старожил
  • *
  • Сообщений: 2468
  • 나는 빅터 해요. 나는 프로그래머입니다
    • Просмотр профиля
Удалите Поделие Винды <stdafx.h>

И всё работает.
Покой – это не место, где тихо и мирно, где нет шума и беспокойства.
Покой – это когда при всем этом, вы сохраняете мир и спокойствие в своем сердце.

Оффлайн soarin

  • Старожил
  • *
  • Сообщений: 1850
  • ubuntu 20.04
    • Просмотр профиля
"Удалите Поделие Винды <stdafx.h>"
Не такое уж подделие, убыстряет компиляцию.
PS: Олсо в идешках на gcc тоже есть возможность задания предкомпилированных заголовоков.
« Последнее редактирование: 08 Октябрь 2013, 07:03:22 от soarin »

Оффлайн Oleg_Ponomaryov

  • Автор темы
  • Новичок
  • *
  • Сообщений: 41
    • Просмотр профиля
JmAbuDabi,
soarin,
Спасибо за ответы. Сначала я просто удалил строку #include "stdafx.h"В итоге получил:
oleg@Dell-Inspiron:~/Документы/C++/Files$ gcc -o files files.cpp
/tmp/ccQqn6FA.o: In function `main':
files.cpp:(.text+0x26): undefined reference to `std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream()'
files.cpp:(.text+0x35): undefined reference to `std::basic_ofstream<char, std::char_traits<char> >::basic_ofstream()'
files.cpp:(.text+0x4e): undefined reference to `std::basic_ifstream<char, std::char_traits<char> >::open(char const*, std::_Ios_Openmode)'
files.cpp:(.text+0x67): undefined reference to `std::basic_ofstream<char, std::char_traits<char> >::open(char const*, std::_Ios_Openmode)'
files.cpp:(.text+0x80): undefined reference to `std::basic_istream<char, std::char_traits<char> >::operator>>(int&)'
files.cpp:(.text+0xb1): undefined reference to `std::basic_ostream<char, std::char_traits<char> >::operator<<(int)'
files.cpp:(.text+0xc5): undefined reference to `std::basic_ofstream<char, std::char_traits<char> >::~basic_ofstream()'
files.cpp:(.text+0xd4): undefined reference to `std::basic_ifstream<char, std::char_traits<char> >::~basic_ifstream()'
files.cpp:(.text+0xf9): undefined reference to `std::basic_ofstream<char, std::char_traits<char> >::~basic_ofstream()'
files.cpp:(.text+0x10d): undefined reference to `std::basic_ifstream<char, std::char_traits<char> >::~basic_ifstream()'
/tmp/ccQqn6FA.o: In function `__static_initialization_and_destruction_0(int, int)':
files.cpp:(.text+0x14e): undefined reference to `std::ios_base::Init::Init()'
files.cpp:(.text+0x153): undefined reference to `std::ios_base::Init::~Init()'
/tmp/ccQqn6FA.o:(.eh_frame+0x13): undefined reference to `__gxx_personality_v0'
collect2: выполнение ld завершилось с кодом возврата 1
В общем вроде как ругается, что ofstream и instream не объявлены в подключаемых файлах. Как я понял, нужные файлы подключались в stdafx.h. В этом файле под виндой записано было:
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//

#pragma once

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>



// TODO: reference additional headers your program requires here

Вставил в свою программу подключения файлов
#include "targetver.h"

#include <stdio.h>
#include <tchar.h>
На "targetver.h" и <tchar.h> gcc ругался как до этого на stdafx.h. В targetver.h подключается только <SDKDDKVer.h>, пробовал его подключать сам - та же фигня, нет такого файла или каталога и т.д. А если оставить только подключение <stdio.h>, то получаю:
oleg@Dell-Inspiron:~/Документы/C++/Files$ gcc -o files files.cpp
/tmp/ccK55qt1.o: In function `main':
files.cpp:(.text+0x26): undefined reference to `std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream()'
files.cpp:(.text+0x35): undefined reference to `std::basic_ofstream<char, std::char_traits<char> >::basic_ofstream()'
files.cpp:(.text+0x4e): undefined reference to `std::basic_ifstream<char, std::char_traits<char> >::open(char const*, std::_Ios_Openmode)'
files.cpp:(.text+0x67): undefined reference to `std::basic_ofstream<char, std::char_traits<char> >::open(char const*, std::_Ios_Openmode)'
files.cpp:(.text+0x80): undefined reference to `std::basic_istream<char, std::char_traits<char> >::operator>>(int&)'
files.cpp:(.text+0xb1): undefined reference to `std::basic_ostream<char, std::char_traits<char> >::operator<<(int)'
files.cpp:(.text+0xc5): undefined reference to `std::basic_ofstream<char, std::char_traits<char> >::~basic_ofstream()'
files.cpp:(.text+0xd4): undefined reference to `std::basic_ifstream<char, std::char_traits<char> >::~basic_ifstream()'
files.cpp:(.text+0xf9): undefined reference to `std::basic_ofstream<char, std::char_traits<char> >::~basic_ofstream()'
files.cpp:(.text+0x10d): undefined reference to `std::basic_ifstream<char, std::char_traits<char> >::~basic_ifstream()'
/tmp/ccK55qt1.o: In function `__static_initialization_and_destruction_0(int, int)':
files.cpp:(.text+0x14e): undefined reference to `std::ios_base::Init::Init()'
files.cpp:(.text+0x153): undefined reference to `std::ios_base::Init::~Init()'
/tmp/ccK55qt1.o:(.eh_frame+0x13): undefined reference to `__gxx_personality_v0'
collect2: выполнение ld завершилось с кодом возврата 1
То же, что и просто при отсутствии подключения "stdafx.h". В общем какой-то заколдованный круг - не понятно, какие-же всё-таки файлы нужно подключить =)

Оффлайн soarin

  • Старожил
  • *
  • Сообщений: 1850
  • ubuntu 20.04
    • Просмотр профиля
g++ используй для c++

Оффлайн JmAbuDabi

  • Старожил
  • *
  • Сообщений: 2468
  • 나는 빅터 해요. 나는 프로그래머입니다
    • Просмотр профиля
Опередил,soarin,


g++ main.cpp -o main
Покой – это не место, где тихо и мирно, где нет шума и беспокойства.
Покой – это когда при всем этом, вы сохраняете мир и спокойствие в своем сердце.

Оффлайн Oleg_Ponomaryov

  • Автор темы
  • Новичок
  • *
  • Сообщений: 41
    • Просмотр профиля
soarin,
JmAbuDabi,
Ещё раз спасибо, вся скомпилировалось. Теперь, правда, есть проблемы в работе программы. Покольку под виндой она работала, мне кажется, что дело в моём непонимании всех нюансов программирования под Linux.
В общем, после компиляции, ещё не запуская программы, в папке Domino имеется: сам исполняемый файл Domino, текстовый файл domino.in, в котором записано одно число (6, к примеру), ну и файл с исходным кодом, на котором я в итоге остановился:
#include <iostream>
#include <fstream>
using namespace std;


int main()
{
int k;
ifstream fin;
ofstream fout;
fin.open("domino.in",ios::in);
fout.open("domino.out",ios::out);
fin>>k;
fout<<((k+1)*(k+2))/2;
return 0;
}
Потом запускаю исполняемый файл и получается:
oleg@Dell-Inspiron:~/Документы/C++/Domino$ sudo sh Domino
Domino: 1: Domino: ELF: not found
Domino: 1: Domino: Syntax error: end of file unexpected (expecting ")")


В итоге вместо того, чтобы создать файлы domini.out с записанным в нём ответом, програма оставляет после работы только пустой файл со странным названием в виде символов, которые сюда скопировать не получается. Они представляют собой два квадрата, в которых как в таблице записано цифры двоичной системы исчисления. Первый квадрат (0,0,0,1), а второй (0,0,1,0). Не знаю, так ли это важно, пишу всё подробно потому что раньше с таким не сталкивался. Кстати, такие же квадраты, только их больше и диапазон чисел в них больше (отчётливо удалось 7 разглядеть), появляется в терминале как бы на фоне надписи ELF в строке
Domino: 1: Domino: ELF: not foundПонимаю, что запутано это всё, думаю, чтобы понять придётся попробовать эту прогу у себя скомпилировать, поэтому сразу извиняюсь за неудобства и спасибо всем, кто помучается с этим :)

Оффлайн JmAbuDabi

  • Старожил
  • *
  • Сообщений: 2468
  • 나는 빅터 해요. 나는 프로그래머입니다
    • Просмотр профиля
Какк-кк--к-к--кой sudo??

Какой sh??

Вы с сума не сходите.

Правильно будет так.
Перед операцией, удалите domino
g++ main.cpp -o domino
sudo chmod +x domino
./domino
Покой – это не место, где тихо и мирно, где нет шума и беспокойства.
Покой – это когда при всем этом, вы сохраняете мир и спокойствие в своем сердце.

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7188
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Oleg_Ponomaryov, вывод команды
lsв этой директории.
И да, если компилили командой
g++ main.cpp -o mainТо запускать надо
./main
Пользователь решил продолжить мысль 09 Октябрь 2013, 01:01:56:
JmAbuDabi, да права автоматом исполняемые будут, не надо так делать.

Оффлайн JmAbuDabi

  • Старожил
  • *
  • Сообщений: 2468
  • 나는 빅터 해요. 나는 프로그래머입니다
    • Просмотр профиля
JmAbuDabi, да права автоматом исполняемые будут, не надо так делать.

Не знал.
Покой – это не место, где тихо и мирно, где нет шума и беспокойства.
Покой – это когда при всем этом, вы сохраняете мир и спокойствие в своем сердце.

Оффлайн Oleg_Ponomaryov

  • Автор темы
  • Новичок
  • *
  • Сообщений: 41
    • Просмотр профиля
peregrine, JmAbuDabi, спасибо, дело действительно было в том, что я просто неправильно запускал программу. Если запускать так: ./domino, то всё отлично.

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5215
  • Все по палатам!
    • Просмотр профиля
Извините, я все еще учусь

Оффлайн john1400

  • Активист
  • *
  • Сообщений: 582
  • debian
    • Просмотр профиля
а в чем разница между gcc и g++
ведь ман один и то же
man g++
man gcc
где про это почитать и что православнее ?

jeny@jeny-Aspire-4750 ~ $ gcc --version | head -n1
gcc (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
jeny@jeny-Aspire-4750 ~ $ g++ --version | head -n1
g++ (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
jeny@jeny-Aspire-4750 ~ $
Как это понимать ?

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7188
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
john1400, gcc - компилятор СИ, g++ - компилятор C++.

Пользователь решил продолжить мысль 23 Октябрь 2013, 20:12:00:
john1400,
Цитата: цитирую man gcc
gcc - GNU project C and C++ compiler
...
Only the most useful options are listed here; see below for the remainder.  g++ accepts mostly the same options as gcc.
« Последнее редактирование: 23 Октябрь 2013, 20:12:49 от peregrine »

 

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