最近在学习IMX6ULL的驱动程序,在用make命令执行编译led驱动程序时,出现以下报错:
make -C /home/book/100ask_imx6ull-sdk/Linux-4.9.88 M=pwd modules
make[1]: 进入目录“/home/book/100ask_imx6ull-sdk/Linux-4.9.88”
ERROR: Kernel configuration is invalid.
include/generated/autoconf.h or include/config/auto.conf are missing.
Run 'make oldconfig && make prepare' on kernel src to fix it.
WARNING: Symbol version dump ./Module.symvers
is missing; modules will have no dependencies and modversions.
CC [M] /home/book/01_all_series_quickstart/05_嵌入式Linux驱动开发基础知识/source/02_led_drv/00_led_drv_simple/imx6ull/led_drv.o
In file included from :0:0:
././include/linux/kconfig.h:4:10: fatal error: generated/autoconf.h: 没有那个文件或目录
#include
^~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
scripts/Makefile.build:299: recipe for target '/home/book/01_all_series_quickstart/05_嵌入式Linux驱动开发基础知识/source/02_led_drv/00_led_drv_simple/imx6ull/led_drv.o' failed
make[2]: *** [/home/book/01_all_series_quickstart/05_嵌入式Linux驱动开发基础知识/source/02_led_drv/00_led_drv_simple/imx6ull/led_drv.o] Error 1
Makefile:1499: recipe for target 'module/home/book/01_all_series_quickstart/05_嵌入式Linux驱动开发基础知识/source/02_led_drv/00_led_drv_simple/imx6ull' failed
make[1]: *** [module/home/book/01_all_series_quickstart/05_嵌入式Linux驱动开发基础知识/source/02_led_drv/00_led_drv_simple/imx6ull] Error 2
make[1]: 离开目录“/home/book/100ask_imx6ull-sdk/Linux-4.9.88”
Makefile:13: recipe for target 'all' failed
make: *** [all] Error 2
很明显,上面出现了两个错误和一个警告:
大意是说内核配置无效。缺少include/generated/autoconf.h或include/config/auto.conf文件。
需要特别注意的是,这里报错提示给出了解决建议:在内核源码的目录下运行make oldconfig && make prepare来修复该报错。
意思是说,././include/linux/kconfig.h里没有链接generated/autoconf.h文件。
大意是说,Linux内核代码的目录下丢失了符号版本信息文件 Module.symvers文件,将会导致模块没有依赖项和版本信息。
首要考虑是按报错的建议操作去解决,但是到了Linux的源码目录下执行了make oldconfig ,但是它会出现许多需要配置的问答,即使我长按空格按默认答案回答,依然需要很长的时间,在长按了一会儿后,直接Ctrl + C放弃了这个建议。几经周折后,终于找到了一个可行的解决方法。
make mrproper
这个命令会清除先前的编译结果和配置文件。
2. 配置内核编译选项和模块,例如执行以下命令:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 100ask_imx6ull_defconfig
其中,100ask_imx6ull_defconfig是我使用的硬件平台对应的配置文件。如使用其他配置文件,需要根据实际情况修改。
3. 生成Makefile文件,例如执行以下命令:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make menuconfig这个命令会打开一个文本界面的配置工具,可以在里面配置内核编译选项和模块。配置完成后,保存退出即可。
具体操作为
(1)、用方向键移动光标至Enalble loadable module support,确保下面的光标在Select处,回车。保证前方的中括号内有*星号。
3、此页面默认OK,直接回车即可。
(4)、选中Exit,退出menuconfig
4. 运行 'make oldconfig && make prepare' 命令来修复内核配置,执行以下命令:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- oldconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- prepare
5.重新编译内核模块,例如执行以下命令:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules -j4
6.如果还有模块依赖于 Module.symvers 文件,则需要先编译内核,例如执行以下命令:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage -j4
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules -j4
注意,在执行make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage -j4命令时,可能会提示:
LZO arch/arm/boot/compressed/piggy_data
/bin/sh: 1: lzop: not found
arch/arm/boot/compressed/Makefile:186: recipe for target 'arch/arm/boot/compressed/piggy_data' failed
这是没有安装lzop软件包的缘故,只要执行
sudo apt-get update
sudo apt-get install lzop
然后再次执行make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage -j4即可。