搭建MIPS GCC交叉编译器失败:无法找到-lc及依赖循环问题求助
解决GCC交叉编译与uClibc的依赖循环问题
你碰到的这个问题是交叉编译里非常典型的libgcc与uClibc依赖死循环——想编译动态版的libgcc_s.so得先有libc,可编译uClibc又得用到libgcc的支持。结合你的MIPS32R2、uClibc 0.9.30.1和GCC4.9.4的场景,我给你整理了一套可行的解决步骤:
第一步:先搞出不依赖libc的静态libgcc
你之前直接执行make all-target-libgcc时,GCC默认会尝试构建动态的libgcc_s.so,这玩意儿确实需要链接libc才会报错。我们得调整参数,只生成静态的libgcc.a,它不需要依赖libc就能用:
- 进入你之前创建的Stage1 GCC构建目录:
cd gcc-4.9.4/build/gcc-stage1
- 重新配置libgcc的编译选项,重点加上
--enable-shared=no来禁用动态库,同时保持--without-headers确保不依赖系统头文件:
../configure --target=mips-linux-uclibc --prefix=/home/user/mips-cross-gcc/staging_dir \ --disable-werror --disable-libgomp --without-newlib --disable-multilib \ --enable-languages=c --enable-shared=no --disable-__cxa_atexit \ --enable-target-optspace --disable-nls --disable-libmudflap --disable-libssp \ --with-float=soft --with-sysroot=/home/user/mips-cross-gcc/staging_dir/sysroot \ --with-gnu-ld --without-headers
- 编译并安装这个静态libgcc:
make all-target-libgcc make install-target-libgcc
现在你的交叉工具链里就有了libgcc.a,足够支撑uClibc的编译了。
第二步:用Stage1 GCC+静态libgcc编译uClibc
现在可以放心编译uClibc了,注意配置要和你的目标架构匹配:
- 进入uClibc源码目录,先通过菜单配置确认参数:
cd uClibc-0.9.30.1 make menuconfig
- 关键配置项要对应上:
- 目标架构选
MIPS,子架构选MIPS32R2 - 工具链前缀设为
mips-linux-uclibc- - 高级库设置里别开需要动态libgcc的选项(默认应该不会开)
- 目标架构选
- 编译并安装uClibc到sysroot:
make PREFIX=/home/user/mips-cross-gcc/staging_dir/sysroot make PREFIX=/home/user/mips-cross-gcc/staging_dir/sysroot install
这一步应该能顺利跑完,因为uClibc会链接静态的libgcc.a,完全不需要动态的libgcc_s.so。
第三步:重新编译完整的GCC(包含动态libgcc)
等uClibc安装完成,sysroot里就有了完整的libc环境,现在可以重新编译支持动态链接的完整GCC了:
- 先清理之前的Stage1构建目录,新建一个完整编译的目录:
rm -rf gcc-4.9.4/build/gcc-stage1 mkdir -p gcc-4.9.4/build/gcc-full cd gcc-4.9.4/build/gcc-full
- 重新配置GCC,这次去掉
--without-headers(因为sysroot里已经有Linux和uClibc的头文件了),同时启用共享库:
../configure --target=mips-linux-uclibc --prefix=/home/user/mips-cross-gcc/staging_dir \ --disable-werror --disable-libgomp --disable-multilib --enable-languages=c,c++ \ --enable-shared --disable-__cxa_atexit --enable-target-optspace --disable-nls \ --disable-libmudflap --disable-libssp --with-float=soft \ --with-sysroot=/home/user/mips-cross-gcc/staging_dir/sysroot --with-gnu-ld
- 编译并安装完整的GCC:
make all make install
这次编译libgcc_s.so时,链接器就能找到uClibc的libc.so,不会再出现找不到-lc的错误了。
额外提醒
- 记得把交叉工具链的路径加到环境变量里:
export PATH=$HOME/mips-cross-gcc/staging_dir/bin:$PATH,避免不小心用到主机的GCC。 - 检查Linux头文件是否正确安装到sysroot的
usr/include下,你之前的步骤3已经做了这一步,应该没问题,但如果uClibc编译时头文件报错可以再确认下。 - 你的目标是软浮点(
--with-float=soft),一定要确保uClibc的配置也用了软浮点,不然后续编译软件可能会出现ABI不兼容的问题。
内容的提问来源于stack exchange,提问作者Daniel Rodriguez
相关产品推荐
相关产品推荐

