Linux模块编程入门:make没报错,却没有本应生成的.o和.ko文件

HWY_猿 2019-05-02 10:55:48

#help#
是这样的,本人渣渣,最近想入门驱动开发,就先按书本写个模块编程helloworld程序,但折腾了很久很久都没能解决,始终未能编译成功,想入门,却被堵死在门外,憋屈-.......-,哪位大神帮帮忙~本人也第一次发帖问问题,有什么不妥的还请不吝赐教~

【问题描述及所做尝试】
==环境
虚拟机rhel7.4,内核:3.16.65
#参照的某本驱动入门本书说模块编程前,要先升级内核,我就升级了下内核(升级后3.16.65)。
#内核升级步骤:
官网上下载、解压后,
make menuconfig
make
make modules
make modules_install
make install
reboot

==代码
helloworld.c程序检查无误;
makefile 也是课本的;

==编译现象
一开始make时总是出错,升级后make没报错,但是就是没有生成本应出现的helloworld.o和helloworld.ko文件,
make前后当前目录下就只有helloworld.c和makefile
#make后有个隐藏文件夹.tmp_versions,但里面没文件
make时的现象为:
[root@localhost helloworld]# make all
make -C /usr/src/kernels/linux-3.16.65 M= /study_note/module_test/helloworld modules
make[1]: 进入目录“/usr/src/kernels/linux-3.16.65”
make[1]: 对“/study_note/module_test/helloworld”无需做任何事。
CHK include/config/kernel.release
CHK include/generated/uapi/linux/version.h
CHK include/generated/utsrelease.h
CALL scripts/checksyscalls.sh
CHK include/generated/compile.h
CHK include/generated/uapi/linux/version.h
Building modules, stage 2.
MODPOST 2236 modules
make[1]: 离开目录“/usr/src/kernels/linux-3.16.65”

==干过的傻逼事儿
对于“无需做任何事”,参照CSDN上分享的点子,make clean一下,确实清除了一些本渣渣看不懂的东西,
然后再make一下,确实没有"无需做任何事"这句,但是就像我升级内核一样,重新生成了n多不知啥啥的东东,
但是,还是没有helloworld.o和helloworld.ko文件【哭了】。

==猜测
可能我升级内核过程有啥毛病或者漏了哪个环节?但我都是按书本来的-.....-


【源代码】
helloworld.c代码:
 
1 #include<linux/module.h>
2 #include<linux/kernel.h>
3 #include<linux/init.h>
4
5 static int __init lkp_init(void)
6 {
7 printk("<1> hello world!\n");
8 return 0;
9 }
10
11 static void __exit lkp_cleanup(void )
12 {
13 printk("<1>goodbye!");
14 }
15
16 module_init(lkp_init);
17 module_exit(lkp_cleanup);
18 MODULE_LICENSE("GPL");


makefile代码:

1 obj-m := helloworld.o
2 KERNELDIR :=/usr/src/kernels/linux-3.16.65
3 PWD :=$(shell pwd)
4 all:
5 make -C $(KERNELDIR) M= $(PWD) modules
6 clean:
7 make -C $(KERNELDIR) M= $(PWD) clean
8


...全文
2318 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
HWY_猿 2019-05-21
  • 打赏
  • 举报
回复
引用 3 楼 super tyson的回复:
KERNEL_DIR=/home/linux/ARM移植/linux-3.14
CUR_DIR=$(shell pwd) #当前目录
NAME1=hello
APP_NAME=led_app
ROOTFS_DIR=/source/rootfs

ifeq ($(KERNELRELEASE), ) #判断内核Makefile是否执行,成立执行else前对应的指令,不成立执行else下命令

all :
make -C $(KERNEL_DIR) M=$(CUR_DIR) modules #默认执行内核下Makefile模块编译
clean:
make -C $(KERNEL_DIR) M=$(CUR_DIR) clean #用内核目录下的Makefile清楚指i令
install:
sudo cp *.ko $(ROOTFS_DIR)/my_drivers(改一下)
app:
arm-none-linux-gnueabi-gcc $(APP_NAME).c -o $(APP_NAME).app
sudo cp $(APP_NAME).app $(ROOTFS_DIR)/app
else
obj-m += $(NAME1).o #默认编译为.o文件,加-m表示模块化编译成.ko文件
endif
😁️🌹️很是感激很是感激~虽然我只是在虚拟机打印个helloword还不没摸索到移植那儿,解决办法也只是简单粗暴的从官网下载个新的系统镜像(因为感觉原本那个太多缺的或者其他本人目前还不懂的问题),不过这个也会很有帮助的,十分感谢~
super tyson 2019-05-19
  • 打赏
  • 举报
回复
你这Makefile编译不出.ko文件的,
super tyson 2019-05-19
  • 打赏
  • 举报
回复
等会给你个Makefile
super tyson 2019-05-19
  • 打赏
  • 举报
回复
KERNEL_DIR=/home/linux/ARM移植/linux-3.14
CUR_DIR=$(shell pwd) #当前目录
NAME1=hello
APP_NAME=led_app
ROOTFS_DIR=/source/rootfs

ifeq ($(KERNELRELEASE), ) #判断内核Makefile是否执行,成立执行else前对应的指令,不成立执行else下命令

all :
make -C $(KERNEL_DIR) M=$(CUR_DIR) modules #默认执行内核下Makefile模块编译
clean:
make -C $(KERNEL_DIR) M=$(CUR_DIR) clean #用内核目录下的Makefile清楚指i令
install:
sudo cp *.ko $(ROOTFS_DIR)/my_drivers(改一下)
app:
arm-none-linux-gnueabi-gcc $(APP_NAME).c -o $(APP_NAME).app
sudo cp $(APP_NAME).app $(ROOTFS_DIR)/app
else
obj-m += $(NAME1).o #默认编译为.o文件,加-m表示模块化编译成.ko文件
endif

1,324

社区成员

发帖
与我相关
我的任务
社区描述
主要是开发驱动技术
社区管理员
  • 驱动程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