Ubuntu16(32bit)环境下交叉编译PCRE库
写在前面:在ubuntu下基于QEMU进行固件仿真时,遇到了 can't load library 'libpcre.so.1' 的问题,网上查找相关资料,应该是需要安装一个PCRE库就可以得到这个文件,但是要注意,这个文件是要用在32位的ARM架构的固件下的,所以需要交叉编译。两个注意的点:32bit,ARM。好的,接下来就是如何解决这个问题的过程。
1. 搭建arm-linux交叉编译环境
这里补充两个链接,arm-none-linux-gnueabi- 环境搭建,Ubuntu下安装arm-linux-gnueabi-xxx编译器。前者包含一些Linux解压版、Linux安装版、Windows解压版、Windows安装版等arm-none-linux-gnueabi-gcc的百度网盘下载链接;后者介绍了两种安装arm-linux-gnueabi-xxx的方法,总结来说就是以下两种:
① 在Ubuntu系统是最新的前提条件下,使用apt-get命令即可;
sudo apt-get install gcc-arm-linux-gnueabi //安装
arm-linux-gnueabi-gcc -v //检查是否安装成功
② 提供arm工具链官网:https://launchpad.net/gcc-arm-embedded,可以下载需要的版本,下载完成后,依照下面的步骤,即可完成安装。
>>>>>>>>>>>>>>
首先搭建交叉编译环境,使用4.4.3版本,参考链接:https://www.cnblogs.com/Dana-gx/p/10202658.html【包含arm-linux下载链接】
在/usr/local路径下新建文件夹arm-linux-gcc(mkdir命令),将下载得到的文件arm-linux-gcc-4.4.3.tar.gz复制到该路径下,并解压缩:
1 sudo mkdir arm-linux-gcc 2 sudo chmod 777 arm-linux-gcc 3 cd arm-linux-gcc 4 sudo cp arm-linux-gcc-4.4.3.tar.gz路径 ./ 5 sudo tar -zxvf arm-linux-gcc-4.4.3.tar.gz
交叉编译链路径/usr/local/arm-linux-gcc/opt/FriendlyARM/toolschain/4.4.3
修改环境变量,将arm-linux-gcc添加到PATH中。推荐以下方式:
修改/etc/bash.bashrc文件:
1 sudo -s 2 sudo gedit /etc/bash.bashrc 3 在最后加上export PATH=$PATH:/usr/local/arm-linux-gcc/opt/FriendlyARM/toolschain/4.4.3/bin 4 保存,退出; 5 source /root/.bashrc //刷新环境变量使其生效 6 echo $PATH //输出环境变量,如果显示arm-linux-gcc的路径,则环境变量添加成功 7 arm-linux-gcc -v //检查arm-linux-gcc是否安装正确
-v命令正常输出如下:
其中,
1 --build=i386-build_redhat-linux-gnu 2 --host=i386-build_redhat-linux-gnu 3 --target=arm-none-linux-gnueabi 4 --prefix=/opt/FriendlyARM/toolschain/4.4.3
--build选项表示当前ubuntu系统的架构类型,使用arm-linux-gcc进行交叉编译时,需要指定--host/--target选项为arm-none-linux-gnueabi,表示目标架构为ARM。
2. 下载安装PCRE库
在/usr/local/src路径下:
1 //下载pcre-8.44 2 sudo wget https://netix.dl.sourceforge.net/project/pcre/pcre/8.44/pcre-8.44.tar.gz 3 //解压缩 4 sudo tar -zxvf pcre-8.44.tar.gz 5 //进入源码目录 6 cd pcre-8.44 7 //编译安装pcre 8 sudo ./configure --build=i386-build_redhat-linux-gnu --host=arm-none-linux-gnueabi --target=arm-none-linux-gnueabi --prefix=/usr/local/src/libpcre CC=/usr/local/arm-linux-gcc/opt/FriendlyARM/toolschain/4.4.3/bin/arm-none-linux-gnueabi-gcc 9 sudo make 10 sudo make install
./configure命令中,--prefix选项表示pcre的安装位置,也就是说,最后我们要去这个路径下找需要的libpcre.so.1文件;CC选项指定编译器,最好加上arm-linux-gcc的完整路径,否则可能会出现can't find错误。【如果在make或者make install时出现了CXXLD错误,那么在./configure时,可以再加上CXX选项,如下所示】
1 CXX=/usr/local/arm-linux-gcc/opt/FriendlyARM/toolschain/4.4.3/bin/arm-none-linux-gnueabi-c++
如果在make时报错:aclocal-1.16 is missing,那么见3中的解决方法。
3. 遇到问题“aclocal-1.16 is missing”
该问题需要安装automake-1.16(注意版本对应)。在/usr/local/src路径下:
1 //下载安装包 2 sudo wget https://ftp.gnu.org/gnu/automake/automake-1.16.tar.gz 3 //解压 4 sudo tar -xzvf automake-1.16.tar.gz 5 cd automake-1.16 6 //编译安装 7 sudo ./configure --build=i386-build_redhat-linux-gnu --host=arm-none-linux-gnueabi --target=arm-none-linux-gnueabi CC=/usr/local/arm-linux-gcc/opt/FriendlyARM/toolschain/4.4.3/bin/arm-none-linux-gnueabi-gcc 8 sudo make 9 sudo make install
注意,automake也需要进行交叉编译,保持架构一致。无需指定--prefix选项,安装位置默认即可。
在执行./configure时报错: error: Autoconf 2.65 or better is required. 解决办法见4。
4. 遇到问题“缺少autoconf-2.65”
毫无疑问,现在需要安装autoconf-2.65。在/usr/local/src路径下:
1 //下载安装包 2 sudo wget http://ftpmirror.gnu.org/autoconf/autoconf-2.65.tar.gz 3 //解压 4 sudo tar -xzvf autoconf-2.65.tar.gz 5 cd autoconf-2.65 6 //编译安装 7 sudo ./configure --build=i386-build_redhat-linux-gnu --host=arm-none-linux-gnueabi --target=arm-none-linux-gnueabi CC=/usr/local/arm-linux-gcc/opt/FriendlyARM/toolschain/4.4.3/bin/arm-none-linux-gnueabi-gcc 8 sudo make 9 sudo make install
在执行./configure时报错,error: no acceptable m4 could be found. 解决办法见5。
5. 遇到问题“缺少m4”
现在需要安装m4,安装版本在报错时会给出提示,这里安装m4-1.4.13版本。在/usr/local/src路径下:
1 //下载安装包 2 sudo wget http://ftp.gnu.org/gnu/m4/m4-1.4.13.tar.gz 3 //解压 4 sudo tar -xzvf m4-1.4.13.tar.gz 5 cd m4-1.4.13 6 //编译安装 7 sudo ./configure --build=i386-build_redhat-linux-gnu --host=arm-none-linux-gnueabi --target=arm-none-linux-gnueabi CC=/usr/local/arm-linux-gcc/opt/FriendlyARM/toolschain/4.4.3/bin/arm-none-linux-gnueabi-gcc 8 sudo make 9 sudo make install
m4安装完毕之后,再继续./configure、make、make install剩下的autoconf-2.65和automake-1.16,最后将PCRE库安装完成。在/libpcre/lib文件夹中,可找到需要的libpcre.so.1文件。
通过file命令可知libpcre.so.1文件是一个链接文件,源文件为libpcre.so.1.2.12。
readelf -h命令查看libpcre.so.1.2.12文件:
目标文件32bit,架构为ARM。
最后将以上两个文件一起复制到固件文件系统的lib文件夹下,可使用cp -a命令。
参考链接:
https://www.iteye.com/blog/chenzhou123520-1817563
https://cloud.tencent.com/developer/article/1430415