2014-11-23 19 views
6

Ho fatto qualche ricerca, tutte le risposte sembrano suggerire l'uso di clang ++ invece di clang (o piuttosto g ++ al posto di gcc), che è quello che ho fatto in il primo posto. Eppure, il problema persiste, sia conErrore di linker misterioso "riferimento non definito a` __gxx_personality_v0 '"utilizzando clang in cygwin

clang++ -Wall -std=c++11 -o test.exe test.cpp A.cpp B.cpp etc.cpp 

o

clang++ -lstdc++ -Wall -std=c++11 -o test.exe test.cpp A.cpp B.cpp etc.cpp 

La compilazione e linking funziona bene con g ++ in Cygwin.

g++ -Wall -std=c++11 -o test.exe test.cpp A.cpp B.cpp etc.cpp 

Aggiornamento:

Ecco le informazioni durante il collegamento. Clang sta provando ad usare gcc per il collegamento, piuttosto che per g ++? In tal caso, perché non flag -lstdC++ e -lsupC++ come suggerito di seguito, funzionano?

COMPILER_PATH=/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/:/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/:/usr/lib/gcc/x86_64-pc-cygwin/:/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/:/usr/lib/gcc/x86_64-pc-cygwin/:/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/../../../../x86_64-pc-cygwin/bin/ 
LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/:/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/../../../../x86_64-pc-cygwin/lib/../lib/:/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/../../../../x86_64-pc-cygwin/lib/:/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/../../../:/lib/:/usr/lib/ 
COLLECT_GCC_OPTIONS='-v' '-std=c++11' '-m64' '-o' 'testReSampling.exe' '-shared-libgcc' '-mtune=generic' '-march=x86-64' 
/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/collect2.exe --build-id -m i386pep --wrap _Znwm --wrap _Znam --wrap _ZdlPv --wrap _ZdaPv --wrap _ZnwmRKSt9nothrow_t --wrap _ZnamRKSt9nothrow_t --wrap _ZdlPvRKSt9nothrow_t --wrap _ZdaPvRKSt9nothrow_t -Bdynamic --dll-search-prefix=cyg --tsaware -o testReSampling.exe /usr/lib/gcc/x86_64-pc-cygwin/4.8.3/../../../../lib/crt0.o /usr/lib/gcc/x86_64-pc-cygwin/4.8.3/crtbegin.o -L/usr/lib/gcc/x86_64-pc-cygwin/4.8.3 -L/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/../../../../x86_64-pc-cygwin/lib/../lib -L/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/../../../../x86_64-pc-cygwin/lib -L/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/../../.. -lsupc++ /tmp/misc-8020e8.o /tmp/DataStruct-b10944.o /tmp/HyperGeometricPVal-edef1c.o /tmp/Array2EG-3441bb.o /tmp/GOCats-ff22c1.o /tmp/UGraph-10cfd8.o /tmp/testReSampling-9fb18c.o -lstdc++ -lgcc_s -lgcc -lcygwin -ladvapi32 -lshell32 -luser32 -lkernel32 -lgcc_s -lgcc /usr/lib/gcc/x86_64-pc-cygwin/4.8.3/../../../../lib/default-manifest.o /usr/lib/gcc/x86_64-pc-cygwin/4.8.3/crtend.o 
/tmp/misc-8020e8.o:fake:(.eh_frame+0x47): undefined reference to `__gxx_personality_v0' 
/tmp/misc-8020e8.o:fake:(.eh_frame$_ZNSt6vectorISsSaISsEE5clearEv+0x13): undefined reference to `__gxx_personality_v0' 
/tmp/misc-8020e8.o:fake:(.eh_frame$_ZNSt6vectorISt4pairIjS0_ItdEESaIS2_EE5beginEv+0x13): undefined reference to `__gxx_personality_v0' 
/tmp/misc-8020e8.o:fake:(.eh_frame$_ZNSt6vectorISt4pairIjS0_ItdEESaIS2_EE3endEv+0x13): undefined reference to `__gxx_personality_v0' 
/tmp/misc-8020e8.o:fake:(.eh_frame$_ZNSt6vectorISt4pairIjS0_ItSt5arrayIdLm2EEEESaIS4_EE5beginEv+0x13): undefined reference to `__gxx_personality_v0' 
/tmp/misc-8020e8.o:fake:(.eh_frame$_ZNSt6vectorISt4pairIjS0_ItSt5arrayIdLm2EEEESaIS4_EE3endEv+0x13): more undefined references to `__gxx_personality_v0' follow 
collect2: error: ld returned 1 exit status 
clang: error: linker (via gcc) command failed with exit code 1 (use -v to see invocation) 

risposta

3

trovato questa soluzione:

https://cygwin.com/ml/cygwin/2015-06/msg00294.html

In pratica basta aggiungere -fno-exceptions sulla riga di comando quando si compila per esempio clang++ helloworld.cpp -std=c++11 -fno-exceptions

+0

Ranera nello stesso problema, e sfortunatamente, sto usando 'throw' nel mio codice, quindi' -fno-exceptions' non funziona :( – Deqing

+0

Sì, è quello che stavo usando, ma se è necessaria un'eccezione, allora ... – CloudyTrees

1

OK, come mi è stato ulteriormente girovagando per il web, ho trovato un rilevante post, vedere la risposta di nn.

Quindi mi sono reso conto che stavo compilando con il terminale Cygwin64, mentre la porta clang di Cygwin è una versione 32. Dopo il passaggio al terminale Cygwin32, tutto funziona correttamente.

+0

è a 64 bit clangore supportato su Cygwin ora? – CMCDragonkai

+0

@CMCDragonkai, ho usato clang64 in Cygwin esclusivamente per catturare gli errori (faccio un uso massiccio dei template in modo che i messaggi di errore colorati siano molto utili), ma sfortunatamente non sono mai stati usati per generare binari. Il motivo è che la cosa gxx_personality_v0 è correlata a come clang gestisce le eccezioni e il modo clang non sembra essere compatibile con il modo in cui Windows li gestisce. – CloudyTrees

+0

Ho appena provato clang/llvm su cygwin a 64 bit, e ho continuato a colpire cose come errori gxx_personality' e 'linker' perché utilizza gcc per fare collegamenti per qualche motivo. – CMCDragonkai