本章总结一下Plugins gif的编译,刚开始编译时,错误如下:
这种问题一般是lib引起的问题,打开Plugins gif的链接器的附加依赖项,发现Cmake生成时,把3rdParty\lib\giflib.lib作为依赖项,分析一下,应该是giflib.lib版本有问题,用dumpbin看了一下,版本是X86版本,而我们的编译环境是X64。问题应该是版本引起的。
那么问题解决方法就变为查找giflib.lib的64位版本,网上查找了半天,没有找到giflib.lib的64位版本。没办法只好找giflib的源代码自己编译了。Giflib版本有不少,那么osg使用的是那个版本呢?首先打开3rdParty\include\gif_lib.h,如图所示,原来osg用到是giflib的4.1版本。网上百度了一下,找到一个网址:http://sourceforge.net/projects/giflib/,打开,如图所示,点击Download下面的BrowseAll Files,进入下一网页,再点击giflib-4.x,进入giflib的4.1版本界面,如图所示,发现4.1版有多个,都下载下来再说。
下载完成后解压,比较各版本\lib\gif_lib.h和3rdParty\include\gif_lib.h的头文件(推荐使用Beyond Compare 软件进行比较),发现4.1.6版本\lib\gif_lib.h和3rdParty\include\gif_lib.h一模一样,现在终于搞清楚了osg3.2.1使用的是giflib的4.1.6版本。注意:一定要版本对应,否者后续很容易出现链接错误。
分析giflib4.1.6的源代码,发现是个linux环境下的工程,使用VS不能直接打开,目录下有个lib目录,里面的文件应该是用来编译giflib的链接库的。本人对于linux不熟悉,没办法,又要手动解决这个问题,在vs2010里新建一个空工程,名称为giflib,类型为静态链接库,将lib目录下的h和c文件添加到项目中,编译运行,报错一大堆,经分析,原来是有些预编译项没有定义,导致有些该编译的代码在预编译阶段被舍弃。试来试去,找到解决方法:在dgif_lib.c中,添加如下定义:#define HAVE_IO_H 0 ;#defineHAVE_FCNTL_H 1。
其中HAVE_IO_H的定义,使得#include<io.h>得到执行。
HAVE_FCNTL_H 的定义,使得#include <fcntl.h>得到执行
再编译,程序编译通过,分别在debug和realease进行编译得到相应的链接库giflibd.lib和giflib.lib,用这两个链接库覆盖3rdParty\lib\giflib.lib和giflibd.Lib
然后再对Plug gif进行编译,编译通过。选用gif图片作为纹理贴图,能够正常加载。
Giflib.lib下载地址:http://download.csdn.net/detail/nuaaqsm0915/7709597
osgdb_gif.dll下载地址:http://download.csdn.net/detail/nuaaqsm0915/7709629