开发平台:Ubuntu11.04
编 译器:arm-gcc-4.1.1.tar.bz2 (可从http://download.csdn.net/detail/npy_lp/3821111上下载);gcc version 4.5.2(Ubuntu/Linaro 4.5.2-8ubuntu4)
libhashish源码包:libhashish.tar.gz (可从http://sourceforge.net/projects/libhashish/上下载)
Libhashish是一种非常强大的散列表(也称哈希表)算法的实现库(官网http://libhashish.sourceforge.net/),遵守GNU GPL协议。
不过,它的配置文件configure对指定编译器和安装目录的支持非常不够。
1、在X86上的编译和安装
编译适用于X86平台的libhashish库大概需要经历以下各步:
$ tar zvxf libhashish.tar.gz
$ cd libhashish/
$ ./configure
$ make
使用gcc version4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4)编译时,会出现以下错误:
hash_func_cube.o: In function `lhi_hash_cube':
hash_func_cube.c:(.text+0x67f): undefined reference to `__stack_chk_fail_local'
hash_func_sha1.o: In function `sha1_finish':
hash_func_sha1.c:(.text+0x1e38): undefined reference to `__stack_chk_fail_local'
hash_func_sha1.o: In function `sha1':
hash_func_sha1.c:(.text+0x1ee4): undefined reference to `__stack_chk_fail_local'
hash_func_skein256.o: In function `Skein_256_Init':
hash_func_skein256.c:(.text+0x2893): undefined reference to `__stack_chk_fail_local'
hash_func_skein256.o: In function `Skein_256_InitExt':
hash_func_skein256.c:(.text+0x2a77): undefined reference to `__stack_chk_fail_local'
hash_func_skein256.o:hash_func_skein256.c:(.text+0x2fb8): more undefined references to `__stack_chk_fail_local' follow
make[1]: *** [libhashish.so] Error 1
make[1]: Leaving directory `/home/richard/algorithm/libhashish/lib'
### Entering localhash
/bin/sh: line 1: cd: localhash: No such file or directory
### Entering tests
/bin/sh: line 1: cd: tests: No such file or directory
### Entering analysis
/bin/sh: line 1: cd: analysis: No such file or directory
### Entering doc
/bin/sh: line 1: cd: doc: No such file or directory
### Entering man
/bin/sh: line 1: cd: man: No such file or directory
make: *** [all] Error 1
在lib/Makefile的第19行给gcc增加一个-fno-stack-protector选项即可解决。
$ vi lib/Makefile
CFLAGS += -fPIC -fno-stack-protector
$ make clean
$ make
安装时,把lib目录下编译生成的静态库、动态库以及静态库的链接文件都拷贝到Ubuntu系统的/usr/lib目录下:
$ sudo cp -a lib/libhashish* /usr/lib
$ sudo ln -sf /usr/lib/libhashish.so /usr/lib/libhashish.so.0 //创建动态库的链接文件libhashish.so.0
也可以把头文件libhashish.h拷贝到Ubuntu系统的/usr/include目录下:
$ sudo cp include/libhashish.h /usr/include/
借用官网上的示例程序测试一下安装好的库:
$ cat test.c //修改了官网上示例程序的错误
/* gcc -pipe -Os -Wall -W test.c -lm -lhashish -o test */
#include <libhashish.h>
int main(void)
{
hi_handle_t *hi_handle;
const char *key = "23";
const char *data = "data element";
const char *data_ptr;
/* initialize hashish handle */
hi_init_str(&hi_handle, 23);
/* insert an key/data pair */
hi_insert_str(hi_handle, key, data);
/* search for a pair with a string key and store result */
hi_get_str(hi_handle, key, (void **)&data_ptr);
fprintf(stdout, "Key: %s Data: %s\n", key, data_ptr);
/* free the hashish handle */
hi_fini(hi_handle);
return 0;
}
$ gcc -pipe -Os -Wall -W test.c -lm -lhashish -o test //动态编译,静态编译加-static选项
$ ./test //执行
Key: 23 Data: data element //输出结果
2、交叉编译适用于ARM平台的libhashish库
解压、配置:
$ tar zvxf libhashish.tar.gz
$ cd libhashish/
$ ./configure
修改配置所生成的Make.Rules文件,然后编译:
$ vi Make.Rules
CC=/usr/bin/gcc 修改成:CC=arm-linux-gnu-gcc
AR=/usr/bin/ar 修改成:AR=arm-linux-gnu-ar
LD=/usr/bin/ld 修改成:LD=arm-linux-gnu-ld
RANLIB=/usr/bin/ranlib 修改成:RANLIB=arm-linux-gnu-ranlib
$ make
拷贝库和头文件到交叉编译器(这里的交叉编译器存放在$HOME目录):
$ cp -a lib/libhashish* $HOME/4.1.1/arm-linux-gnu/lib
$ cp include/libhashish.h $HOME/4.1.1/arm-linux-gnu/include
$ cd $HOME/4.1.1/arm-linux-gnu/lib
$ ln -sf libhashish.so libhashish.so.0 //创建动态库的链接文件libhashish.so.0
交叉编译示例代码:
$ arm-linux-gnu-gcc -pipe -Os -Wall -W test.c -lm -lhashish -lgcc_s -o test //动态编译需要加-lgcc_s选项
$ arm-linux-gnu-gcc -static -pipe -Os -Wall -W test.c -lm -lhashish -o test //静态编译加-static选项