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

在这里记录一下在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的拼音输入法时,鼠标左键拉选代码会失效,切换至英文输入法就会正常。

猜你喜欢

转载自blog.csdn.net/qq_32006213/article/details/128959060
今日推荐