2008-10-15 6 views
43

byłem coraz to niezdefiniowany symbol budynek z tego wiersza polecenia:Niezdefiniowany Symbol ___gxx_personality_v0 na link

$ gcc test.cpp 
Undefined symbols: 
    "___gxx_personality_v0", referenced from: 
    etc... 

test.cpp jest prosta i powinna opierać się dobrze. O co chodzi?

+0

czy możemy zobaczyć kod, jeśli nie jest zbyt długi? – jjnguy

Odpowiedz

73

Zastosowanie

g++ test.cpp 

zamiast tego, ponieważ jest to C++ kod.


Lub, jeśli naprawdę chcesz użyć gcc, dodać -lstdc++ do linii poleceń, tak jak poniżej:

gcc test.cpp -lstdc++ 

Running md5 przeciwko a.out wyprodukowanego w ramach każdego scenariusza wynika, że ​​jest to ten sam wydajność.

Ale, tak, g++ prawdopodobnie sprawia, że ​​twój świat jest prostszym miejscem.

+2

I chociaż gcc był front endem, który rozpoznał pliki cpp i przekazał je do właściwego kompilatora. – paxdiablo

+13

@Pax Diablo: Tak, używa poprawnego _kompilatora_, jednak g ++ przekazuje libstdC++ do linkera, podczas gdy gcc nie. :-P –

+0

Tak, to problem łącznika, a nie kompilacja. Zwykle nie buduję pojedynczych plików z linii poleceń, więc nawet nie pomyślałem i po prostu wpisałem gcc myśląc, że to zadziała. –

3

Rozszerzenie .cpp powoduje, że gcc kompiluje twój plik jako plik C++. (Patrz GCC docs.)

Spróbuj kompilacji tego samego pliku, ale zmień go mieć .c rozszerzenia:

mv test.cpp 
gcc test.c 

Alternatywnie, można jednoznacznie określić język przekazując -x c do kompilatora:

gcc -x c -c test.cpp -o test.o 

Jeśli prowadzisz nm test.o na tych wersjach C-językowych, można zauważyć, że ___gxx_personality_v0 nie jest wymieniony jako symbol.
(A jeśli uruchomić tego samego polecenia na pliku obiektowego generowanego z gcc -c test.cpp -o test.o The ___gxx_personality_v0 symbol jest obecny).

3

wszelki wypadek ktoś ma ten sam problem co ja: Rozszerzenie pliku powinno być nie .c.C (gcc rozróżnia małe i wielkie litery).

+0

Dzieje się tak dlatego, że pliki .C są rozpoznawane przez cpp. Tak samo jest w CMake. – daminetreg

1

miał ten sam problem, ale inne rozwiązanie:

C++ kod w bibliotece statyczne coraz powiązane, i jest określany przez pliku .m. Zmiana nazwy pliku .m na .mm rozwiązała problem.