2012-12-24 17 views
8

Ho cercato di configurare Clang su Windows. Finora sono sopravvissuto a costruire con Visual Studio e CMake e qualche altra sorpresa. Ma si scopre che Clang non è dotato di una propria implementazione stdlib in C++, quindi ho deciso di utilizzare libstdC++ di GCC 4.7.0 creato per MinGW.Come impostare Clang per utilizzare MinGW libstdC++

Per cominciare, ho aggiunto il percorso di ricerca al mio HeaderSearchOptions.

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

Il percorso è esattamente dove le intestazioni reside- ho letteralmente copiato e incollato da Esplora risorse di Windows (e quindi raddoppiato il backslash per fughe). Ma Clang insiste ancora che non riesce a trovare <iostream>, anche se un file denominato iostream esiste esattamente allo path.

Perché non è possibile che Clang trovi la mia intestazione e cos'altro devo fare per utilizzare libstdC++?

Ecco il mio codice

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

Una semplice opzione '-I' dovrebbe essere sufficiente. Esegui 'gcc -v' e' gcc -E' (su un input di esempio) per scoprire tutti i percorsi che sta usando. –

risposta

4

È necessario chiamare manualmente clang::InitializePreprocessor e clang::BuiltinContext::InitializeBuiltins quando non si utilizza il Frontend.

Inoltre, la tripla deve essere denominata "MinGW32" come fornitore. Se chiami, per esempio "MinGW", Clang fallirà silenziosamente nel rendersi conto che desideri la compatibilità e produci file di oggetti inutili.

Problemi correlati