Qt中使用Protocol Buffers(一):使用Qt的MinGW+msys编译Protocol Buffers v2.6.1

来源:互联网 发布:怎么拷贝淘宝视频 编辑:程序博客网 时间:2024/06/06 03:25

        鉴于用了近一个月来研究QT中使用Protocol Buffers,先啰嗦地讲述一下这个坎坷的寻路过程,不想看的可以直接跳到下面的正文。又因为作为一枚纯小白,对一些简单的概念也会进行解释,可能有不正确的地方,希望看到的大神们能留言指正,谢谢~

        实习中的项目,使用QT来开发,需要用到Protocol Buffers来作为数据在网络中传输的格式,便开始了研究如何在Qt中使用Protocol Buffers。

       首先,什么是Protocol Buffers?

        Protocol Buffers是Google的一种数据交换格式,它独立于语言,独立于平台,可扩展,可以实现对数据的序列化和反序列化(序列化:将对象转换为一种通用结构,反序列化:将通用结果转换为对象)。

        想要在Qt中使用Protocol Buffers,必须有它相应的库文件和头文件,要获得它相应的库文件和头文件方法有两个,我从知乎上的一篇文章中看到这两个方法(https://www.zhihu.com/question/20987397)。

        在Qt中使用Protobuf的两个方法分别是:

       1、用Qt构建一个类工程库,把Protobuf的源码放进去,用qmake编译,这样可以形成可用的库,但中途苦难重重,各种报错,不建议(一看大神这样说,我果断放弃了这种方法)。

       2、用Cygwin或者MinGW+msys编译Protobuf库,用Cygwin编译最容易也最简单,因为需要的库和头文件都可以自行安装,而MinGW+msys的libtools的更新速度赶不上Protobuf的更新速度,有时候缺少头文件,编译会失败(看到这个方法时,我既不知道Cygwin是什么,也不知道MinGW+msys是什么,但是看到有可行的方法时已经很是开心,便啥也不管的开始找源码编译去了)。

       通过百度才知道源码一般都可以从GitHub中下载,GitHub一个纯英文的网站,看到就头痛,但是搜索别人的中文博客又不能纯然理解,只能硬着头皮看下去,其实GitHub给的相关文档很是齐全,很给力,奈何自己水平太低,走了很多弯路。附上Protobuf在GitHub中的地址:https://github.com/google/protobuf/

       拉到网页下方的Protocol Compiler Installation,这个里面的C++ Installation Insturctions提供了安装的方法,http://github.com/google/protobuf/releases提供了Protobut的下载地址(我一直下载的是最新版本v3.2.0,一直编译不成功,然而项目里用的其实是v2.6.1版本,最后没辙选了v2.6.1版本的源码使用Cygwin编译居然成功了!新版本编译一直报错readlink was not declared in this scope,也没找到解决办法)。

       然后就follow着C++ Installation Insturctions开始编译,开始就绕了个大弯。

       C++ Installation分为Unix和Windows,我想着自己的电脑操作系统是Windows就直接忽略Unix,开始看Windows版编译。指南中写道:想要用Microsoft Visual C++编译,看cmake/READE.md,想要用Cygwin或MinGW,follow Unix Installation。当时我并不知道Qt所需要的动态库和静态库文件是.so和.a为后缀的,以为dll和lib就能解决问题,便直奔用Mircosoft Visual C++编译,下载cmake去编译了,生成文件之后在Qt中不能使用才幡然醒悟,在cmake上花的时间也不少,因为在这里没啥用处也不阐述。

       知道自己方向走错后便去搜索如何获得Qt需要的库文件,便发现需要用Cygwin或MinGW编译才行,我便又鬼使神差的选择了MinGW,又是一番捯饬,还下载了msys,才勉强可以开始编译,但是一直有错,最终还是回归到了正途,去研究用Cygwin来编译。

       然鹅,然鹅,当我成功用Cygwin编译了Protobuf后,将生成的库文件放在Qt中使用,却会编译报错,我用别人的库文件却能成功运行,如此,才发现我用Cygwin生成的库文件在Qt中也是不成的,最后想出用Qt的MinGW+msys来编译Protocol Buffers。

      现在开始正文,使用Qt的MinGW + msys 编译Protobuf-2.6.1(最新版本的编译报错)

      准备工作:

      1、Qt 4.7.4和Qt Creator 2.4.1:

            a、下载:在官网上下载,需要注册登录一波,什么版本都有,很全。

                  qt-creator-win-opensource-2.4.1:http://download.csdn.net/download/ningmengaiyu/4346076,CSDN上的资源。

                  qt-win-opensource-4.7.4-mingw:http://download.qt.io/archive/qt/4.7/,没找到别的资源,就提供官网的地址。

            b、安装:百度有教程:http://jingyan.baidu.com/article/59a015e3400267f7948865e8.html,4.7.1和4.7.4安装差别不大,我安装的目录D:\Qt。

            c、配置环境变量:添加3个:D:\Qt\4.7.4\bin;  D:\Qt\qtcreator-2.4.1\bin;  D:\Qt\qtcreator-2.4.1\mingw\bin;

            d、查看gcc安装结果:在cmd命令里输入gcc -v检查gcc安装版本,成功即如下图:

            

      2、msys:下载和安装msys可以看这篇博文:http://blog.csdn.net/yangyangyang20092010/article/details/46350519    

      3、Protocol Buffers:http://github.com/google/protobuf/releases在网址中找到v2.6.1版本下载

      开始编译:

     1、Follow上文说的C++ Installation - Unix开始编译,地址:https://github.com/google/protobuf/blob/master/src/README.md

            

            因为已经下载了源码,可以直接从这里开始

            

      2、 在D:\MinGW\msys\1.0中找到下载完成的msys.bat,打开:

            

            进入下载好的Protocol Buffers的目录:

            

      3、开始配置,输入./configure:

           

      4、开始编译,输入make:

            make的时候出现一个bug,说在d:/qt/qtcreator-2.4.1/mingw/lib/gcc/mingw32/4.4.0中,没有libstdc++.dll.a,我找进去,发现确实没有这个文件,只有libstdc++.a,上网查了下,将libstdc++.a改名成libstdc++.dll.a,再次make,成功。

      5、make check:

            安装指南里面也写了如果make check失败了依然可以install,但是一些库可能不能正常使用:        

      6、make install

      至此,编译Protocol Buffers v2.6.1成功。

      其实Cygwin和MinGW+msys的编译过程是完全一样的,只是会遇到不同的问题需要解决,需要大家稍稍能看懂error的内容,才好去查找解决办法。

      查看生成文件:

      1、在目录D:\ProtocolBuffers\protobuf-2.6.1\src\.libs下查看生成的.a文件


     2、在目录D:\MinGW\msys\1.0\local\include\google\protobuf下查看所有需要的头文件            


       至此,使用Cygwin编译Protocol Buffers v2.6.1全部完成,经试验得,生成的库文件和头文件均可在Qt Creator 2.4.1中使用,具体的使用方法请见下一篇博文。

0 0
原创粉丝点击