如何向openwrt mtk7628n中移植高版本第三方工具库

        向openwrt中移植高版本的第三方软件包遇到的问题很多,我这里以向mtk7628n中移植lighttpd-1.4.49为实例,向大家介绍如何向openwrt中移植高版本的第三方软件。

步骤一,找到lighttpd编译所需第三方库。

①下载lighttpd

          https://download.csdn.net/download/caofengtao1314/10560484 

         文档中的README描写了如何在ubuntu中编译lighttpd,配置完成以后直接执行./build.sh就可以完成安装了。

②查看在ubuntu中编译的lighttpd所需要的动态库

          进入在ubuntu中编译的lighttpd路径,自己的工作目录/http_server/sbin

          执行readelf -a lighttpd 找到输出如下信息

         

 可以看到编译lighttpd所需的第三方库为libpcre.so.3 libdl.so.2 libcrypto.so.1.0.0 libc.so.6

还有一种方法可以直接读取应用程序所需要的动态库

readelf -d lighttpd

步骤二,如何在mtk7628n中编译高版本的lighttpd-1.4.49。

① 从下载的源码包中找到lighttpd-1.4.49.tar.gz,解压到自己的工作目录如mywork中

    

②进入mywork执行如下命令

   

  

  可以查看到编译lighttpd的选项

  如

   

  

③ configure 配置方法和编译方法

    ./configure --host=《交叉编译工具链如mipsel-openwrt-linux》 LDFLAGS="《所需mtk7628nn动态库的路径》" CPPFLAGS="《所需mtk7628nn动态库的头文件路径》" --libdir=$《lighttpd运行时所需库的运行路径》--disable-FEATURE --enable-shared --disable-static --disable-lfs --disable-ipv6 --without-PACKAGE --without-valgrind --without-kerberos5 --without-zlib --without-bzip2 --without-lua --with-wstunnel --with-openssl --with-openssl-libs="《openssl所需的动态库路径》" --with-openssl-includes="《openssl所所需的动态库的头文件路径》"
make dist clean
make
make DESTDIR="《lighttpd的安装路径》" install   

如果库,库的头文件,交叉编译工具链配置的没有问题,基本上这个编译就结束了,但是实际上并没有那么顺利,需要遇到很多坑,才能解决这些问题。

编译好的下载地址

https://download.csdn.net/download/caofengtao1314/10728875

步骤三,遇到的问题    

① checking for BIO_f_base64 in -lcrypto... no

具体报错如下:

尼玛!这个时候心中有一万个羊驼奔袭而过,这什么鬼啊?我的动态库和库的头文件都没有问题,怎么就会报这样的错呢?

突然从lighttpd-1.4.49中发现了一个文件叫做

打开config.log以后,查看到如下错误日志

通过读取自己mtk7628n路径的动态库,

readelf -a libcrypto.so.1.0.0 |grep BIO_f_base64

查看到动态中是有这个函数BIO_f_base64的那到底是哪里出错了呢,于是考虑自己写一个简单的程序测试一下这个函数到底是哪里出问题了。

从config.log中拷贝出代码

| char BIO_f_base64 ();
| int
| main ()
| {
| return BIO_f_base64 ();
|   ;
|   return 0;
| }
修改为 BIObase64test.c

 mipsel-openwrt-linux-gcc -o BIObase64test BIObase64test.c -L动态库路径 -I动态库头文件路径 -lcrypto

报错如下

说明是dl出问题了。

修改编译方法如下

 mipsel-openwrt-linux-gcc -o BIObase64test BIObase64test.c -L动态库路径 -I动态库头文件路径 -lcrypto -ldl

编译通过,嘎嘎,原来是没有引入dl库导致的。

②在编译选项中添加了-ldl以后,还是报错如下

my lady gaga 又出了一个不知道什么鬼的错误?

由于我使用的是脚本 

在配置configure的时候仍然使用脚本

在展开这个变量的时候,LDFLAGS变成了-L{动态库路径} -ldl 而LDFLAGS的实际值为-L{动态库路径}并没有引入-ldl需要修改如下,加上双引号。

 

③array.h:6:19: fatal error: pcre.h: No such file or directory

报错如下

进入动态库头文件路径查看有没有pcre.h

ls -al|grep pcre

没有查看到pcre库头文件,再进入openwrt平台 执行make menuconfig

搜索pcre发现结果如下

说明平台没有编译pcre库。

没有编译pcre库的解决方法有两种

第一种:直接通过make menuconfig 选中pcre 库

然后执行保存以后,然后执行make V=s 就可以变出pcre动态库和头文件了。

第二种方法:由于已经移植上瘾,开始觉得自己编译pcre库更快一些,想要尝试如何自己手动编译pcre库了。

进入package$ find ./ -name pcre

./feeds/packages/pcre

打开vi feeds/packages/pcre/Makefile

查看版本为pcre-8.35.tar.bz2 md5sum为6aacb23986adccd9b3bc626c00979958

下载pcre-8.35.tar.bz2,解压pcre-8.3.35.tar.bz2

tar jxf pcre-8.35.tar.bz2

进入cd pcre-8.35/目录中,执行./configure -h 查看到如下内容

再次进入./package/ 执行vi feeds/packages/pcre/Makefile

查看到如下configure编译选项

由于不需要cpp所以选择 --disable-cpp

于是进入pcre-3.35目录中执行configure 配置如下

 ./configure --host=(交叉编译工具链mipsel-openwrt-linux) --prefix=自己的工作目录/result --disable-cpp --enable-utf8 --enable-unicode-properties

make 

make install

会在自己的工作目录result中找到pcre编译的动态库,嘎嘎,交叉编译pcre完成。

此时将pcre动态库路径和pcre动态库头文件路径,引入到编译lighttpd的build.sh脚本中,应该就可编译通过了。

ROUTER_LIB_PATH="-L${自己的平台动态库目录} -ldl -L自己的工作目录/pcre-8.35/result/lib"
ROUTER_LIB_INCLUDE="-I${自己的平台动态库头文件目录} -I自己的工作目录/pcre-8.35/result/include"

再次执行./build.sh 完美编译通过

查看自己编译的结果

file lighttpd
lighttpd: ELF 32-bit LSB executable, MIPS, MIPS32 rel2 version 1, dynamically linked (uses shared libs), with unknown capability 0xf41 = 0x756e6700, with unknown capability 0x70100 = 0x3040000, not stripped

可以看到交叉编译已经成功。

正常可以在mtk7628n openwrt环境中运行的lighttpd-1.4.49,下载路径为

https://download.csdn.net/download/caofengtao1314/10731484

参考:http://www.forgotfun.org/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值