mips使用buildroot,交叉静态编译file程序出现ld: cannot find -lz错误解决过程

最近用unbutu (X64 版本16.04) 使用buildroot (版本2020.2)交叉编译一个mips的目标机,因为目标机没有支持库所以很多程序使用静态编译。

这次的主角是file这个程序,运行该程序能知道各类文件的类型及追踪需要的支持库(file使用方法自行百X)

参考文章 file命令移植到ARM中详解

第一次编译buildroot 没有加入c++支持,在静态file这个程序过译中非常顺利在src目录中修改Makefile文件中的CFLAGS 加入 -static就可以了,如下

CFLAGS = -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64  -Os  -static 

因为其它软件需要c++,所以重新编译了下buildroot加入c++,再次静态编译file程序时提示信息如下:

…/mips-buildroot-linux-uclibc/bin/ld: cannot find -lz
collect2: error: ld returned 1 exit status

尝试排错,因为第一次静态编译很顺利,所以怀疑makefile的问题,修改了多次,也无效,只有百X了
参考如下文章:
/usr/bin/ld: cannot find -lz
android编译错误–/usr/bin/ld: cannot find -lz
aarch64-linux-gnu/bin/ld: cannot find -lz collect2: error: ld returned 1 exit status解决方案
cannot find crt1.o:错误解决方案
ARM交叉编译错误 cannot find crt1.o:错误解决方案
Android 源码编译错误:/usr/bin/ld: cannot find -lz

网文小结:
1、上述网中有提到 缺少支持库
lib32z1-dev
zlib1g-dev
我的unbutu已经安装了这些支持库,如果你没有安装那就先安装下

sudo apt-get install zlib1g-dev lib32z1-dev

2、环境变量设置,有下面2个变量
LD_LIBRARY_PATH
LD_LIBRARY
尝试在编译前加入库路径,如下:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库文件的路径
export LD_LIBRARY=$LD_LIBRARY:库文件路径

但也没有解决问题(最后还是库的路径没有设置对)

在-”ARM交叉编译错误 cannot find crt1.o:错误解决方案“ -网文中提到了
使用命令

mips-linux-gcc -v

可以知道gcc文件的各种路径及配置,我这个命令显示如下:

使用内建 specs。
COLLECT_GCC=/media/admin1/temp/toolchain/buildroot_2020.2_chaintool_gcc5_2020.5.16_build_no_c++/bin/mips-linux-gcc.br_real
COLLECT_LTO_WRAPPER=/media/admin1/temp/toolchain/buildroot_2020.2_chaintool_gcc5_2020.5.16_build_no_c++/bin/…/libexec/gcc/mips-buildroot-linux-uclibc/5.5.0/lto-wrapper
目标:mips-buildroot-linux-uclibc 配置为:./configure
–prefix=/media/admin1/temp/toolchain/buildroot-2020.02.2/output/host
–sysconfdir=/media/admin1/temp/toolchain/buildroot-2020.02.2/output/host/etc
–enable-static
–target=mips-buildroot-linux-uclibc
–with-sysroot=/media/admin1/temp/toolchain/buildroot-2020.02.2/output/host/mips-buildroot-linux-uclibc/sysroot
–enable-__cxa_atexit
–with-gnu-ld
–disable-libssp
–disable-multilib
–disable-decimal-float
–with-gmp=/media/admin1/temp/toolchain/buildroot-2020.02.2/output/host
–with-mpc=/media/admin1/temp/toolchain/buildroot-2020.02.2/output/host
–with-mpfr=/media/admin1/temp/toolchain/buildroot-2020.02.2/output/host
–with-pkgversion=‘Buildroot 2020.02.2’
–with-bugurl=http://bugs.buildroot.net/
–disable-libquadmath
–disable-libsanitizer
–enable-tls --enable-threads
–without-isl
–without-cloog
–with-float=soft
–with-arch=mips32
–with-abi=32
–with-nan=legacy
–enable-languages=c
–with-build-time-tools=/media/admin1/temp/toolchain/buildroot-2020.02.2/output/host/mips-buildroot-linux-uclibc/bin
–enable-shared
–disable-libgomp
线程模型:posix gcc 版本 5.5.0 (Buildroot 2020.02.2)

可以看见上面的参数
COLLECT_GCC=/media/admin1/temp/toolchain/buildroot_2020.2_chaintool_gcc5_2020.5.16_build_no_c++/bin/

–prefix=/media/admin1/temp/toolchain/buildroot-2020.02.2/output/host

题外话:这两个参数指向的目录有很大差异,这是因为我第一次编译后将这个buildroot编译好的toolchain移动到其它位置了,而这个buildroot在编译后还是将原始编译的目录记忆下来了,这个大家要注意在编译完buildroot后为避免麻烦尽量不要改变目录。

在网文-”aarch64-linux-gnu/bin/ld: cannot find -lz collect2: error: ld returned 1 exit status解决方案“ -中提到了libz这个库。

考虑到这个libz这个库是给交叉编译工具用的,所以不能安装在unbutu的系统中
(我也在unbutu的/usr/lib32 目录中找到 libz.a libz.so libz.so.1 libz.so.1.x.xx等文件)。

