着色器不是很酷吗?您可以只输入一个普通字符串,只要它是有效的源代码,它就会编译、链接和执行。我想知道是否有一种方法可以将 GCC 嵌入到用户应用程序中,以便它“自给自足”,例如具有编译与自身兼容的 native 二进制文件的内部能力。
到目前为止,我一直在从应用程序内部启动的进程中调用独立的 GCC,但我想知道是否有一些 API 或其他东西可以允许“直接”使用而不是独立的编译器。另外,在可能的情况下,是否允许?
编辑:虽然最初的问题是关于 CGG 的,但我也愿意了解如何嵌入 LLVM/Clang 的信息。
现在针对无法将 2 + 2 放在一起的人进行特殊编辑:问题询问如何将 GCC 或 Clang 嵌入可执行文件中,以允许从代码中使用内部 API 而不是从中调用编译命令提示符。
最佳答案
我会为使用 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);
关于c++ - 在应用程序中嵌入 C++ 编译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23058873/