C++ 将clang编译器嵌入OS X Cocoa应用程序
作为生成C源代码的应用程序开发的一部分,我需要能够将编译器嵌入到我的应用程序中,以便它能够生成可执行的目标代码。由于这是一个针对Mac app Store的沙盒应用程序,我无法使用C++ 将clang编译器嵌入OS X Cocoa应用程序,c++,objective-c,macos,cocoa,libclang,C++,Objective C,Macos,Cocoa,Libclang,作为生成C源代码的应用程序开发的一部分,我需要能够将编译器嵌入到我的应用程序中,以便它能够生成可执行的目标代码。由于这是一个针对Mac app Store的沙盒应用程序,我无法使用NSTask直接调用clang,因为独立工具显然无法在沙盒下工作。可怜 我遇到了libclang,这是一个编译器的库版本,它似乎做到了这一点。使用来自的信息,我能够获取一个预配置的libclang二进制文件来集成到我的应用程序中。问题是,我似乎不知道进程和生成可执行文件的libclangAPI调用是什么。我发现了以下示
NSTask
直接调用clang
,因为独立工具显然无法在沙盒下工作。可怜
我遇到了libclang
,这是一个编译器的库版本,它似乎做到了这一点。使用来自的信息,我能够获取一个预配置的libclang
二进制文件来集成到我的应用程序中。问题是,我似乎不知道进程和生成可执行文件的libclang
API调用是什么。我发现了以下示例代码:
string source = "app.c";
string target= "app";
llvm::sys::Path clangPath = llvm::sys::Program::FindProgramByName("clang");
// arguments
vector<const char *> args;
args.push_back(clangPath.c_str());
args.push_back(source.c_str());
args.push_back("-l");
args.push_back("curl");
clang::TextDiagnosticPrinter *DiagClient = new clang::TextDiagnosticPrinter(llvm::errs(), clang::DiagnosticOptions());
clang::IntrusiveRefCntPtr<clang::DiagnosticIDs> DiagID(new clang::DiagnosticIDs());
clang::DiagnosticsEngine Diags(DiagID, DiagClient);
clang::driver::Driver TheDriver(args[0], llvm::sys::getDefaultTargetTriple(), target, true, Diags);
clang::OwningPtr<clang::driver::Compilation> c(TheDriver.BuildCompilation(args));
int res = 0;
const clang::driver::Command *FailingCommand = 0;
if (c) res = TheDriver.ExecuteCompilation(*c, FailingCommand);
if (res < 0) TheDriver.generateCompilationDiagnostics(*c, FailingCommand);
string source=“app.c”;
string target=“app”;
llvm::sys::Path clangPath=llvm::sys::Program::FindProgramByName(“clang”);
//论据
向量args;
args.push_back(clangPath.c_str());
args.push_back(source.c_str());
参数。推回(“-l”);
args.向后推(“卷曲”);
clang::TextDiagnosticPrinter*DiagClient=新的clang::TextDiagnosticPrinter(llvm::errs(),clang::DiagnosticOptions());
clang::intrusiverefcntpr DiagID(新clang::diagnostics());
diagnosticsenginediags(DiagID,DiagClient);
clang::driver::driver driver(args[0],llvm::sys::getDefaultTargetTriple(),target,true,Diags);
clang::owningptrc(driver.BuildCompilation(args));
int res=0;
const clang::driver::Command*FailingCommand=0;
如果(c)res=driver.executecomplation(*c,FailingCommand);
如果(res<0)驱动程序生成编译诊断(*c,故障命令);
但不幸的是,它无法编译。我发现以下错误:
也许我没有包括正确的头文件,我不知道。但是由于缺少
libclang
的文档,我将非常感谢您的帮助。可能缺少包括grep
在源代码树中查找丢失的类型名称,并查看它的标题。@AndrewMedico我有,但包含一个文件会让数百人做噩梦。。。哦,兄弟。