如何用Apache Avro生成C++头文件(Python脚本)
我想用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 个回答
我发现运行 gen-cppcode.py 这个文件需要Python 2 版本。
你可以在这里下载:https://www.python.org/downloads/
我找到的唯一方法是:
- 下载 VirtualBox。
- 安装 Ubuntu(或者其他的操作系统)。
- 下载 Avro。
- 安装 cmake。
- 安装 C++ 编译器(基本构建工具)。
- 安装 boost、flex、bison(可以用命令 sudo apt-get install boost flex bison);顺便说一下,你特别需要这些 boost 库:
-- regex(正则表达式)
-- filesystem(文件系统)
-- system(系统)
-- program_options(程序选项) 构建 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),我还不太确定怎么具体解决这些问题。