2012-12-24 18 views
8

Kullanmak için Clang nasıl kurulur Windows üzerinde Clang kurmaya çalışıyorum. Şimdiye kadar Visual Studio ve CMake ile binadan ve diğer birkaç sürprizden kurtuldum. Ancak Clang'ın kendi C++ stdlib uygulamasıyla gelmediği ortaya çıkıyor, bu yüzden GCC 4.7.0'ın MinGW için geliştirilmiş libstdC++'sini kullanmaya karar verdim.MinGW libstdC++

Başlamak için, arama yolumu HeaderSearchOptions'uma ekledim. Tam anlamıyla kopyalanıp yapıştırılan bunu Windows Gezgini reside- başlıkları (ve sonra kaçaklar için tersbölüleri katına) nerede

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

yolu tam olarak budur. Ancak, Clang hala iostream adlı bir dosya tam olarak path'da bulunsa bile <iostream> bulamadığını ısrar ediyor.

Neden Clang başlığımı bulamıyor ve libstdC++ kullanmak için başka ne yapmam gerekiyor?

İşte

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

Basit bir '-I seçeneği yeterli olmalıdır. Kullandığı tüm yolları öğrenmek için 'gcc -v' ve' gcc -E' (örnek bir girişte) çalıştırın. –

cevap

4

O Ön Ucu kullanmayan zaman elle clang::InitializePreprocessor ve clang::BuiltinContext::InitializeBuiltins aramak gereklidir benim kod. Ayrıca, üçlü satıcı olarak "MinGW32" olarak adlandırılmalıdır. Eğer "MinGW" olarak adlandırırsanız, Clang sessizce, söz konusu uyumluluk için istediğini ve işe yaramaz nesne dosyaları ürettiğinizi fark edemez.