2015-09-09 12 views
5

tôi luộc xuống vấn đề như ví dụ sau:kêu vang dường như không được liên kết đến một thư viện

int main() 
{ 
    try { 
     throw false; 
    } catch (bool x) 
    { 
     if (x) 
     { 
      return 0; 
     } 
     else 
     { 
      return 1; 
     } 
    } 
} 

tạo ra các lỗi sau đây trên Coliru:

/tmp/main-c8b47a.o: In function `main': 
main.cpp:(.text+0xf): undefined reference to `typeinfo for bool' 
/tmp/main-c8b47a.o: In function `GCC_except_table0': 
main.cpp:(.gcc_except_table+0x30): undefined reference to `typeinfo for bool' 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

Cmd line:

clang++ -std=c++11 -stdlib=libc++ -O2 -Wall -pedantic -pthread main.cpp && ./a.out

Điều này có vẻ như không liên kết với thư viện. Có ai biết đó và những gì các thiết bị chuyển mạch dòng lệnh sẽ được? Tôi đã không sử dụng tiếng kêu trước đây. Điều này hoạt động theo g ++.

Đây là sản phẩm với công tắc -v:

clang version 3.6.0 (tags/RELEASE_360/final 235480) 
Target: x86_64-unknown-linux-gnu 
Thread model: posix 
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.6 
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.6.4 
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.7 
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.7.3 
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8 
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8.1 
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9 
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9.2 
Found candidate GCC installation: /usr/local/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.8.2 
Found candidate GCC installation: /usr/local/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.9.0 
Found candidate GCC installation: /usr/local/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.9.2 
Found candidate GCC installation: /usr/local/bin/../lib/gcc/x86_64-unknown-linux-gnu/5.1.0 
Found candidate GCC installation: /usr/local/bin/../lib/gcc/x86_64-unknown-linux-gnu/5.2.0 
Selected GCC installation: /usr/local/bin/../lib/gcc/x86_64-unknown-linux-gnu/5.2.0 
Candidate multilib: .;@m64 
Selected multilib: .;@m64 
"/usr/local/bin/clang" -cc1 -triple x86_64-unknown-linux-gnu -emit-obj -disable-free -disable-llvm-verifier -main-file-name main.cpp -mrelocation-model static -mthread-model posix -fmath-errno -masm-verbose -mconstructor-aliases -munwind-tables -fuse-init-array -target-cpu x86-64 -target-linker-version 2.22 -momit-leaf-frame-pointer -v -dwarf-column-info -resource-dir /usr/local/bin/../lib/clang/3.6.0 -internal-isystem /usr/include/c++/v1 -internal-isystem /usr/local/include -internal-isystem /usr/local/bin/../lib/clang/3.6.0/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wall -pedantic -std=c++11 -fdeprecated-macro -fdebug-compilation-dir /tmp/1441759762.34715 -ferror-limit 19 -fmessage-length 0 -pthread -mstackrealign -fobjc-runtime=gcc -fcxx-exceptions -fexceptions -fdiagnostics-show-option -vectorize-loops -vectorize-slp -o /tmp/main-47c098.o -x c++ main.cpp 
clang -cc1 version 3.6.0 based upon LLVM 3.6.0 default target x86_64-unknown-linux-gnu 
ignoring nonexistent directory "/include" 
#include "..." search starts here: 
#include <...> search starts here: 
/usr/include/c++/v1 
/usr/local/include 
/usr/local/bin/../lib/clang/3.6.0/include 
/usr/include/x86_64-linux-gnu 
/usr/include 
End of search list. 
"/usr/bin/ld" --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o a.out /usr/lib/x86_64-linux-gnu/crt1.o /usr/lib/x86_64-linux-gnu/crti.o /usr/local/bin/../lib/gcc/x86_64-unknown-linux-gnu/5.2.0/crtbegin.o -L/usr/local/bin/../lib/gcc/x86_64-unknown-linux-gnu/5.2.0 -L/usr/local/bin/../lib/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../lib64 -L/usr/local/bin/../lib64 -L/lib/x86_64-linux-gnu -L/lib/../lib64 -L/usr/lib/x86_64-linux-gnu -L/usr/local/bin/../lib/gcc/x86_64-unknown-linux-gnu/5.2.0/../../.. -L/usr/local/bin/../lib -L/lib -L/usr/lib /tmp/main-47c098.o -lc++ -lm -lgcc_s -lgcc -lpthread -lc -lgcc_s -lgcc /usr/local/bin/../lib/gcc/x86_64-unknown-linux-gnu/5.2.0/crtend.o /usr/lib/x86_64-linux-gnu/crtn.o 
/tmp/main-47c098.o: In function `main': 
main.cpp:(.text+0xf): undefined reference to `typeinfo for bool' 
/tmp/main-47c098.o: In function `GCC_except_table0': 
main.cpp:(.gcc_except_table+0x30): undefined reference to `typeinfo for bool' 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
+1

