最初编译的是正点原子改过的Linux内核,可能是版本问题,一直报错,无法成功编译。然后换成NXP官方Linux内核6.6版本,初始编译虽然也报各种错,但都是缺少库或相关工具,全部安装后就可以成功编译出镜像了(人都麻了(x_x))
最后测来测去,发现主要原因是gcc版本不对。之所以使用NXP最新的内核版本没有问题,那是因为我的gcc编译器是14.0版本的,与NXP这个6.6版本发布时间相距不远。一般来说,要确保你下载的源码比你使用的gcc版本要新,不然容易出现不兼容的问题。
如果你使用的是正点原子提供的linux内核源码,那么就要确保你的gcc编译器版本低于7.5,至于10.3、11.5、14都不行。确切地来说,下面这个链接里面的编译器基本可用,我用的是7.5版本的。
Linaro Releases
下面将分为两个部分,【编译Linux内核】是正常步骤,【报错历程】是我在错误使用gcc版本时遇到的问题,只不过最后没能解决就不了了之了。
编译Linux内核
在gcc编译器版本正确的情况下,初次编译
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
make distclean
make imx_v7_deconfig
make -j16
# 给虚拟机分配多少处理器,就在-j后面加上多少数字,-j后面最好不要空,否则容易卡死系统崩溃
编译之后大概率会遇到一个"yylloc"重定义的问题,解决办法很简单,在/scripts/dtc目录下,找到dtc-lexer.lex.c_shipped文件,并把里面的对应变量定义YYLTYPE yylloc;前面加上extern。详情见博客编译linux内核时multiple definition of `yylloc‘错误的解决方案
之后再编译就不会出现任何问题了。其中正点原子build.sh脚本里说用到gcc版本是5.3,但我用上5.3后,依旧会出现这个重定义的问题,解决后就不会继续报错了。
如果你的gcc编译版本过新,那么初次编译也会遇到这个问题,只不过解决了这个后还会出现一堆不兼容问题。
正常情况下,编译后会产生镜像文件如zImage,如果编译最后没有产生镜像,反而是突然停下了,也没有报错提示。那么多半是因为并行编译导致,使用单核编译再试一遍(只有make,没有“-j”),这时会出现报错提示。
报错历程
下面是我遇到的部分报错历程,这是在gcc版本过新(14.0)的情况下测试的。总之,即便一步一步照着报错提示去查教程修改,最后也难逃无法解决的链接问题
【1】fatal error: curses.h: No such file or directory
sudo apt-get install libncurses-dev
【2】出现多重定义的问题
我采用的是
编译itop4412 uboot失败,提示multiple definition of `yylloc‘; scripts/dtc/dtc-lexer.lex.o:(.bss+0x0): first_编译提示genneric-asm-offsets.h-CSDN博客
【3】出现下面报错
LD crypto/crypto_hash.o
LD crypto/cryptomgr.o
LD crypto/built-in.o
LD fs/ext4/ext4.o
LD fs/ext4/built-in.o
make: *** [Makefile:948: fs] Error 2
sudo apt-get install lzop
安装上面库后,报错减少了
LD fs/ext4/ext4.o
LD fs/ext4/built-in.o
make: *** [Makefile:948: fs] Error 2
【4】单独使用配置时出现下面问题
sudo apt-get install flex
sudo apt-get install bison
【5】
参考博客:
【1】linux内核编译 fatal error: curses.h: 没有那个文件或目录解决办法
【2】解决Linux下交叉编译U-Boot源码时报‘multiple definition of `yylloc‘‘的错误-CSDN博客
【3】Linux驱动开发环境搭建,初次体验开发全流程(必看)_i.mx6ull编译环境是什么-CSDN博客
【5】Linux kernel 编译openssl/bio.h: No such file or directory openssl找不到