将C++头文件转换为protobuf .proto文件

11
我想知道是否有工具可以将.h文件转换为C++的.proto文件,以便序列化结构并通过protobuf发送它们。我需要.proto文件生成.pb.h和.pb.cc文件,然后才能对结构进行序列化和发送。请问是否有此类工具?如果手动完成会很耗时,因为头文件中包含许多结构体。谢谢!编辑一下我的问题,让你知道我没有找到我要求的东西,但我找到了这个工具https://code.google.com/p/protobuf-csharp-port/wiki/ProtoGen,这也非常有帮助。您可以将.proto文件作为参数传递给它,它会生成C#代码。希望能帮到您!

8
你需要走另一条路。创建一个Proto文件并使用“protoc”构建C++结构体。 - David Schwartz
是的,这就是我想做的。构建一个.proto文件并使用protoc来构建c++结构体。但我已经有了一个头文件中的结构体,我想知道是否有任何方法将此文件转换为.proto文件,以便我可以获得适用于protobuf的正确c++结构体。 - CompuPlanet
1
我听说LLVM可以解析C++语法并嵌入到编译器中,使用LLVM会有帮助吗? - superK
我也不知道有这样的工具——主要问题在于proto文件提供了抽象结构(确保名称唯一等),而.h/.cc只是所描述结构的一种可能实现。我建议使用一个好的编辑器(如sublimetext)进行多行编辑,然后手动创建proto文件。 - Wolfgang
我不明白如何从缺少必需信息的头文件中创建proto文件,例如必需、可选、重复关键字。 - Michael Surette
显示剩余5条评论
2个回答

1
您可以使用 libclang Python 绑定编写一个脚本,做得很好。首先,为您的项目使用 CMake 生成 compile_commands.json。解析您感兴趣的代码的完整编译器命令行。其次,将编译命令行传递给 libclang,从您的 Python 脚本中解析包含您感兴趣的头文件的编译单元。第三,迭代 AST 并提取您感兴趣的结构体。第四,从隔离的 AST 子树生成 protobuf。这只是一个草图,但我做了类似的事情,以递归地查找编译单元中包含的所有头文件。

0

以下代码或许能够帮到您:

for line in open("frame.v2.pb.h"):
    if (line.startswith("class") and line.find("::google::protobuf::Message") > 0 ) \
            or (line.startswith("  //") and line.find("@@protoc_insertion_point") < 0 and
                    line.find("--------")<0 ) \
            or line.startswith("namespace ") \
            :
        print(line.strip())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接