[C++]MinGW nie wykrywa strumieni


(Abecede1999) #1

Powiedzcie mi co robię źle skoro zwykły przykład z ctrl+c + ctrl+v

#include 


using namespace std;


int main()

{

    cout << "Hello World"; 

    return 0;

}

wywala

C:\XXX>gcc hello.cpp -o hellow.exe

C:\Users\..\appdata\Local\temp\ccFoDKga.o:hell.cpp:(.text+0x19): undefined reference to 'std::cout'

C:\Users\..\appdata\Local\temp\ccFoDKga.o:hell.cpp:(.text+0x1e):undefined reference to 'std::basic_ostream >& std::operator<< <(std::basic_ostream <&, char const*'

C:\Users\..\appdata\Local\temp\ccFoDKga.o:hell.cpp:(.text+ox35): undefined reference to 'std::ios_base::Init::~Init()'

C:\Users\..\appdata\Local\temp\ccFoDKga.o:hell.cpp:(.text+ox56): undefined reference to 'std::ios_base::Init::Init()'

Nieważne czy coś dodam czy nie, zawsze jakiś błąd wyskoczy (bez std:: wszystko działa normalnie )

Oczywiście

-windows 7

-MinGW 4.7.0 (kompilowane spod konsoli (nie czepiać sie))


(Razi) #2

To raczej oczywiste że nie znajduje, skoro używasz kompilatora C :slight_smile:

GCC ma 2 rozwinięcia: GNU C Compiler i GNU Compiler Collection. Obecnie używa się tego drugiego, ale sam gcc jako program oznacza to pierwsze.

Jak chcesz go użyć do kompilacji C++, to albo użyj odpowiedniej flagi (np. --std=c++03) , że chodzi ci o konkretnie C++, albo "skrótu": g++.

No i później zacznij używać flagi -O2, dzięki niej programy są szybsze.

Moim zdaniem to dobrze że się uczysz obsługiwać kompilatora z poziomu konsoli zamiast zakrywać wszystko IDE.


(Abecede1999) #3

Trochę to dziwne skoro wszędzie pisze że właśnie tak sie kompiluje w c++, a kompilator nie przyjumuje plików .h

I na dodatek wszystko poza 'std' działa poprawnie ...

EDIT:G++ na początku działa, ale flagi --std=c++03 i -O2 nie

Miałby ktoś link do jakiegoś poradnika z tego kompilatora ?


(Razi) #4

Plików .h się nie kompiluje, to tylko nagłówki które są jakby "plikami pośredniczącymi" pomiędzy plikami .cpp kompilowanymi osobno.

Mógłbyś podać komunikaty błędów? O ile tej pierwszej flagi może nie przyjąć, jak nie masz pakietu c++ zainstalowanego, to tej drugiej nie ma prawa nie przyjąć.

A jak tego MinGWa instalowałeś? Masz pakiet pod C++? Jak używasz g++, to nie musisz definiować standardu (tzn. tego --std=c++03)

Tu masz całe how-to dla MinGWa: http://www.mingw.org/wiki/HOWTO

Ja zwykle piszę g++ plik.cpp -O2 i w wyniku mam plik a.out (na windowsie: a.exe)


(Abecede1999) #5

Notepad++ uznaje c++ jako .h ... podobnie w jakiejś PRLowskiej książce do C jest że sie kompiluje pliki .h

Pobrałem najzwyczajniejszą instalke i zainstalowałem na raz C i C++ więc stąd te błędy zapewne (jak wpisuje G++ xxx.cpp -o a.exe to kompiluje normalnie)

C:\XXX>g++ hell.cpp -O2 hell7.exe

g++: error: hell7.exe: No such file or directory \\*czyli jakby pomija -O2 i szuka hell7.exe *\\

--std=c++03 jakoś przyjmuje jeśli wpiszę G++ , przy gcc nadal nie rozwiązuje problemu. (co tak właściwie daje ?)

