2014-11-23 21 views
6

Tôi đã thực hiện một số tìm kiếm, tất cả các câu trả lời dường như gợi ý rằng sử dụng clang ++ thay vì clang (hoặc thay vì g ++ thay cho gcc), đó là những gì tôi đã làm nơi đầu tiên. Tuy nhiên, vấn đề vẫn còn, với một trong haiLỗi liên kết bí ẩn "sử dụng clang trong cygwin

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

hoặc

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

Việc lập và liên kết hoạt động tốt với g ++ trong Cygwin.

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

Cập nhật:

Dưới đây là thông tin trong quá trình liên kết. Có phải bạn đang cố gắng sử dụng gcc để liên kết chứ không phải g ++? Trong trường hợp đó, tại sao không cờ -lstdC++ và -lsupC++ như được đề xuất bên dưới, hoạt động?

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) 

Trả lời

3

Tìm thấy giải pháp này:

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

Về cơ bản chỉ cần thêm -fno-exceptions trên dòng lệnh khi bạn biên dịch ví dụ clang++ helloworld.cpp -std=c++11 -fno-exceptions

+0

Ran vào cùng một vấn đề, và không may, tôi đang sử dụng 'throw' trong mã của tôi, vì vậy' -fno-exceptions' không hoạt động: ( – Deqing

+0

Vâng, đó là những gì tôi đã sử dụng. Nhưng nếu ngoại lệ phải được tham gia, thì ... – CloudyTrees

1

OK, khi tôi đi lang thang quanh trang web, tôi đã tìm thấy số post có liên quan, xem câu trả lời của nos.

Vì vậy, tôi nhận ra mình đang biên dịch với thiết bị đầu cuối Cygwin64, trong khi cổng clang của Cygwin là phiên bản 32. Sau khi chuyển sang thiết bị đầu cuối Cygwin32, mọi thứ hoạt động tốt.

+0

là 64bit kêu vang được hỗ trợ trên Cygwin bây giờ? – CMCDragonkai

+0

@CMCDragonkai, tôi đã sử dụng clang64 trong Cygwin dành riêng cho việc bắt lỗi (tôi sử dụng nhiều mẫu để các thông báo lỗi màu hữu ích), nhưng không may, không bao giờ được sử dụng để tạo các tệp nhị phân. Lý do là điều gxx_personality_v0 có liên quan đến cách clang xử lý các ngoại lệ, và cách của clang dường như không tương thích với cách Windows xử lý chúng. – CloudyTrees

+0

Tôi vừa thử công cụ clang/llvm trên 64bit cygwin, và tiếp tục đánh những thứ như 'gxx_personality' và' linker' lỗi vì nó sử dụng gcc để liên kết vì một lý do nào đó. – CMCDragonkai

Các vấn đề liên quan