需要在交叉编译工具的输出目录中找,我在output/host/lib 目录中找到了libz.a 等文件,按理说没有问题的。

再次编译,信息如下:
”…/mips-buildroot-linux-uclibc/bin/ld“ 而不是…/bin/mips-buildroot-linux-uclibc-ld
这个文件,奇了怪了。比较了下这两个文件,这两个文件是相同的,只是名字不同而已。

把output/host/lib 的libz.a 等文件拷贝到output/host/mips-buildroot-linux-uclibc/lib 目录下,重新编译还是出错,如下:

…/mips-buildroot-linux-uclibc/lib/libz.a when searching for -lz
/media/admin1/temp/toolchain/buildroot-2020.02.2/output/host/lib/gcc/mips-buildroot-linux-uclibc/5.5.0/…/…/…/…/mips-buildroot-linux-uclibc/bin/ld: cannot find -lz
collect2: error: ld returned 1 exit status

注意出错信息 …/mips-buildroot-linux-uclibc/lib/libz.a when searching for
-lz

说明思路对了但拷贝过去的libz.a 等文件还是有点问题。

继续找吧…
在交叉编译的output/build/libzlib-1.2.11 目录下也找到(libz.a 等文件)
将这些文件拷贝到…/mips-buildroot-linux-uclibc/lib/ 的目录下然后再make
好嘛这次就编译通过了。

解决过程较费时间,花了不少精力,文章写的有点罗嗦,将就看吧!

总结:
1、奇怪现象:
(1)第一次静态编译就改了下src/makefile就通过了,第二次静态编译死活过不去。
(2)在make的时候怎么调用…/mips-buildroot-linux-uclibc/bin/ld 这个文件而不是调用bin/mips-buildroot-linux-uclibc-ld 这个文件(虽然这两个文件是相同的,但是使用库支持文件的目录是不相同的)
(3) 还有一点我手动用交叉工具编译过file程序,静态编译下,用手动的交叉工具编译文件大小有900KB,而用buildroot自动编译生成的文件才400多KB。

	a手动前需要将交叉编译的目录加入到环境变量中
export PATH=$PATH:交叉编译工具的目录
	b编译的脚本(在output/build/file-5.38/目录下执行)
#!/bin/sh
CROSS=mips-buildroot-linux-uclibc-
./configure --prefix=/media/admin1/temp/toolchain/buildroot_2020.2_chaintool_gcc5_2020.5.16_build_no_c++ --sysconfdir=/media/admin1/temp/toolchain/buildroot_2020.2_chaintool_gcc5_2020.5.16_build_no_c++/etc --host=mips-linux --enable-static --disable-shared CC=${CROSS}gcc AS=${CROSS}as LD=${CROSS}ld AR=${CROSS}ar RANLIB=${CROSS}ranlib

2、有可能zlib1g-dev支持库的所包含的库文件就是libz.z等文件,在unbutu中安装zlib1g-dev后库文件在/usr/lib32 目录中,但使用交叉编译的时候需要交叉编译自己的支持库一般在 output/host/lib目录下,

但是output/host/lib中的libz.a等文件还是不能用,须使用output/build/libzlib-1.2.11这个原始编译后的目中的这些文件。


后记:
关于buildroot的疑问我自己查了下

4902d22495e31667c20d92e27cfa6bbf  ./output/build/host-gcc-final-5.5.0/build/zlib/libz.a
120496 5月  23 20:08 			  ./output/build/host-gcc-final-5.5.0/build/zlib/libz.a

88eed6c2ac532e11bfdfe12bb63e45c7  ./output/build/host-binutils-2.32/zlib/libz.a
125500 5月  23 19:54 			  ./output/build/host-binutils-2.32/zlib/libz.a

92f687c93c4349ccaf992db4081d7ddb  ./output/build/host-libzlib-1.2.11/libz.a
125258 5月  28 21:53 			  ./output/build/host-libzlib-1.2.11/libz.a

4902d22495e31667c20d92e27cfa6bbf  ./output/build/host-gcc-initial-5.5.0/build/zlib/libz.a
120496 5月  23 19:59 			  ./output/build/host-gcc-initial-5.5.0/build/zlib/libz.a

e8f050c34352c77ee6e656e85ebafce6  ./output/build/libzlib-1.2.11/libz.a (***********)
115346 5月  28 21:53 			  ./output/build/libzlib-1.2.11/libz.a

14143cc78b2bbe71e36e42e631a50f0a  ./output/host/mips-buildroot-linux-uclibc/lib/libz.a
115346 5月  23 20:18 			  ./output/host/mips-buildroot-linux-uclibc/lib/libz.a

92f687c93c4349ccaf992db4081d7ddb  ./output/host/lib/libz.a
125258 5月  28 21:53 			  ./output/host/lib/libz.a

请注意星号的这个是能用的libz.a文件,buildroot编译后竟然不输出到./output/host/lib/目录下给交叉编译器用,而output/host/lib 目录中的文件是X64结构的。

在./output/build/host-libzlib-1.2.11 (也是libzlib1.2.11)这个目录中编译的文件是X64结构的

在./output/build/libzlib-1.2.11(也是libzlib1.2.11)这个目录中编译的文件是mips结构的

开来我还是不懂buildroot的结构,再学习吧

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值