Создать оболочку C из С++?
Я хочу сгенерировать C-оболочки из библиотек С++.
Есть учебники о том, как это сделать вручную:
Но это слишком тяжелый ручной труд.
Например, для этого:
struct RtAudio {
virtual DeviceInfo const& f() {...}
class DeviceInfo {
virtual void g() { ... }
};
...
};
Мне нужно написать:
struct RtAudioC {
RtAudio x;
};
struct DeviceInfo {
RtAudio::DeviceInfo x;
};
extern "C" {
RtAudioC* newRtAudio() {
return new RtAudioC;
}
void deleteRtAudio(RtAudioC *p {
delete p;
}
/* do something with RtAudio::f() */
void g(DeviceInfo *p) {
try {
p->x.g();
} catch (SomeError & err) {
}
}
}
Существуют ли инструменты, которые могут автоматизировать этот процесс?
Ответы
Ответ 1
Я только что разработал оболочку C-функции в Python, чтобы сделать именно это (сгенерировать классы С++, которые обертывают функции C).
Он еще молод, но основная часть того, что мне нужно, это сейчас. Попробуйте и дайте мне знать, что вы думаете: https://github.com/mlb5000/CFunctionWrapperGenerator
Ответ 2
Существует gmmproc, который создает С++-оболочки для библиотек C на основе gobject, но это единственный генератор кода, который я слышал о C и С++.
Если вы хорошо разбираетесь в парсере, задача создания базового генератора обертки не будет слишком сложной задачей. В конце концов вам, возможно, придется добавить несколько штрихов вручную, но ваша рабочая нагрузка будет уменьшена.
Ответ 3
Вы можете попробовать SWIG, генератор кода C был в прошлом году проектом GSoC. AFAIK они еще не объединили его с багажником, поэтому вам нужно будет проверить и построить ветку из SVN.
Ответ 4
Сколько вашего кода на С++ уже написано против того, сколько еще нужно написать?
Если разумная пропорция должна быть написана, я бы создал упрощенный синтаксис, который генерирует как заголовки С++, так и C, например IDL для COM-интерфейсов. Этот упрощенный синтаксис будет намного проще для вас разобрать, чем С++, или вы можете найти что-то с полки, которое это делает.
Ответ 5
Я не знаю, как это сделать. Если вы хотите автоматизировать поколение и с удовольствием создадите свои собственные скрипты, pygccxml (на основе GCC-XML) - неплохой способ разобрать заголовки С++.