2015-09-09 12 views
5

ho bollito giù il problema al seguente esempio:clang non sembra essere il collegamento a una libreria

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

genera i seguenti errori sul 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 linea:

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

Sembra che non sia collegato a una libreria. Qualcuno sa quali e quali cambierà la riga di comando? Non ho usato il clang prima. Funziona con g ++.

Questa è l'uscita con l'opzione -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

Come hai installato Clang e libC++? Sai quale libreria ABI sta usando Clang? Puoi provare ad aggiungere, ad es. '-lC++ abi'? –

+1

@JoachimPileborg, non l'ho installato. Ho ottenuto il link a un compilatore online da SO. Sembra che se rimuovo '-stdlib = libC++', funziona. Hmmmm. Perché dovrebbe essere? – Adrian

+0

Anche l'opzione specificata non ha funzionato. Errore: '/ usr/bin/ld: impossibile trovare -lC++ abi' – Adrian

risposta

6

Sembra che tu abbia bisogno di aggiungere -lsupc++ dopo main.cpp (see it live):

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

come note Andre Kostur il libc++ documentation consiglia quanto segue, anche se non riesco a farlo funzionare su 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

Questo sembra correlata alle questioni in discussione in questa discussione Making libc++ on Linux user-friendly, con le citazioni selettive di seguito:

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.

e:

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

vedere anche Linux equivalent of Windows DLL forwarders or MacOS reexport_library.

+1

Interessante che il popolo clang (a http: // libcxx .llvm.org /) consiglia di utilizzare una riga di comando diversa: 'clang ++ -stdlib = libC++ helloworld.cpp -nodefaultlibs -lC++ -lcxxrt -lm -lc -lgcc_s -lgcc' In alternativa, è possibile aggiungere libcxxrt alle proprie librerie lista, che nella maggior parte delle situazioni darà lo stesso risultato: 'clang ++ -stdlib = libC++ helloworld.cpp -lcxxrt' –

+0

@AndreKostur Ho aggiunto quella nota, alla mia risposta ma non funziona per Coliru però, non mi è chiaro perché . –

Problemi correlati