【Linux驱动学习】一个简单的编译错误

在Linux驱动学习过程中遇到的问题包括不支持C99编程标准,Makefile编写时需注意模块名与.c文件名的差异,否则会导致编译错误,即使能生成模块文件也可能隐藏问题。在特定情况下,模块安装显示问题可能源于编译阶段,而非运行时。此外,Ubuntu下VsCode使用ibus拼音输入法时,可能导致代码选择功能失效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里记录一下在Linux驱动学习中踩到的意想不到的坑:
【1】不支持C99编程
不支持C99形式
【2】Makefile的编写需要仔细,在使用多个.c编译 模组.ko时,模组和.c不能重名。
重名导致的无限重入,直接导致led.c没有编译进去
主要错误:
led-y := led.o board_demo.o obj-m += led.o
这里首先声明的模组名为:led;在编译led模组时使用了led.c,因此后面有led.o,而在编译.ko时也是按照模组名led.o,因此出现了意想不到的错误。改成这样就能正常:
led_modules-y := led.o board_demo.o obj-m += led_modules.o
对应生成的模组文件为led_modules.ko
这个问题很难发现,因为即便写错,它仍然会编译出模组文件以及APP文件,并且不会报,需要仔细查看编译过程的打印才会发现【dependency dropped】。但是这个模组文件安装会显示一些问题,但是查这些相关打印是找不到问题的根本的,因为有很多其他的问题也会导致这样的打印。在ARM上打印如下:
ARM打印
一开始楼主的想法是根据这个打印去追踪问题,研究了半天也没研究出来。后来想到楼主在模组init部分是带有打印的,理论上只要进入了init函数就会马上在内核打印 文件、函数、行数的信息。可是这个却没有,说明连init都没有进去,于是才想到是编译的问题。
在编译简单LED驱动程序时,Makefile是这么写的:
obj-m += led.o
这里因为驱动文件只有led.c,所以没有问题。
【3】题外话:在Ubantu下使用VsCode的时候容易出现的一个问题:在使用ibus的拼音输入法时,鼠标左键拉选代码会失效,切换至英文输入法就会正常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值