如何在Windows平台下Build Avro C接口

来源:互联网 发布:linux 退出编辑模式 编辑:程序博客网 时间:2024/06/05 06:35

 最近有人问我,如何使用Cygwin,Mingw编译Avro的C接口。正好前一段时间一个项目要用到Avro的C接口,而且是在Windows平台。由于用Cygwin编译出来的dll,在windows上运行的时候需要cygwin.dll运行库的支持,而Mingw则是生成出来的二进制文件可以直接运行,只依赖于C的动态运行库(msvcrt.dll)。所以本文只介绍使用Mingw32编译出Windows平台下的Avro的C接口(Cygwin是类似的,只是前面的一些步骤不同而以)。 

首先Mingw32的安装,去sourceforge的网站下载,网址:http://sourceforge.net/projects/mingw/;按照提示安装就可以了。

Apache Avro Build Instructions

REQUIREMENTS

The following packages must be installed before Avro can be built:

 - Java: JDK 1.6
 - PHP: php5, phpunit, php5-gmp
 - Python: 2.5 or greater, python-setuptools for dist target
 - C: gcc, autoconf, automake, libtool, asciidoc, source-highlight
 - C++: cmake,g++, flex, bison, libboost-dev
 - Ruby: ruby 1.86 or greater, ruby-dev, gem, rake, echoe, yajl-ruby
 - Apache Ant 1.7
 - Apache Forrest 0.8 (for documentation)
 - md5sum, sha1sum, used by top-level dist target

以上是Build不同的Avro接口的要求,主要看下C接口的要求,一般Mingw安装好后,要求的包基本都安装好了,如果没安装相应的包,编译时会有提示。

安装好Mingw32和相应的包后,去apache的Avro的svn站点上把,Avro C的源代码下载下来,网址:http://svn.apache.org/viewvc/avro/trunk/lang/

将下载下来的Avro C的源代码,拷贝到home目录下,启动Mingw,切换到Avro C源代码的目录,执行编译命令 ./build.sh dist',这时会有编译出错,我记得好像是char型变量赋值给int 变量,修该代码(我改成强制转化就好了)重新执行编译命令 ./build.sh dist';这时会出现链接错误,我们先不用管它,等它编译完,会有一堆的链接错误提示。没有提示编译错误,说明没有编译问题,就所有的C文件都编译没出错,链接问题是编译器将.C文件生成的.O中间文件链接成二进制的dll文件是出的错误,这个错误困扰了我两天,后来看它的编译脚本时才知道,原来是官网上提供的编译Make脚本本身就有问题,没有链接libjansson库,导致链接时会出很多jansson函数找不链接的错误,本人也不怎么会写Make脚本,索性就用来个笨办法,自己手动将.O中间文件链接成二进制的dll文件。方法如下:

首先将如下的.o文件拷贝到同一个文件夹下(方法在Build目录下搜索*.o文件就能找到这些文件),其中有两个dump.o文件,我将其中一个该为dump1.o,文件名如下:

dump1.o hashtable.o load.o strbuffer.o utf.o value.o allocation.o datum_json.o datum_write.o resolver.o consumer.o datum_read.o dump.o schema.o datafile.o datum_size.o encoding_binary.o schema_equal.o datum.o datum_skip.o errors.o st.o datum_equal.o datum_validate.o io.o

将这些文件拷贝到了同一个文件夹下后,切换到该目录,执行如下命令:

gcc -shared dump1.o hashtable.o load.o strbuffer.o utf.o value.o allocation.o datum_json.o datum_write.o resolver.o consumer.o datum_read.o dump.o schema.o datafile.o datum_size.o encoding_binary.o schema_equal.o datum.o datum_skip.o errors.o st.o datum_equal.o datum_validate.o io.o -o libavro.dll

这样就生成了libavro.dll,Avro C在Windows下的接口了。

通过libavro.dll,使用lib命令就可以生成导出文件libavro.lib文件了,然后拷贝出Avro中的头文件就可以使用Avro了!

 

给懒人提供一个我已经编译好了的Avro C接口库:

 

原创粉丝点击