从C ++生成C包装器?

时间:2009-07-01 04:30:40

标签: c++ c wrapper ffi

我想从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) {
        }
    }
}

是否有可以自动完成此过程的工具?

5 个答案:

答案 0 :(得分:2)

您可以尝试SWIG,C代码生成器是去年的GSoC项目。 AFAIK他们还没有把它合并到后备箱,所以你必须结账&从SVN建立分支。

答案 1 :(得分:2)

我刚刚用Python开发了一个C函数包装器来完成这个(生成包装C函数的C ++类)。

它还很年轻,但我现在需要做的大部分工作就在那里。试一试,让我知道你的想法:https://github.com/mlb5000/CFunctionWrapperGenerator

答案 2 :(得分:1)

有gmmproc为基于gobject的C库创建C ++包装器,但这是我在C和C ++之间听说过的唯一代码生成器。

如果您对编写解析器很擅长,那么创建基本包装器生成器并不困难。最后,您可能需要手动添加一些最后润色,但仍然会减少您的工作量。

答案 3 :(得分:1)

您已经编写了多少C ++代码而未编写多少代码? 如果要写一个合理的比例,我会创建一个简化的语法,生成C ++和C头,就像IDL对COM接口一样。这个简化的语法比C ++更容易解析,或者您可能会发现现成的东西。

答案 4 :(得分:0)

我不知道有一个现成的工具来做到这一点。如果你想自动生成代码并且很乐意编写自己的脚本,pygccxml(基于GCC-XML)是解析C ++头文件的一种很好的方法。