算法库之一:libhashish的交叉编译

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tanglinux

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值