2012-12-24 23 views
8

Tôi đã cố gắng thiết lập Clang trên Windows. Cho đến nay tôi đã sống sót với Visual Studio và CMake, và một vài điều bất ngờ khác. Nhưng nó chỉ ra rằng Clang không đi kèm với thực hiện stdlib C++ của riêng mình, vì vậy tôi quyết định sử dụng libstdC++ của GCC 4.7.0 được xây dựng cho MinGW.Cách thiết lập Clang để sử dụng MinGW libstdC++

Để bắt đầu, tôi đã thêm đường dẫn tìm kiếm vào HeaderSearchOptions của tôi.

headeropts->AddPath(path, clang::frontend::IncludeDirGroup::CXXSystem, true, false, false); 

Đường dẫn chính xác nơi các tiêu đề cư trú- Tôi đã sao chép và dán chính xác từ Windows Explorer (và sau đó tăng gấp đôi dấu gạch chéo ngược để thoát). Nhưng Clang vẫn khẳng định rằng nó không thể tìm thấy <iostream>, mặc dù một tệp có tên iostream tồn tại chính xác tại path.

Tại sao Clang không thể tìm tiêu đề của tôi và tôi cần phải làm gì khác để sử dụng libstdC++?

Dưới đây là mã của tôi

llvm::LLVMContext c; 
llvm::Module m("", c); 

clang::CompilerInstance ci; 

clang::FileSystemOptions fso; 

clang::FileManager fm(fso); 

std::string errors; 
llvm::raw_string_ostream error_stream(errors); 
clang::DiagnosticOptions diagopts; 
clang::TextDiagnosticPrinter printer(error_stream, &diagopts); 
llvm::IntrusiveRefCntPtr<clang::DiagnosticIDs> diagids(new clang::DiagnosticIDs); 
clang::DiagnosticsEngine engine(diagids, &diagopts, &printer, false); 

clang::SourceManager sm(engine, fm); 

clang::LangOptions langopts; 
langopts.CPlusPlus = true; 
langopts.CPlusPlus0x = true; 

clang::TargetOptions target; 
target.Triple = llvm::sys::getDefaultTargetTriple(); 
auto targetinfo = clang::TargetInfo::CreateTargetInfo(engine, &target); 

auto headeropts = llvm::IntrusiveRefCntPtr<clang::HeaderSearchOptions>(new clang::HeaderSearchOptions()); 
headeropts->AddPath("D:\\Backups\\unsorted\\x86_64-w64-mingw32-gcc-4.7.0-release-win64_rubenvb\\mingw64\\include\\c++\\4.7.0",clang::frontend::IncludeDirGroup::CXXSystem, true, false, false); 
headeropts->UseStandardCXXIncludes = true; 
headeropts->UseStandardSystemIncludes = true; 
clang::HeaderSearch hs(headeropts, fm, engine, langopts, targetinfo); 

auto x = llvm::IntrusiveRefCntPtr<clang::PreprocessorOptions>(new clang::PreprocessorOptions()); 
clang::Preprocessor p(x, engine, langopts, targetinfo, sm, hs, ci); 

clang::ASTContext astcon(langopts, sm, targetinfo, p.getIdentifierTable(), p.getSelectorTable(), p.getBuiltinInfo(), 1000); 
CodeGenConsumer consumer; 
clang::CodeGen::CodeGenModule codegen(astcon, clang::CodeGenOptions(), m, llvm::DataLayout(&m), engine); 
consumer.mod = &codegen; 
clang::Sema sema(p, astcon, consumer, clang::TranslationUnitKind::TU_Complete); 

sm.createMainFileID(fm.getFile("main.cpp")); 
engine.getClient()->BeginSourceFile(langopts, &p); 
clang::ParseAST(sema); 
+0

Tùy chọn '-I' đơn giản là đủ. Chạy 'gcc -v' và' gcc -E' (trên đầu vào mẫu) để tìm ra tất cả các đường dẫn mà nó đang sử dụng. –

Trả lời

4

Nó là cần thiết để tự gọi clang::InitializePreprocessorclang::BuiltinContext::InitializeBuiltins khi không sử dụng Frontend.

Ngoài ra, ba phải đặt tên "MinGW32" làm nhà cung cấp. Nếu bạn đặt tên, nói "MinGW", thì Clang sẽ âm thầm không nhận ra rằng bạn mong muốn khả năng tương thích và tạo ra các tệp đối tượng vô dụng.

Các vấn đề liên quan