Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将clang编译器嵌入OS X Cocoa应用程序_C++_Objective C_Macos_Cocoa_Libclang - Fatal编程技术网

C++ 将clang编译器嵌入OS X Cocoa应用程序

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调用是什么。我发现了以下示

作为生成C源代码的应用程序开发的一部分,我需要能够将编译器嵌入到我的应用程序中,以便它能够生成可执行的目标代码。由于这是一个针对Mac app Store的沙盒应用程序,我无法使用
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我有,但包含一个文件会让数百人做噩梦。。。哦,兄弟。