免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8939 | 回复: 10
打印 上一主题 下一主题

求助:linux驱动编译Makefile文件的编写 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-02-11 16:18 |只看该作者 |倒序浏览
刚开始学linux驱动,我自己写了一个驱动(hello world那种),包括:main.c lib.c lib.h
Makefile应该怎么写呢?我是这样写的:

obj-m := main.o
main.o := main.c lib.c

KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

default:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules


但是编译时报错,貌似没找到lib.c
应该怎么写呢?
另外,哪位能给个驱动编译的Make说明文档,linux驱动编译与用户空间的Make应该有很多不同

论坛徽章:
0
2 [报告]
发表于 2010-02-11 17:27 |只看该作者
试试这个:

MODULE_NAME:=my_driver           #这是最终生成的.ko文件名字

$(MODULE_NAME)-objs := main.o lib.o         #每个.c文件都对应一个.o
obj-m:=$(MODULE_NAME).o

KDIR := /lib/modules/$(shell uname -r)/build
PWD  := $(shell pwd)

default:
        $(MAKE) -C $(KDIR) M=$(PWD) modules

clean:
        rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module.symvers
        
distclean:
        rm -rf *.o *~ core .depend .*.cmd *.mod.c .tmp_versions Module.symvers

论坛徽章:
0
3 [报告]
发表于 2010-02-11 17:51 |只看该作者
报错了:

make -C /lib/modules/2.6.28-11-generic/build M=/home/weiguixm/Desktop/linux_device_driver/test modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.28-11-generic'
scripts/Makefile.build:231: target `/home/weiguixm/Desktop/linux_device_driver/test/my_driver' doesn't match the target pattern
  CC [M]  /home/weiguixm/Desktop/linux_device_driver/test/my_driver
gcc: no input files
make[2]: *** [/home/weiguixm/Desktop/linux_device_driver/test/my_driver] Error 1
make[1]: *** [_module_/home/weiguixm/Desktop/linux_device_driver/test] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-2.6.28-11-generic'
make: *** [default] Error 2

论坛徽章:
0
4 [报告]
发表于 2010-02-11 18:03 |只看该作者
我又修改了make 可以编译了
但是又出现如下问题:

make -C /lib/modules/2.6.28-11-generic/build M=/home/weiguixm/Desktop/linux_device_driver/test modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.28-11-generic'
  LD [M]  /home/weiguixm/Desktop/linux_device_driver/test/test.o
/home/weiguixm/Desktop/linux_device_driver/test/lib.o.data+0x0): multiple definition of `message'
/home/weiguixm/Desktop/linux_device_driver/test/main.o.data+0x0): first defined here
make[2]: *** [/home/weiguixm/Desktop/linux_device_driver/test/test.o] Error 1
make[1]: *** [_module_/home/weiguixm/Desktop/linux_device_driver/test] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-2.6.28-11-generic'
make: *** [default] Error 2

message是我在lib.h里面定义的一个字符数组
对于该问题,我是这样理解的:
main.c和lib.c都包含了lib.h,而main.o和lib.o是分别编译的,因此lib.h被包含了两次,使message变量出现重复定义

需要如何修改Makefile来解决这个问题呢?

论坛徽章:
0
5 [报告]
发表于 2010-02-14 18:25 |只看该作者
应该是 lib.h 的问题吧……里面用
  1. #ifndef
  2. #define
  3. ...
  4. #endif
复制代码
包起来了么?
或者在 message 前面加上 extern 试试……

论坛徽章:
0
6 [报告]
发表于 2010-02-14 21:31 |只看该作者
#ifndef之类的
这些都加过了,所以我才觉得两个.c文件都是独立编译的

论坛徽章:
0
7 [报告]
发表于 2010-02-17 09:54 |只看该作者
发个最简的源码过来,大家可以帮你调调……

论坛徽章:
0
8 [报告]
发表于 2010-02-19 14:58 |只看该作者
请不要在头文件中定义变量,应该定义在.c文件中,然后在 .h 中用extern 来申明一下,就可以在别的.c中引用了。

这是c语言的基础知识,看来你的c还需要加强啊

论坛徽章:
0
9 [报告]
发表于 2010-02-19 17:31 |只看该作者
看来8楼正解

论坛徽章:
0
10 [报告]
发表于 2010-02-19 18:10 |只看该作者
谢了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP