2012-01-16 21 views
23

Przede wszystkim śledziłem "Getting Started: Building and Running Clang". W szczególności zbudowałem go zgodnie z sekcją "Korzystanie z Visual Studio". Innymi słowy, mam zbudowany jest przy użyciu programu Visual Studio 2010.Clang na Windows

Po drugie, mam to i ręcznie ustawić ścieżki do dystrybucji MinGW Biblioteka:

enter image description here

Prosty Program Próbuję skompilować:

#include <iostream> 
using namespace std; 

int main() { 
    cout << "Hello, World!" << endl; 
    return 0; 
} 

pojawia się następujący zwrotne od kompilatora:

In file included from C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\iostream:39: 
In file included from C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\ostream:39: 
In file included from C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\ios:38: 
In file included from C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\iosfwd:41: 
In file included from C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\bits/postypes.h:41: 
C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\cwchar:144:11: error: no member named 'fgetws' in the global namespace 
    using ::fgetws; 
     ~~^ 
C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\cwchar:146:11: error: no member named 'fputws' in the global namespace 
    using ::fputws; 
     ~~^ 
C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\cwchar:150:11: error: no member named 'getwc' in the global namespace 
    using ::getwc; 
     ~~^ 
C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\cwchar:151:11: error: no member named 'getwchar' in the global namespace 
    using ::getwchar; 
     ~~^ 
C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\cwchar:156:11: error: no member named 'putwc' in the global namespace 
    using ::putwc; 
     ~~^ 
C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\cwchar:157:11: error: no member named 'putwchar' in the global namespace 
    using ::putwchar; 
     ~~^ 
6 errors generated. 
Build error occurred, build is stopped 
Time consumed: 646 ms. 

Oczywistym pytaniem jest - dlaczego to rozumiem?

Dodatkowo chciałbym poznać więcej szczegółów, a ponieważ strona Clang zapewnia bardzo krótką informację - Myślałam, że ktoś mógłby wyjaśnić mi się następujące pytania:

  1. O ile mi zrozumieć Clang nie mieć własną bibliotekę standardową (stdC++ chyba, prawda?). Właśnie dlatego muszę korzystać z nagłówków i bibliotek MinGW - czy mam rację?
  2. Jaka jest różnica między budowaniem Clanga a Visual Studio i MinGW?
  3. Czy muszę kodować ścieżkami w ścieżce clang/lib/Frontend/InitHeaderSearch.cpp, czy mogę je pominąć, a raczej określić te ścieżki później za pomocą opcji "-I", tak jak to robię na powyższym zrzucie ekranu?
+2

Kombinacja, którą udało mi się wykonać w przeszłości, polega na zmodyfikowaniu pliku InitHeaderSearch.cpp w celu włączenia ścieżki do moich folderów zawierających MinGW, a następnie do kompilacji za pomocą łańcucha narzędziowego MinGW.Byłem również w stanie zbudować używając toolchain Visual C++, ale nie byłem w stanie dowiedzieć się, jak skompilować kompilator do korzystania z nagłówków i bibliotek z instalacji MinGW (nagłówki biblioteki Visual C++ C++ Standard nie mogą być używane, ponieważ opierają się w dużej mierze na specyficznych funkcjach Visual C++). –

+3

Tak, dokładnie o tym myślałem. Ale największym myleniem dla mnie jest to, jak budowanie z Visual C++ lub MinGW jest związane z włączaniem i ścieżkami biblioteki używanymi podczas używania kompilatora Clang. Innymi słowy, muszę mieć możliwość swobodnego wyboru tych ścieżek po skompilowaniu Clanga. Dlaczego, u licha, te ścieżki zależą od kompilatora, którego użyłem do zbudowania Clanga? –

+1

@JamesMcNellis: Clang powinien być w stanie obecnie parsować nagłówki VC++. Jedynym problematycznym obszarem analizowania jest MFC IIRC. – rubenvb

Odpowiedz

32

Jeśli zbudujesz Clang z MSVS, automatycznie wyszuka domyślne ścieżki zawierające VS i pobierze te nagłówki. Z tego powodu nagłówki libstdC++ powodują błędy: importują funkcje C, które nie występują w nagłówkach VS. Używanie Clang dla C++ z VS jest na razie bezużyteczne: dostaniesz awarie łącza z powodu braku funkcji ABI (wymazywanie nazw i innych) w Clang. Jeśli nadal chcesz używać MSVS Clang, nie kieruj go do nagłówków MinGW. Parsuje nagłówki VS (w tym C++), po prostu nie uda się połączyć.


EDIT: I zostały zbudowane DW2 wersję GCC (tylko 32-bitowy) towarzyszy Clang. Wyjątki działają w tej kompilacji, więc możesz budować prawdziwe rzeczy w C++ za pomocą Clanga teraz w systemie Windows. Get version 3.2 here.

+0

A co, jeśli samodzielnie ręcznie zbuduję go za pomocą MinGW i ręcznie doda ścieżki, tak jak to robię na zrzucie ekranu? –

+1

wszelkie wstępnie zbudowane pakiety binarne clang? –

+0

@ Mr.Anubis: tak, mam kompilację Windows Clang dla każdej wersji GCC, którą zbudowałem. Po prostu nie możesz tego użyć sam. – rubenvb

1

Oczywistą odpowiedzią jest zapomniałeś wysyłania -fno-MS-kompatybilność do Clang ++: P

  1. Masz rację.
  2. VC++ jest łańcuchem narzędzi GUI, MinGW jest konsolą znaków.
  3. Nie, jak klang jest wystarczająco dojrzałe do publicznej konsumpcji, ale nadal się ustabilizować, więc niech jego zespół dev pracuje nad kodem, w przeciwnym razie ryzykujesz pracą, która może zaginąć na wyspie. Używam - jak sugeruje twój przykład.

Robię program do tworzenia aplikacji dla systemu Windows przy użyciu VS i używam clang + CodeBlocks do udostępniania aspektów neutralnych dla domeny platformy.

+1

VC++ <-> MinGW. VC++ nie jest GUI. Ma interfejs linii poleceń. – rubenvb

+0

"Łańcuch narzędzi GUI" nie jest GUI. Łańcuch narzędzi z GUI w ramach domyślnej instalacji. –