Opossum
Opossum

Reputation: 482

Clang and C++11 headers

I'm trying to get Clang to work on Windows, to eventually develop with Qt Creator to see if it's a viable alternative to Visual Studio.

I got LLVM and Clang 3.2 (SVN Revision 163238) to compile using MinGW w64 (mingw-w64-bin_i686-mingw_20111220.zip) and also pointed to gcc's C++ header directories by adding AddMinGWCPlusPlusIncludePaths("D:/Code/mingw/lib/gcc", "x86_64-w64-mingw32", "4.7.0"); to clang/lib/Frontend/InitHeaderSearch.cpp, although I think that might not be the most up-to-date method. Anyway, Clang seems to find most of those headers.

However, when compiling a simple Hello World:

#include <iostream>
int main(int argc, char* argv[])
{
  std::cout << "test\n";
  return 0;
}

using clang++ main.cpp I get this error:

In file included from main.cpp:1:
In file included from D:/Code/mingw/lib/gcc/x86_64-w64-ming32/4.7.0./include/c++\iostream:39:
In file included from D:/Code/mingw/lib/gcc/x86_64-w64-ming32/4.7.0./include/c++\ostream:39:
In file included from D:/Code/mingw/lib/gcc/x86_64-w64-ming32/4.7.0./include/c++\ios:39:
In file included from D:/Code/mingw/lib/gcc/x86_64-w64-ming32/4.7.0./include/c++\iosfwd:41:
In file included from D:/Code/mingw/lib/gcc/x86_64-w64-ming32/4.7.0./include/c++\postypes.h:41:
D:/Code/mingw/lib/gcc/x86_64-w64-ming32/4.7.0./include/c++\cwchar:45:10: fatal error:
      'wchar.h' file not found

So, Clang apparently finds several C++ headers including iostream but fails to find wchar.h. Turns out that wchar.h is located in .../include/c++\tr1 where Clang doesn't look for it. Moving those TR1 headers up one directory doesn't help either.

What did I do wrong here? Is the gcc C++ library not compatible with Clang, since apparently it still hasn't integrated some TR1 libraries into the standard? Where could I get a compatible C++11 library for Clang (for Windows!)?

Upvotes: 12

Views: 6881

Answers (4)

Kjell Schubert
Kjell Schubert

Reputation: 147

I ran into the same problem using Clang --version 3.4 (198054) and mingw-get.exe --version 0.6.2-beta-20131004-1: it turned out I had installed MinGW incorrectly: I had initially only checked the box for 'mingw-gcc-g++' in the mingw-get.exe package selection dialog, adding 'mingw32-base' later on solved this wchar_t.h problem: clang++.exe -std=c++11 compiled C++11 iostream code just fine.

Upvotes: 0

rubenvb
rubenvb

Reputation: 76519

You've misconfigured/mispatched Clang. You need to also add MinGW-w64 paths, somewhere around where you added your version.

Use the prebuilt version I provide with explanation here: Clang on Windows

I modified Clang to work with the MinGW-w64 headers and GCC 4.6.3 libstdc++ headers and libraries. Currently, it's stuck at version 3.2, but if you apply a similar patch to the sources (of which I unfortunately do not have a patch file) you should be able to use it as well.

The one I provide is just extract, add to PATH, and use. And 32-bit only.

Also note you are using an ancient version of MinGW-w64 GCC, and you should really update that.

Upvotes: 1

mockinterface
mockinterface

Reputation: 14860

If you pass -nostdinc++ to clang you should be able to point it to the exact configuration of includes with multiple -I switches. Try -nostdsysteminc -nobuiltininc as well.

And -v should show you where and in what order it looks for headers when it compiles:

clang++ -v -nostdinc++ -ID:/Code/mingw/lib/gcc/x86_64-w64-ming32/4.7.0./include/c++ -ID:/Code/mingw/lib/gcc/x86_64-w64-ming32/4.7.0./include/c++/tr1 foo.cpp

Upvotes: 0

kotAPI
kotAPI

Reputation: 1073

Try downloading the "wchar.h" manually and placing it in your local working directory of your visual studio project. Works well for me.

Upvotes: 0

Related Questions