在Ubuntu14.04 64位系统上编译bsdiff的步骤如下:
- 安装libbz2库
sudo apt-get install libbz2-dev
tar -zxvf bsdiff-4.3.tar.gz
cd bsdiff-4.3
make
很不幸,编译不通过。
- 问题1:Makefile格式错误
~/code/bsdiff-4.3 make
Makefile:13: *** 遗漏分隔符 。 停止。
在第13行、第15行加上一个tab键即可。
- 问题2 符号未定义
~/code/bsdiff-4.3 make
cc -O3 -lbz2 bsdiff.c -o bsdiff
/tmp/ccnh97eO.o:在函数‘main’中:
bsdiff.c:(.text.startup+0x2aa):对‘BZ2_bzWriteOpen’未定义的引用
bsdiff.c:(.text.startup+0x9e9):对‘BZ2_bzWrite’未定义的引用
bsdiff.c:(.text.startup+0xb2c):对‘BZ2_bzWrite’未定义的引用
bsdiff.c:(.text.startup+0xc7b):对‘BZ2_bzWrite’未定义的引用
bsdiff.c:(.text.startup+0xccf):对‘BZ2_bzWriteClose’未定义的引用
bsdiff.c:(.text.startup+0xd22):对‘BZ2_bzWriteOpen’未定义的引用
bsdiff.c:(.text.startup+0xd4d):对‘BZ2_bzWrite’未定义的引用
bsdiff.c:(.text.startup+0xd73):对‘BZ2_bzWriteClose’未定义的引用
bsdiff.c:(.text.startup+0xdc6):对‘BZ2_bzWriteOpen’未定义的引用
bsdiff.c:(.text.startup+0xdf1):对‘BZ2_bzWrite’未定义的引用
bsdiff.c:(.text.startup+0xe17):对‘BZ2_bzWriteClose’未定义的引用
collect2: error: ld returned 1 exit status
make: *** [bsdiff] 错误 1
这个错误比较奇怪,明明libbz2已经安装了。
直接使用命令却编译正常通过,看起来好像编译命令出错了。
~/code/bsdiff-4.3 cc bsdiff.c -O3 -lbz2 -o bsdiff
~/code/bsdiff-4.3 file bsdiff
bsdiff: ELF 64-bit LSB executable,x86-64,version 1 (SYSV),dynamically linked (uses shared libs),for GNU/Linux 2.6.24,BuildID[sha1]=9f884237750343765972d648da742cad8196c861,not stripped
~/code/bsdiff-4.3
据此修改Makefile为:
CFLAGS += -O3 -lbz2
CC = gcc
PREFIX ?= /usr/local
INSTALL_PROGRAM ?= ${INSTALL} -c -s -m 555
INSTALL_MAN ?= ${INSTALL} -c -m 444
all: bsdiff bspatch
bsdiff: bsdiff.c
$(CC) bsdiff.c $(CFLAGS) -o bsdiff
bspatch: bspatch.c
$(CC) bspatch.c $(CFLAGS) -o bspatch
install:
${INSTALL_PROGRAM} bsdiff bspatch ${PREFIX}/bin
.ifndef WITHOUT_MAN
${INSTALL_MAN} bsdiff.1 bspatch.1 ${PREFIX}/man/man1
.endif
再次make,即可能编译通过。
~/code/bsdiff-4.3 make
gcc bsdiff.c -O3 -lbz2 -o bsdiff
gcc bspatch.c -O3 -lbz2 -o bspatch
~/code/bsdiff-4.3
另外,其实在Ubuntu上可以直接通过apt安装bsdiff/bspatch,就不用这么折腾了:
sudo apt-get install bsdiff