2012-01-16 35 views
23

Trước hết, tôi đã theo dõi "Getting Started: Building and Running Clang". Đặc biệt, tôi đã xây dựng nó theo phần "Sử dụng Visual Studio". Nói cách khác, tôi đã xây dựng nó sử dụng Visual Studio 2010.Clang trên Windows

Thứ hai, tôi đã tự đặt bao gồm đường dẫn và thư viện để phân phối MinGW:

enter image description here

Chương trình đơn giản, tôi đang cố gắng để biên dịch:

#include <iostream> 
using namespace std; 

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

tôi nhận được thông tin phản hồi sau từ trình biên dịch:

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. 

Câu hỏi hiển nhiên là - tại sao tôi nhận được điều này?

Ngoài ra, tôi muốn biết thêm chi tiết, và từ đó, trang web Clang cung cấp thông tin cực kỳ ngắn ngủi - Tôi nghĩ rằng ai đó có thể làm sáng tỏ những câu hỏi sau đây với tôi:

  1. Theo như tôi hiểu Clang không có thư viện chuẩn của riêng nó (stdC++ tôi đoán, phải không?). Đó là lý do tại sao tôi phải sử dụng các tiêu đề và thư viện của MinGW - tôi có đúng không?
  2. Sự khác biệt giữa xây dựng Clang với Visual Studio và MinGW là gì?
  3. Tôi có phải mã cứng bao gồm các đường dẫn trong clang/lib/Frontend/InitHeaderSearch.cpp hoặc tôi có thể bỏ qua và thay vào đó chỉ định các đường dẫn sau đó thông qua tùy chọn "-I" như tôi làm trong ảnh chụp màn hình ở trên?
+2

Sự kết hợp tôi đã nhận được để làm việc trong quá khứ là sửa đổi InitHeaderSearch.cpp để bao gồm đường dẫn đến MinGW của tôi bao gồm các thư mục và sau đó để xây dựng với chuỗi công cụ MinGW.Tôi cũng đã có thể xây dựng bằng cách sử dụng Visual C++ toolchain, nhưng tôi đã không thể tìm ra cách để có được trình biên dịch được xây dựng để sử dụng các tiêu đề và thư viện từ cài đặt MinGW (Visual C++ C++ tiêu đề thư viện tiêu chuẩn không thể được sử dụng vì chúng dựa nhiều vào Visual C++ - các tính năng cụ thể). –

+3

Vâng đó chính xác là những gì tôi đang nghĩ đến. Nhưng sự nhầm lẫn lớn nhất đối với tôi là cách xây dựng với Visual C++ hoặc MinGW liên quan đến các đường dẫn thư viện và bao gồm được sử dụng trong quá trình sử dụng trình biên dịch Clang. Nói cách khác, tôi có thể tự do lựa chọn những con đường này sau khi biên dịch Clang. Tại sao các đường dẫn này lại phụ thuộc vào trình biên dịch mà tôi đã sử dụng để xây dựng Clang? –

+1

@JamesMcNellis: Clang sẽ có thể phân tích cú pháp tiêu đề VC++ hiện tại. Khu vực phân tích cú pháp có vấn đề duy nhất là MFC IIRC. – rubenvb

Trả lời

32

Nếu bạn xây dựng Clang với MSVS, nó sẽ tự động tìm kiếm đường dẫn VS bao gồm mặc định và kéo vào các tiêu đề đó. Đây là lý do tiêu đề libstdC++ tạo ra lỗi: chúng đang nhập các hàm C không có trong tiêu đề VS. Sử dụng Clang cho C + + với VS là bây giờ một không-đi: bạn sẽ nhận được liên kết thất bại do thiếu ABI (tên mangling và những người khác) chức năng trong Clang. Nếu bạn vẫn muốn sử dụng MSVS Clang, đừng trỏ nó vào các tiêu đề MinGW. Nó sẽ phân tích cú pháp tiêu đề VS (bao gồm cả C++), nó sẽ không liên kết.


EDIT: Tôi đã xây dựng một phiên bản dw2 của GCC (32-bit) kèm theo Clang. Các ngoại lệ hoạt động trong bản dựng này, và vì vậy bạn có thể tạo các công cụ C++ thực với Clang ngay trên Windows. Get version 3.2 here.

+0

Và nếu tôi tự xây dựng nó bằng MinGW và thêm đường dẫn theo cách thủ công như tôi làm trong ảnh chụp màn hình thì sao? –

+1

bất kỳ gói nhị phân dựng sẵn nào của clang? –

+0

@ Mr.Anubis: vâng, tôi có một bản dựng Windows của Clang cho mỗi phiên bản GCC mà tôi đã xây dựng. Bạn không thể sử dụng nó một mình. – rubenvb

1

Câu trả lời rõ ràng là bạn quên gửi -fno-ms-tương thích để Clang ++: P

  1. Bạn nói đúng.
  2. VC++ là chuỗi công cụ GUI, MinGW là bảng điều khiển ký tự.
  3. Không có tiếng kêu nào đủ trưởng thành để tiêu thụ công cộng nhưng vẫn ổn định để cho nhóm dev làm việc trên mã nếu không bạn có nguy cơ làm việc có thể trở thành đảo bị mất. Tôi đang sử dụng -I như ví dụ của bạn cho thấy.

Tôi đang làm cửa sổ ứng dụng dev bằng cách sử dụng VS và sử dụng clang + CodeBlocks để chia sẻ các khía cạnh trung lập với miền của nền tảng.

+1

VC++ <-> MinGW. VC++ không phải là GUI. Nó có một giao diện dòng lệnh. – rubenvb

+0

"GUI tool-chain" không phải là GUI. Chuỗi công cụ của nó với GUI được bao gồm trong cài đặt mặc định. –