作为我的应用程序开发生成C源代码的一部分,我需要能够将编译器嵌入到我的应用程序中,以便它可以生成可执行对象代码。由于这是一个用于Mac App Store的沙盒应用程序,因此我无法使用NSTask
直接调用clang
,因为独立工具显然无法在沙箱下运行。可惜。
我遇到了libclang
,这是编译器的库版本,似乎可以解决这个问题。使用来自here的信息,我能够获取预配置的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);
不幸的是,它不会编译。我收到这些错误:
也许我没有包含正确的头文件,我不知道。但鉴于缺少libclang
的文档,我非常感谢一些帮助。