向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
可以看到交叉编译已经成功。