2009-11-08 14 views
26

wyciąłem & wklejony poniżej kod z a previous question do pliku o nazwie „avishay.cpp”, a następnie pobiegłJak skompilować C++ pod Ubuntu Linux?

gcc avishay.cpp 

tylko dostać się następujące komunikaty o błędach z łącznikiem. Co poszło nie tak, co powinienem zrobić?

[email protected]:~/Projects/StackOverflow$ gcc -static avishay.cpp 
/tmp/cccRNW34.o: In function `__static_initialization_and_destruction_0(int, int)': 
avishay.cpp:(.text+0x41): undefined reference to `std::ios_base::Init::Init()' 
avishay.cpp:(.text+0x46): undefined reference to `std::ios_base::Init::~Init()' 
/tmp/cccRNW34.o: In function `A::func()': 
avishay.cpp:(.text._ZN1A4funcEv[A::func()]+0x11): undefined reference to `std::cout' 
avishay.cpp:(.text._ZN1A4funcEv[A::func()]+0x16): 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*)' 
avishay.cpp:(.text._ZN1A4funcEv[A::func()]+0x1e): 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> >&)' 
avishay.cpp:(.text._ZN1A4funcEv[A::func()]+0x26): undefined reference to `std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))' 
avishay.cpp:(.text._ZN1A4funcEv[A::func()]+0x36): undefined reference to `std::cout' 
avishay.cpp:(.text._ZN1A4funcEv[A::func()]+0x3b): undefined reference to `std::basic_ostream<char, std::char_traits<char> >::operator<<(int)' 
/tmp/cccRNW34.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0' 
collect2: ld returned 1 exit status 

C++ kod (nie mój kod, właśnie próbuje go uruchomić):

#include <iostream> 
using namespace std; 

class A 
{ 
private: 
    int _dmember; 

public: 
    void func() 
    { 
    cout<<"Inside A!! "<<endl; 
    cout<<_dmember; // crash when reach here. 
    } 
}; 

int main() 

{ 

    A* a= NULL; 

    a->func(); // prints "Inside A!!!" 

    return 1; 
} 
+0

Duplikat http://stackoverflow.com/q/203548/981959 –

Odpowiedz

67

Należy użyć g++, nie gcc, do kompilacji programów C++.

Dla tego konkretnego programu, po prostu wpisane

make avishay 

i niech make zorientować się w stanie spoczynku. Daje również przyzwoitą nazwę pliku wykonywalnego zamiast a.out.

+3

Jak głupi ode mnie! Dziękuję Ci bardzo. –

+5

Kolejne +1 (jeśli mogłem) za wskazówkę "make". Nigdy nie wiedziałem, że marka mogłaby/mogłaby to zrobić! –

+1

+1 dla marki! <3 –

11

Prawdopodobnie powinieneś używać g ++ zamiast gcc.

+7

Dzięki. Wczoraj nie wiedziałem, jak przeliterować "programista C++", a dziś jestem jednym! –

4

g ++ jest kompilatorem C++ pod Linuksem. Kod wygląda dobrze. Jest możliwe, że brakuje odniesienia biblioteki, która jest wykorzystywana jako takie:

g ++ -l {nazwa biblioteki tutaj (FNS matematyczne użyć "m")} codefile.cpp

2

Zastosowanie g ++. I upewnij się, że masz zainstalowane odpowiednie biblioteki.

+0

Zapłaciłem dobre pieniądze dla Ubuntu ... och, czekaj, Okazało się, że problem polegał właśnie na tym, jak nazwałem kompilator. –

9

Tak, użyj g ++ do kompilacji. Automatycznie doda wszystkie odwołania do libstdC++, które są niezbędne do połączenia programu.

g++ source.cpp -o source 

Jeśli pominąć parametr -o, wynikowy plik wykonywalny zostanie nazwany a.out. W każdym przypadku uprawnienia do wykonywania zostały już ustawione, więc nie trzeba niczego tworzyć.

Ponadto kod da niezdefiniowane zachowanie (i prawdopodobnie SIGSEGV) podczas usuwania odnośnika NULL i próby wywołania funkcji elementu na obiekcie, który nie istnieje, więc z pewnością nie będzie niczego drukować . Prawdopodobnie ulegnie awarii lub wykona jakiś funky dance.

+0

Tak, kod był częścią innego pytania (link) i został tam zarzucony. 't mind program nazywa się a.out, a ja wiedziałem o -o. Mój główny problem był związany z nazwą kompilatora, dziękuję ! –

4

Zastosowanie

g ++

przestrzeń następuje nazwa programu. np:

g++ prog.cpp

jeśli nazwa pliku była "prog.cpp" w tej sprawie. jeśli chcesz uruchomić napisać program:

./prog 

więc użyłem

"Prog"

bo to była moja nazwa pliku.

+1

Plik wyjściowy będzie "a.out", chyba że użyjesz flagi '-o". – Kookerus

4

nawet możesz skompilować swój kod C++ przez gcc Brzmi śmiesznie? Tak to jest. spróbować

$ gcc avishay.cpp -lstdc++ 

cieszyć

5

zaktualizować swój apt-get:

$ sudo apt-get update 
$ sudo apt-get install g++ 

Uruchom program.cpp:

$ g++ program.cpp 
$ ./a.out 
+0

Spośród innych odpowiedzi, ta jest bardziej przejrzysta i do rzeczy. Wielkie dzięki . – harrypotter0

1

można użyć g ++ --std = C++ 0x example.cpp -o przykład

1

Aby skompilować source.cpp uruchom

g++ source.cpp 

To polecenie kompilacji source.cpp złożyć a.out w tym samym katalogu . Aby uruchomić skompilowany plik, uruchom

./a.out 

Jeśli skompilować inny plik źródłowy, z g++ source2.cpp, nowy skompilowany plik a.out zastąpi a.out generowane z source.cpp

Jeśli chcesz skompilować source.cpp do konkretnego plik, powiedzmy compiledfile, run

g++ source.cpp -o compiledfile 

lub

g++ -o compiledfile source.cpp 

To stworzy compiledfile która jest skompilowany plik binarny. uruchomić compiledfile uruchom

./compiledfile 

Jeśli g++ nie jest w twoich $PATH wymienić g ++ z /usr/bin/g++.

Powiązane problemy