c++ - 在应用程序中嵌入 C++ 编译器

标签 c++ gcc compiler-construction embed executable

着色器不是很酷吗?您可以只输入一个普通字符串,只要它是有效的源代码,它就会编译、链接和执行。我想知道是否有一种方法可以将 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/

相关文章:

c - 我怎样才能让 gcc 预处理器检查一个表达式的计算结果是一个值还是什么都没有?

gcc - 哪里有创建 GCC 前端的好文档?

c++ - C++ 无法识别头文件

c++ - 根据标准,这些编译器中的哪个有错误?

c++ - Qt错误: cannot open output file debug

c++ - 退出简单的 while 循环时遇到问题

c++ - 顺序和并行版本给出不同的结果 - 为什么?

c++ - 英特尔 SSE 的斜坡函数

c++ - 在跨平台代码中处理 stdafx.h

c - 达到涉及指针的定义