2014-08-30 6 views
7

मैं एक सी ++ हैडर कहा जाता class.h कि मैं पार्स करने के लिए करना चाहते हैं एक हैडर पार्स करने के लिए एक बजना CompilerInstance वस्तु के लिए मजबूर करने में असमर्थ:के रूप में सी ++ फ़ाइल

class MyClass 
{ 
    public: 
    Class() {} 
    ~Class() {} 
    bool isTrue() const; 
    bool isFalse() const; 
    private: 
    bool m_attrib; 
}; 

bool MyClass::isTrue() const 
{ 
    return true; 
} 
bool MyClass::isFalse() const 
{ 
    return false; 
} 

मैं एक एएसटी के साथ एक संकलक उदाहरण बजना का उपयोग करें उपभोक्ता। मेरा सभी कोड सी स्रोत फ़ाइल के साथ अच्छी तरह से काम करता है। लेकिन मैं उस लापरवाही को कॉन्फ़िगर/बल करने में असमर्थ हूं जिसे कंपाइलर इंस्टेंस का उपयोग करना चाहिए।

m_ci = new clang::CompilerInstance(); 
/*configure the langage to use*/ 
clang::CompilerInvocation *invocation = new clang::CompilerInvocation; 
clang::LangOptions langOpts; 
/*with langage = clang::IK_CXX*/ 
langOpts.CPlusPlus = 1; 
invocation->setLangDefaults(langOpts, langage); 
m_ci->setInvocation(invocation); 
m_ci->createDiagnostics(); 
llvm::IntrusiveRefCntPtr<clang::TargetOptions> pto(new clang::TargetOptions()); 
pto->Triple = llvm::sys::getDefaultTargetTriple(); 
clang::TargetInfo *pti = clang::TargetInfo::CreateTargetInfo(m_ci->getDiagnostics(), pto.getPtr()); 
m_ci->setTarget(pti); 
m_ci->createFileManager(); 
m_ci->createSourceManager(ci->getFileManager()); 
m_ci->createPreprocessor(); 
/*add some header search paths*/ 
m_hso = llvm::IntrusiveRefCntPtr<clang::HeaderSearchOptions>(new clang::HeaderSearchOptions()); 
m_hso->AddPath(pathName.c_str(), 
       clang::frontend::Angled, 
       false, 
       false); 
/*add the source file*/ 
const clang::FileEntry *pFile = m_ci->getFileManager().getFile(fileName.c_str()); 
m_ci->getSourceManager().createMainFileID(pFile); 
/*parse*/ 
clang::InitializePreprocessor(m_ci->getPreprocessor(), 
           m_ci->getPreprocessorOpts(), 
           *m_hso, 
           m_ci->getFrontendOpts()); 
m_ci->createASTContext(); 
m_headerElements = new HeaderElements(); 
m_ci->setASTConsumer(m_headerElements); 
m_ci->getDiagnosticClient().BeginSourceFile(m_ci->getLangOpts(), 
              &m_ci->getPreprocessor()); 
clang::ParseAST(m_ci->getPreprocessor(), m_headerElements, m_ci->getASTContext()); 
m_ci->getDiagnosticClient().EndSourceFile(); 

जब मैं यह परीक्षण, पार्सर इस तरह त्रुटियों फेंकता है:

error: unknown type name 'class' 

और परीक्षण

m_ci->getLangOpts.CPlusPlus == 0 

सच है तो ऐसा लगता है कि यहाँ कोड मैं का उपयोग करें लैंपऑप्शन को कंपाइलर इंस्टेंस पर लागू नहीं किया गया है।

उत्तर

11

कुछ परीक्षणों और कई खोजों के बाद, मैंने यह पता लगाया है कि यह कैसे करें। एक CompilerInstance वस्तु की भाषा विकल्प सेट करने के लिए, तो आप सिर्फ यह करना है:

clang::CompilerInstance ci; 
//initialize lot of stuff 
ci.createDiagnostics(); 
ci.createFileManager(); 
ci.createSourceManager(m_ci.getFileManager()); 
std::shared_ptr<clang::TargetOptions> pto = std::make_shared<clang::TargetOptions>(); 
pto->Triple = llvm::sys::getDefaultTargetTriple(); 
clang::TargetInfo *pti = clang::TargetInfo::CreateTargetInfo(ci.getDiagnostics(), pto); 
ci.setTarget(pti); 
//force langage to C++ 
ci.getLangOpts().CPlusPlus = 1; 
ci.createPreprocessor(clang::TU_Complete); 

महत्वपूर्ण बात बनाने या CompilerInstance::createPreprocessor()

साथ पूर्वप्रक्रमक फिर से बनाने से पहले LangOpts कॉन्फ़िगर करने के लिए है
संबंधित मुद्दे