基于vs2013编译avro源码

"Building Avro on Windows "

Posted by Tobyyi on August 1, 2017

如何编译avro


如果使用avro

什么是Apache Avro

  • Avro数据文件格式只是Avro项目的一部分,它是高效的数据序列化框架,是由Doug Cutting创立的Apache顶级项目,在Hadoop和它的生态系统得到广泛的支持。最大的特点就是在不牺牲性能的前提下提供兼容性,可在Java、C、C++、C#、Python、PHP和其他语言中读写数据。Avro也支持Remote Procedure Calls(RPC),可以用于构建定制网络协议,而且Flume使用它进行内部通信。

Avro源码

CMake编译

  • 配置依赖boost的某些库(filesystem system program_options iostreams)[可自行编译boost 参考如下的build.bat文件]
rem 创建者:toby20130333

rem @echo off

rem 先编译bjam 该bootstrap文件在boost源码根目录
start bootstrap.bat

rem 等待一分钟待bjam编译完成(如果电脑性能过差,可以设置等待时间更长一些)
SET SLEEP=ping 127.0.0.1 -n
%SLEEP% 60 > nul

rem 利用bjam编译boost库
rem 在此,我们编译vs2008和vs2010下的x86及x64共4类boost库文件

rem 建立库文件夹
rem vs2013 win32库文件夹
md stage\lib\win32\vs12_0\

rem vs2013 x64库文件夹
md stage\lib\x64\vs12_0\

rem vs2015 win32
md stage\lib\win32\vs14_0\

rem 需要zlib源码
set  ZLIB_SOURCE="D:/download/zlib1211/zlib-1.2.11"

rem ******************************************************************
rem 先删除lib下所有文件(不删除文件夹)
rem del stage\lib\*.* /Q

rem 编译vs2013 win32库文件
bjam --toolset=msvc-12.0 architecture=x86 --with-system --with-regex --with-iostreams --with-filesystem --with-program_options


rem 拷贝至\stage\lib\win32\vs9_0
copy stage\lib\*.* stage\lib\win32\vs12_0\*.* /Y
rem ##################################################################

rem ******************************************************************
rem 先删除lib下所有文件(不删除文件夹)
del stage\lib\*.* /Q


rem 编译vs2013 x64库文件
bjam --toolset=msvc-12.0 architecture=x86 address-model=64 --with-system --with-regex --with-iostreams --with-filesystem --with-program_options


rem 拷贝至\stage\lib\x64\vs9_0
copy stage\lib\*.* stage\lib\x64\vs12_0\*.* /Y
rem ##################################################################

rem ******************************************************************
rem 先删除lib下所有文件(不删除文件夹)
del stage\lib\*.* /Q

rem boost_1_49_0共有21个库需要编译使用,分别是chrono, date_time, exception, filesystem, graph, graph_parallel, iostreams, locale, math, 
rem mpi, program_options, python, random, regex, serialization, signals, system, test, thread, timer, wave。
rem 我仅选用了自己常用的几个做以上编译示例,其他使用者可以根据自己的需求选择编译。全部编译boost大概需要1个小时以上(视机器性能)
rem 全部编译boost的命令如下:bjam --toolset=msvc-9.0 --build-type=complete stage

  • 使用cmake-gui工具将avro源码进行预编译[cmake使用可自行参考]
  • 使用cmakelist修改41行的代码
add_definitions (
    -DBOOST_REGEX_LINK
    -DBOOST_FILESYSTEM_LINK
    -DBOOST_SYSTEM_LINK
    -DBOOST_IOSTREAMS_LINK
    -DBOOST_PROGRAM_OPTIONS_LINK
	-DBOOST_ZLIB_LINK
    -DBOOST_ALL_NO_LIB)
	
  • 生成vs2013解决方案

VS2013解决方案编译

  • 启动Avro-cpp.sln解决方案进行编译
  • 编译过程中出现错误的话 需要右键属性进行调整配置
  • 产生avrocpp.dll 和 avrogencpp.exe(用于解析模板生成头文件的)
  • avrogencpp.exe可根据json模板生成相对于的.hh文件
avrogencpp -i demo.json -o demo.hh -n BD
//设置环境变量 -n BD表示命名空间

编译配置图解

配置1 配置2 配置3

Qt集成

  • 将编译好的avrocpp.dll和头文件部署到相关项目目录下
win32:CONFIG(release, debug|release): 
LIBS += -L$$PWD/avro/lib/release/ -lavrocpp
else:win32:CONFIG(debug, debug|release): 
LIBS += -L$$PWD/avro/lib/debug/ -lavrocppd

INCLUDEPATH += $$PWD/avro/include
DEPENDPATH += $$PWD/avro/include

  • Qt测试demo可参考github
  • 注意该demo无boost的头文件请自行补充

贡献