开发平台: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选项