Bạn đã cài đặt Clang và libC++ bằng cách nào? Bạn có biết Clang đang sử dụng thư viện ABI nào không? Bạn có thể thử thêm ví dụ: '-lC++ abi'? –

+1

@JoachimPileborg, tôi không cài đặt. Tôi nhận được liên kết đến một trình biên dịch trực tuyến từ SO. Có vẻ như tôi xóa '-stdlib = libC++', nó hoạt động. Hmmmm. Tại sao lại thế? – Adrian

+0

Việc thêm công tắc bạn chỉ định không hoạt động. Lỗi: '/ usr/bin/ld: không thể tìm thấy -lC++ abi' – Adrian

Trả lời

6

Có vẻ như bạn cần phải thêm -lsupc++ sau main.cpp (see it live):

clang++ -std=c++11 -stdlib=libc++ -O2 -Wall -pedantic -pthread main.cpp -lsupc++ 
                     ^^^^^^^^ 

Như ghi chú Andre Kostur các libc++ documentation đề nghị những điều sau đây, mặc dù tôi không thể có được điều này để làm việc trên Coliru:

Unfortunately you can't simply run clang with "-stdlib=libc++" at this point, as clang is set up to link for libc++ linked to libsupc++. To get around this you'll have to set up your linker yourself (or patch clang). For example,

  • clang++ -stdlib=libc++ helloworld.cpp -nodefaultlibs -lc++ -lcxxrt -lm -lc -lgcc_s -lgcc

Alternately, you could just add libcxxrt to your libraries list, which in most situations will give the same result:

  • clang++ -stdlib=libc++ helloworld.cpp -lcxxrt

này trông có liên quan đến các vấn đề đang được thảo luận trong chủ đề này Making libc++ on Linux user-friendly, với dấu ngoặc kép chọn lọc dưới đây:

Here's the problem: when building libc++, the linker finds the various ABI functions in libstdc++, and is quite happy with them being there. When Clang calls the linker for the actual program, though, it doesn't pass along a link flag for libstdc++, only for libc++. Thus, the links fails.

và:

This again can be worked around by explicitly specifying linking against the source library, and here -lsupc++ works.

Xem thêm Linux equivalent of Windows DLL forwarders or MacOS reexport_library.

+1

Thú vị là những người kêu vang (tại http: // libcxx .llvm.org /) biện hộ bằng cách sử dụng một dòng lệnh khác: 'clang ++ -stdlib = libC++ helloworld.cpp -nodefaultlibs -lC++ -lcxxrt -lm -lc -lgcc_s -lgcc' Cách khác, bạn chỉ có thể thêm libcxxrt vào thư viện của mình danh sách, trong hầu hết các trường hợp sẽ cho kết quả tương tự: 'clang ++ -stdlib = libC++ helloworld.cpp -lcxxrt' –

+0

@AndreKostur Tôi đã thêm lưu ý đó vào câu trả lời của tôi nhưng nó không hoạt động cho Coliru, không rõ ràng tại sao . –

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