如何用Apache Avro生成C++头文件(Python脚本)

0 投票
2 回答
1693 浏览
提问于 2025-04-16 22:59

我想用Apache Avro的代码生成工具(也就是那个Python脚本)来生成一个C++的头文件。根据文档,这应该是比较简单的,但我平时不怎么用Python,所以看起来有点奇怪。

说明上说:

生成代码的过程分为两个步骤:

precompile < imaginary > imaginary.flat

第一个步骤是预编译,它会把模式转换成一个中间格式,这个格式是代码生成器使用的。这个中间文件其实就是模式的文本表示,经过深度优先遍历树结构后变得扁平化。

python scripts/gen-cppcode.py --input=example.flat --output=example.hh –-namespace=Math

这一步告诉代码生成器读取你扁平化后的模式作为输入,然后生成一个名为example.hh的C++头文件。可选的参数namespace会把对象放在那个命名空间里……

我的问题(不是,我不能去看医生或涂药膏):

我没有找到任何详细说明如何进行预编译的内容。文档看起来好像只要我在命令提示符里输入“precompile”并提供命令行参数,就能神奇地工作,但“precompile”并不是一个有效的Windows命令。那么在Windows上正确的预编译方法是什么呢?如果有人知道怎么做,请告诉我!

我还尝试运行gen-cppcode.py脚本,但在第316行出错(我怀疑可能是因为我没有预编译模式):

def doEnum(args):
    structDef = enumTemplate;
    typename = args[1]
    structDef = structDef.replace('$name$', typename)
    end = False
    symbols = '';
    firstsymbol = '';
    while not end:
        line = getNextLine()
        if line[0] == 'end': end = True
        elif line[0] == 'name':
            if symbols== '' :
                firstsymbol = line[1]
            else :
                symbols += ', '
            symbols += line[1]
        else: print "error" // <-- Syntax Error: invalid syntax
    structDef = structDef.replace('$enumsymbols$', symbols);
    structDef = structDef.replace('$firstsymbol$', firstsymbol);
    addStruct(typename, structDef)
    return (typename,typename)

2 个回答

0

我发现运行 gen-cppcode.py 这个文件需要Python 2 版本

你可以在这里下载:https://www.python.org/downloads/

1

我找到的唯一方法是:

  1. 下载 VirtualBox。
  2. 安装 Ubuntu(或者其他的操作系统)。
  3. 下载 Avro。
  4. 安装 cmake。
  5. 安装 C++ 编译器(基本构建工具)。
  6. 安装 boost、flex、bison(可以用命令 sudo apt-get install boost flex bison);顺便说一下,你特别需要这些 boost 库:
    -- regex(正则表达式)
    -- filesystem(文件系统)
    -- system(系统)
    -- program_options(程序选项)
  7. 构建 Avro:

    $ tar xf avro-cpp-1.5.1.tar.gz
    $ cd avro-cpp-1.5.1
    $ cmake -G "Unix Makefiles"
    $ make -j3
    $ build/precompile file.input file.flatoutput

现在你可以生成一个头文件(仍然在虚拟机的终端窗口中):

python scripts/gen-cppcode.py --input=example.flat --output=example.hh

注意,即使你生成了 C++ 文件,你在 Windows 上仍然无法使用它进行构建(即使你有正确的依赖项包含到 avro-cpp-1.5.1/api)。Avro 依赖于 GNU 库(比如 sys/uio.h),我还不太确定怎么具体解决这些问题。

撰写回答