Jak skompilować kod źródłowy C ++ (błąd „nie znaleziono pliku iostream.h”)?

20

Nie chcę dyskutować o C ++ ani żadnym języku programowania! Chcę tylko wiedzieć, co robię źle z Linuksem Ubuntu przy kompilacji helloworld.cpp!

Uczę się C ++, więc moje kroki to:

otwórz hello.cpp w vimie i napisz to

#include <iostream.h>
int main()
{
    cout << "Hello World!\n";`
    return 0;
}

Więc potem spróbowałem tego w terminalu

g++ hello.cpp

I wyjście jest

hello.cpp:1:22: fatal error: iostream.h: No such file or directory
compilation terminated.

Co sugerujesz? Każdy przydatny przewodnik krok po kroku dla mnie? Dzięki!

Gabriel
źródło
2
W przypadku, gdy ktoś rozważa głosowanie nad zamknięciem tego pytania jako nie na temat: To naprawdę jest problem specyficzny dla platformy, ponieważ najpopularniejszy kompilator C ++ dla Windows (Microsoft Visual C ++) akceptuje tę składnię, ale większość innych kompilatorów (w tym g++w Ubuntu) nie akceptuj tego.
Eliah Kagan,
#include <iostream> using namespace std; int main () {cout << „Hello World”; zwraca 0; } to może działać ...

Odpowiedzi:

43

Powinieneś używać #include <iostream>, nie iostream.h; .h forma jest bardzo stare i nieaktualne od lat.

Możesz przeczytać więcej, niż prawdopodobnie chcesz wiedzieć na formularzach .h vs nie- h tutaj: http://members.gamedev.net/sicrane/articles/iostream.html

(Plus, powinieneś napisać std::coutlub mieć linię, w using namespace std;przeciwnym razie twój następny błąd będzie polegał na tym, że kompilator nie znajdzie definicji cout.)

Riccardo Murri
źródło
4
@ gabriel C ++ ma długą historię, sięgającą połowy 1980 roku. Istnieje obecnie kilka opublikowanych standardów, z których najnowszy (C ++ 11) został wydany wcześniej w tym roku, a poprzedni (ten, który przestrzegają dziś wszystkie kompilatory) pochodzi z 2003 r. (C ++ 03). Przewodnik, który podłączyłeś, wydaje się jednak znacznie starszy, sądząc z oprogramowania kompilatora, o którym wspomina (według Wikipedii, Borland Turbo C ++ został przerwany w 1994 r.). Jeśli wybierzesz samouczek zgodny ze standardem C ++ 03, Twój kod będzie działał na dowolnej dostępnej dziś dystrybucji Linuksa.
Riccardo Murri
1
@ gabriel Wygląda na to, że odpowiedź na twoje pytanie została już znaleziona na StackOverflow: stackoverflow.com/questions/909323/...
Riccardo Murri
1
Możesz także potrzebować: sudo apt-get install build-essential
david6
2
@ david6: Mam zainstalowane niezbędne narzędzie do kompilacji, ale nie ma go iostream.hw moim systemie. W rzeczywistości pliki nagłówkowe C ++ są instalowane przez libstdc ++ - dev , który jest wymagany przez pakiet kompilatora C ++ g ++ , który z kolei jest wymagany przez niezbędne do kompilacji . Więc nie, nie potrzebujesz kompilacji niezbędnej do kompilacji prostych programów w C ++; g++wystarczy zainstalować pakiet.
Riccardo Murri
1
Zaleca się po prostu rozpoczęcie coutpracy bez std::prefiksu . Nawet wiele instrukcji (bez ) jest ogólnie lepszych, ponieważ nie wprowadzasz identyfikatorów z przestrzeni nazw, których nie chcesz i mogą powodować konflikty z nazwami we własnym programie. using std::cout;using namespace std;usingnamespacestd
Eliah Kagan
15

Powinieneś zmienić iostream.hna iostream. Otrzymałem również ten sam błąd, co ty, ale kiedy zmieniłem iostream.hna just iostream, działał poprawnie. Może to też zadziała dla ciebie.

Innymi słowy, zmień wiersz z napisem:

#include <iostream.h>

Zamiast tego powiedz to:

#include <iostream>

Standardowe pliki nagłówkowe biblioteki C ++, jak zdefiniowano w standardzie, nie mają .hrozszerzeń.

Jak wspomniano w odpowiedzi Riccardo Murri , będziesz musiał również zadzwonić coutpod jego pełną nazwą std::coutlub mieć jeden z tych dwóch wierszy (najlepiej poniżej twoich #includedyrektyw, ale powyżej drugiego kodu):

using namespace std;
using std::cout;

Drugi sposób jest uważany za preferowany, szczególnie w przypadku poważnych projektów programistycznych, ponieważ wpływa tylko na std::coutwprowadzanie wszystkich nazw w stdprzestrzeni nazw (niektóre z nich mogą potencjalnie kolidować z nazwami używanymi w programie).

Dhruv kaushik
źródło
Świetna odpowiedź. Odpowiadając na pytanie @ gabriel, rozwiązałeś kilka nieporozumień, które miałem od lat.
izomorfizmy