最近在做Android增量升级,在编译bsdiff工具时遇到了下面的问题:
bsdiff.c:(.text.startup+0x2e4):对‘BZ2_bzWriteOpen’未定义的引用
bsdiff.c:(.text.startup+0xb29):对‘BZ2_bzWrite’未定义的引用
bsdiff.c:(.text.startup+0xcbb):对‘BZ2_bzWrite’未定义的引用
bsdiff.c:(.text.startup+0xe67):对‘BZ2_bzWrite’未定义的引用
bsdiff.c:(.text.startup+0xece):对‘BZ2_bzWriteClose’未定义的引用
bsdiff.c:(.text.startup+0xf32):对‘BZ2_bzWriteOpen’未定义的引用
bsdiff.c:(.text.startup+0xf5f):对‘BZ2_bzWrite’未定义的引用
bsdiff.c:(.text.startup+0xf99):对‘BZ2_bzWriteClose’未定义的引用
bsdiff.c:(.text.startup+0xffa):对‘BZ2_bzWriteOpen’未定义的引用
bsdiff.c:(.text.startup+0x1027):对‘BZ2_bzWrite’未定义的引用
bsdiff.c:(.text.startup+0x1061):对‘BZ2_bzWriteClose’未定义的引用
百度好久所有的文章结尾都是:
真TM扯淡,天下文章一大抄,没解决的问题也要抄一遍。。。我如果也停在这里会不会把读者气疯(手动滑稽)
从上面的错误可以看出是由于找不到BZ2_bzWriteOpen引起的和java中“cann't find object。。。”差不多;由此可以推测编译不通过,
是由于Makefile的问题造成的,说明其没有关联到bzip2的库文件(作为Linux菜鸟,关于Makefile文件的问题就先不研究了);所以,关键是关联bzip2。
从bzip2的Makefile文件中我们可以看出bzip2将库文件放在了/usr/local/lib目录下,执行文件在/usr/local/bin目录下,这样就简单了,
我们也仿照bzip将编译的bsdiff和bspatch放在/usr/local/bin目录下;这个路径需要root权限,这里先切换到root用户,然后分别执行下面两条命令即可:
gcc bsdiff.c -lbz2 -o /usr/local/bin/bsdiff
gcc bspatch.c -lbz2 -o /usr/local/bin/bspatch
到这里问题完美解决。当然还有更简单的办法,这里自己编译可以解决源和网络的问题(公司网络管理的比较严)。
更简单的使用bsdiff的办法:
http://blog.csdn.net/zouchengxufei/article/details/51700590
关于增量升级见鸿洋大神的blog:
http://blog.csdn.net/lmj623565791/article/details/52761658
关于拆分合并后的md5验证,鸿洋大神用的是mac自带的MD5工具,这里安利一个Windows下的MD5命令行查看工具,使用方法如下:
certutil -hashfile XXXX MD5
效果图: