Встраивание компилятора C++ в приложение

разве шейдеры не классные? Вы можете бросить только простую строку, и пока она является допустимым источником, она будет компилироваться, связываться и выполняться. Мне было интересно, есть ли способ встроить GCC в пользовательское приложение, чтобы оно было "самодостаточным", например, имеет внутреннюю возможность компилировать собственные двоичные файлы, совместимые с собой.

до сих пор я вызывал автономный GCC из процесса, запущенного внутри приложения, но мне было интересно, есть ли какой-то API или что-то, что может позволяют использовать "напрямую", а не компилятора. Кроме того, в случае, если это возможно, разрешено ли это?

EDIT: хотя первоначальный вопрос был о CGG, я бы согласился на информацию о том, как встроить LLVM/Clang.

и теперь специальное редактирование для людей, которые не могут объединить 2 + 2: вопрос спрашивает о том, как встроить GCC или Clang внутри исполняемого файла таким образом, чтобы внутренний API использовался из кода, а не вызывал компиляцию из команды быстрый.

4 ответов


Я бы добавил +1 к предложению использовать Clang / LLVM вместо GCC. Несколько веских причин, почему:

  • Он более модульный и гибкий
  • время компиляции может быть существенно ниже, чем 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);

Да, это возможно, например, QEMU это делает.

У меня нет личного опыта в этой области, но из того что я читал, кажется, что LLVM может быть лучше подходит для встраивания и расширения, чем GCC.


почему бы просто вызов компилятор и компоновщик из вашего приложения с помощью fork()/exec() (для UNIX-подобных платформах)? Создать общую библиотеку, которую затем можно загрузить с dlopen().

это позволяет избежать возможных проблем лицензирования и дает вам меньше нагрузки на обслуживание.

Это например что лак С конфигурационные файлы;

язык VCL-это небольшой доменный язык предназначен для определения политик обработки запросов и кэширования документов для кэша лаков.

при загрузке новой конфигурации процесс управления varnishd преобразует код VCL в C и компилирует его в общий объект, который затем динамически связывается с серверным процессом.


более старый список компиляторов и интерпретаторов C++ доступен по адресуhttp://www.thefreecountry.com/compilers/cpp.shtml.

ответ на" самодостаточное " приложение обычно является хорошим интерпретатором языка. Есть много из них там, многие компилируют код в файлы байтового кода. Очень популярным и легко встраиваемым является язык Lua переводчик. Даже некоторые сильные игроки использовать.

также был открыт исходный интерпретатор C++ с отличной языковой совместимостью, созданный много лет назад, начиная с F.. Не помню остальную часть имени. Есть также много других инструментов, способных создавать собственные двоичные файлы (например,Бесплатно Паскаль).

выбор языка и целевой платформы зависит от намерений. Для чего нужна" самодостаточность"? Кто будет писать эти библиотеки. После того, как у вас есть, что ясно использовать Google - есть дикая природа там. Один из последних звери-это компилятор C# с открытым исходным кодом "Roslyn"

редактировать

Если вам нужен компилятор C (при создании подмножества C), который может быть "встроен", вы, вероятно, ищете "портативный компилятор C" в том смысле, что вы можете положите его на USB-накопитель и носите с собой. Портативные применения можно легко "врезать" в другие применения и могут легко быть включены в установщик.

возможность "встраивания" компилятора как статически связанного кода в основной двоичный файл приложения, вероятно, не требуется.

некоторая ссылка на portable MinGW описана в этом https://stackoverflow.com/questions/7617410/portable-c-compiler-ide так вопрос.

редактор C++ с открытым исходным кодом со встроенным MinGW здесь https://code.google.com/p/pocketcpp/.

мне больше нечего сказать, как я бы придется идти и просматривать Google-так я не выиграю награду:)