ubuntu编译报错:./include/linux/bits.h:6:10: fatal error: asm/bitsperlong.h: No such file or directory解决方法
今天总算鼓起勇气打开ubuntu来学习一下Linux驱动相关内容,万事开头难呀,第一个照抄的程序都卡壳了,代码如下:
#include<linux/module.h>
int hello_init(void)
{
printk("hello Felix_init\n")
}
void cleanup_module(void)
{
printk("hello Felix_cleanup_modules\n")
}
module_init(hello_init)
MODULE_LICENSE("GPL");
Makefile文件如下:
KVERSION = $(shell uname -r)
KERN_DIR = /lib/modules/$(KVERSION)/build
all:
make -C $(KERN_DIR) M='pwd' modules
clean:
make -C $(KERN_DIR) M='pwd' modules clean
rm -rf modules.order
obj-m +=hello_drv.o
但就是这几行代码把我这个小白碰得头破血流,差点入门即放弃,在ubuntu下编译报错了,报错信息如下:
In file included from ./include/linux/bitops.h:5:0,
from ./include/linux/kernel.h:12,
from ./include/linux/list.h:9,
from ./include/linux/module.h:9,
from /home/book/practice/2_2/hello_drv.c:1:
./include/linux/bits.h:6:10: fatal error: asm/bitsperlong.h: No such file or directory
#include <asm/bitsperlong.h>
^~~~~~~~~~~~~~~~~~~
compilation terminated.
scripts/Makefile.build:270: recipe for target ‘/home/book/practice/2_2/hello_drv.o’ failed
make[2]: *** [/home/book/practice/2_2/hello_drv.o] Error 1
Makefile:1762: recipe for target ‘/home/book/practice/2_2’ failed
make[1]: *** [/home/book/practice/2_2] Error 2
make[1]: Leaving directory ‘/usr/src/linux-headers-5.4.0-126-generic’
Makefile:8: recipe for target ‘all’ failed
make: *** [all] Error 2
嗯,第一眼感觉就是缺少文件嘛,问题不大,按照路径进去发现include目录根本就没有asm文件,只有asm-generic目录,进入asm-generic目录后找到了bitsperlong文件,然后就理所当然的把*./include/linux/bits.h里面的#include <asm/bitsperlong.h>改为#include <asm-generic/bitsperlong.h>,果不其然,这个错误消失了,但又出现其他类似错误,只是不是bitsperlong罢了,按照这个方法一个一个该不知何时是头,搞完还不一定是能正常通过编译,最终发现由于是自己设置了交叉编译工具链,即在arm编译环境下编译x86文件,导致编译报错。说到这里
你一定记得自己曾今有配置过这个东西:
export ARCH=arm
export CROSS_COMPILE=arm-buildroot-linux-gnueabihf-
export PATH=$PATH:******/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin
是的,就这个东西捣的鬼,现在你只需要执行如下l两条指令重新配置编译环境即可解决:`
export CROSS_COMPILE=
export ARCH=x86