Clang doesn't seem to be linking to the library

I welded the problem in the following example:

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

generates the following errors on 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 = lib ++ -O2 -Wall -pedantic -pthread main.cpp && & & &. / a.out

This does not seem to be a library connection. Does anyone know what and what command line switches will be? I have not used clang before. This works under g ++.

This is the output with the -v switch:

 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) 
+5
source share
1 answer

It looks like you need to add -lsupc++ after main.cpp ( watch it live ):

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

As Andre Kostur notes, the libC ++ documentation recommends the following: although I can't get this to work on Coliru:

Unfortunately, you cannot just run clang with "-stdlib = lib ++" at that point, because clang is configured to link to libC ++ related to libsupC ++. to get around this, you will have to configure your linker (or patch clang) yourself. For instance,

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

Alternatively, you can simply add libcxxrt to your list of libraries, which in most situations will give the same result:

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

This look is related to the issues discussed in this thread Creating libC ++ for Linux wirelessly , with selective quotes below:

Here's the problem: when creating libC ++, the linker finds various ABIs that operate in libstdC ++ and is quite happy that they are there. When Klang calls the linker for a real program, however, it does not miss the link flag for libstdC ++, only for libC ++. Therefore, the link crashes.

and

You can get around this again by explicitly linking to the source library, and -supC ++ works here.

Also see the Linux equivalent for reloading Windows DLLs or MacOS reexport_library .

+6
source

All Articles