22

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

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

4

5 回答 5

2

你可以试试SWIG,C 代码生成器是去年的 GSoC 项目。AFAIK 他们还没有将它合并到主干,所以你必须从 SVN 签出并构建分支。

于 2009-07-01T09:30:27.843 回答
2

我刚刚在 Python 中开发了一个 C 函数包装器来执行此操作(生成包装 C 函数的 C++ 类)。

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

于 2011-06-29T00:10:45.940 回答
1

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

如果您擅长编写解析器,那么创建一个基本的包装器生成器不会太难。最后,您可能必须手动添加一些收尾工作,但您的工作量仍然会减少。

于 2009-07-01T09:23:27.017 回答
1

您的 C++ 代码有多少已经编写,还有多少尚未编写?如果要编写一个合理的比例,我会创建一个简化的语法,生成 C++ 和 C 头文件,就像 IDL 为 COM 接口所做的那样。这种简化的语法比 C++ 更容易解析,或者您可能会找到现成的东西来做这件事。

于 2009-07-02T04:42:38.297 回答
0

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

于 2009-07-01T15:44:50.180 回答