Linking with clang in gcc mode on Windows

I built the latest clang on Windows in gcc mode using Cmake and Ninja. When I compile a source file all the gcc header files are found and the compilation succeeds but when I link none of the gcc libraries appear to be found. Here is the compilation output for a single source file:

clang-linux.compile.c++.without-pth ..\..\..\bin.v2\libs\mpl\test\bool.test\clang-linux-3.5.0\debug\bool.obj

  "C:/Programming/VersionControl/bninja_installed_clang/bin/clang.exe" -c -x c++ -O0 -g -fno-inline -Wall -g -DBOOST_ALL_NO_LIB=1 -I"..\..\.." -o "..\..\..\bin.v2\libs\mpl\test\bool.test\clang-linux-3.5.0\debug\bool.obj" "bool.cpp"

Here is the error output for the link step:

clang-linux.link ..\..\..\bin.v2\libs\mpl\test\bool.test\clang-linux-3.5.0\debug\bool.exe

    "C:/Programming/VersionControl/bninja_installed_clang/bin/clang.exe" -o "..\..\..\bin.v2\libs\mpl\test\bool.test\clang-linux-3.5.0\debug\bool.exe" -Wl,--start-group "..\..\..\bin.v2\libs\mpl\test\bool.test\clang-linux-3.5.0\debug\bool.obj" -Wl,-Bstatic -Wl,-Bdynamic -Wl,--end-group -g

..\..\..\bin.v2\libs\mpl\test\bool.test\clang-linux-3.5.0\debug\bool.obj: In function `_cxx_global_var_init':
c:/MinGW/lib/gcc/mingw32/4.8.1/include/c++/iostream:74: undefined reference to `std::ios_base::Init::Init()'
..\..\..\bin.v2\libs\mpl\test\bool.test\clang-linux-3.5.0\debug\bool.obj: In function `_dtor__ZStL8__ioinit':
C:\Programming\VersionControl\modular-boost\libs\mpl\test/bool.cpp:74: undefined reference to `std::ios_base::Init::~Init()'
..\..\..\bin.v2\libs\mpl\test\bool.test\clang-linux-3.5.0\debug\bool.obj: In function `ZN5boost13report_errorsEv':
C:\Programming\VersionControl\modular-boost\libs\mpl\test/..\..\..\boost/core/lightweight_test.hpp:130: undefined reference to `std::cerr'
C:\Programming\VersionControl\modular-boost\libs\mpl\test/..\..\..\boost/core/lightweight_test.hpp:132: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
C:\Programming\VersionControl\modular-boost\libs\mpl\test/..\..\..\boost/core/lightweight_test.hpp:132: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)'
C:\Programming\VersionControl\modular-boost\libs\mpl\test/..\..\..\boost/core/lightweight_test.hpp:132: undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))'
C:\Programming\VersionControl\modular-boost\libs\mpl\test/..\..\..\boost/core/lightweight_test.hpp:138: undefined reference to `std::cerr'
C:\Programming\VersionControl\modular-boost\libs\mpl\test/..\..\..\boost/core/lightweight_test.hpp:138: undefined reference to `std::ostream::operator<<(int)'
C:\Programming\VersionControl\modular-boost\libs\mpl\test/..\..\..\boost/core/lightweight_test.hpp:138: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
C:\Programming\VersionControl\modular-boost\libs\mpl\test/..\..\..\boost/core/lightweight_test.hpp:138: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)'
C:\Programming\VersionControl\modular-boost\libs\mpl\test/..\..\..\boost/core/lightweight_test.hpp:138: undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))'
..\..\..\bin.v2\libs\mpl\test\bool.test\clang-linux-3.5.0\debug\bool.obj: In function `ZN5boost6detail16test_failed_implEPKcS2_iS2_':
C:\Programming\VersionControl\modular-boost\libs\mpl\test/..\..\..\boost/core/lightweight_test.hpp:65: undefined reference to `std::cerr'
C:\Programming\VersionControl\modular-boost\libs\mpl\test/..\..\..\boost/core/lightweight_test.hpp:66: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
C:\Programming\VersionControl\modular-boost\libs\mpl\test/..\..\..\boost/core/lightweight_test.hpp:66: undefined reference to `std::ostream::operator<<(int)'
C:\Programming\VersionControl\modular-boost\libs\mpl\test/..\..\..\boost/core/lightweight_test.hpp:66: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
C:\Programming\VersionControl\modular-boost\libs\mpl\test/..\..\..\boost/core/lightweight_test.hpp:66: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)'
C:\Programming\VersionControl\modular-boost\libs\mpl\test/..\..\..\boost/core/lightweight_test.hpp:66: undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))'
..\..\..\bin.v2\libs\mpl\test\bool.test\clang-linux-3.5.0\debug\bool.obj: In function `ZN5boost6detail20report_errors_remindEv':
C:\Programming\VersionControl\modular-boost\libs\mpl\test/..\..\..\boost/core/lightweight_test.hpp:53: undefined reference to `__cxa_guard_acquire'
C:\Programming\VersionControl\modular-boost\libs\mpl\test/..\..\..\boost/core/lightweight_test.hpp:53: undefined reference to `__cxa_guard_release'
C:\Programming\VersionControl\modular-boost\libs\mpl\test/..\..\..\boost/core/lightweight_test.hpp:55: undefined reference to `__cxa_guard_abort'
..\..\..\bin.v2\libs\mpl\test\bool.test\clang-linux-3.5.0\debug\bool.obj:(.eh_frame+0x12b): undefined reference to `__gxx_personality_v0'
collect2.exe: error: ld returned 1 exit status
clang.exe: error: linker (via gcc) command failed with exit code 1 (use -v to see invocation)

Anybody have any idea why the link is failing ? It looks like clang is not searching any library paths but maybe it is something else.

Hi

You need -lstdc++ in linking stage, both with gcc and clang.

Yaron

Hi

You need -lstdc++ in linking stage, both with gcc and clang.

Thanks for the information. I realized that if I used clang++ rather than clang the stdc++ library is automatically found. Everything now works properly.