EDIT: W tym HOWTO nie ma nic poza moją wiedze (na .dll jeszcze nie czas)


(Razi) #6

błąd sugeruje że nie umie znaleźć pliku hell7.exe, którego próbujesz skompilować. Jak chcesz określić nazwę pliku wyjściowego, to używasz -o plik_wyjsciowy.exe .

g++ to niemal to samo co wywołanie gcc z -std=c++03, tzn. zależy która "wersja" c++ jest na standardzie. Możesz też użyć np. C++0x (-std=c++0x, albo -std=gnu++0x), albo starszych: c++98

Tu masz wszystko, co gcc przyjmuje: http://linux.die.net/man/1/gcc (nie wiem czemu nie ma tam na liście c++03)


(Abecede1999) #7

okazało sie że w złej kolejności wszystko sklejałem (i nieważne co zdefiniuje i tak gcc nie zaskoczy jako cpp)

g++ -std=c++03 -O2 hell.cpp -o abe.exe

Gdzie właściwie mam tu umieszczać pliki wejściowe ?

PS. czym sie różni -O1 -O2 -O3 itd ? i którego używać ?


(Sawyer47) #8

Krótko mówiąc, flagi te włączają różne optymalizacje. Wszystko jest w dokumentacji (przeklejone z manuala g++-4.7)


(Razi) #9

Kolejność jest dowolna, po prostu niektóre argumenty muszą być poprzedzone innymi, tak jak np. nazwa pliku wyjściowego musi być poprzedzona -o, żeby wiedział, że kolejny argument to nazwa pliku wyjściowego, a nie pliku który chcesz kompilować. Pozostałe możesz rozmieścić jak chcesz.

Przy robieniu prostych projektów wieloplikowych (jak np. na laborkach z programowania, programy po 4-6 .cpp) najlepiej użyć konstrukcji:

g++ *.cpp -O2

Szybko i bezboleśnie (jeśli wszystkie .cpp są w tym samym folderze), bez użycia IDE generujących dziesiątki zbędnych plików. Takie programy jeszcze mogą być tak jeszcze kompilowane, bo to trwa góra sekundę. Przy większych projektach, gdzie kompilacja trwa ładne kilka(dziesiąt) sekund bez makefile, albo IDE już jest nieco ciężej, ale zanim do tego dojdziesz jeszcze sporo czasu minie.


(Abecede1999) #10

a co takiego jest z -O3, że tak rzadko się go używa ?


(Razi) #11

-O3 nie jest pewne. Jak się kiedyś bawiłem, była nieznaczna poprawa względem poziomu drugiego, ale czasami duże straty. Ryzykowna opcja. Ale i tak mnie najbardziej zdziwiła kompilacja llame z opcją -march=native, która zamiast skrócić, wydłużyła rozpakowanie mp3 niemal dwukrotnie! W innych testach przyspieszała gdzieś o 5-25%.


(Rmkrmkrmk1995) #12

problem niestety wrócił

#include 

#include 


using namespace std;


int main()

{

    int a, b;

    b = 2;

    cin >> a;

    cout << pow(b,a); 

    return 0;

}

Wcześniej działało wszystko normalnie a teraz

C:\CPP>g++ -O2 hell.cpp -o aaapotenga.exe

hell.cpp: In function 'int main()'

hell.cpp:10:2: error: 'cin' was not declared in this scope

hell.cpp:11:5: error: 'cout' was not declared in this scope

a gdy dam

#include 

#include 


using namespace std;


int main()

{

    int a, b;

    b = 2;

	std::cin >> a;

    std::cout << pow(b,a); 

    return 0;

}

wywala

C:\CPP>g++ -O2 hell.cpp -o aaapotenga.exe

hell.cpp: In function 'int main()'

hell.cpp:10:2: error: 'cin' is not a member of 'std'

hell.cpp:11:5: error: 'cout' is not a member of 'std'

(Rolek0) #13

cin i cout są w iostream -.-


(Rmkrmkrmk1995) #14

mój błąd ;/