Встраивание компилятора 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);
почему бы просто вызов компилятор и компоновщик из вашего приложения с помощью 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-так я не выиграю награду:)