着色器不是很酷吗?您可以只输入一个纯字符串,只要它是有效的源,它就会编译、链接和执行。我想知道是否有一种方法可以将 GCC 嵌入到用户应用程序中,以便它“自给自足”,例如具有编译与其自身兼容的本机二进制文件的内部功能。
到目前为止,我一直在从应用程序内部启动的进程中调用独立的 GCC,但我想知道是否有一些 API 或其他东西可以允许“直接”使用而不是独立的编译器。另外,如果可以的话,是否允许?
编辑:虽然最初的问题是关于 CGG 的,但我也愿意了解如何嵌入 LLVM/Clang 的信息。
现在,对于无法将 2 + 2 放在一起的人进行特殊编辑:问题询问如何以允许从代码使用内部 API 而不是从命令提示符调用编译的方式将 GCC 或 Clang 嵌入到可执行文件中。
我会为使用 Clang/LLVM 而不是 GCC 的建议添加+1。有几个很好的理由:
- 它更加模块化和灵活
- 编译时间可以大大低于 GCC
- 它支持您在评论中列出的平台
- 它有一个可以在内部使用的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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)