多个源文件编译成一个模块注意Makefile 书写
2014-05-09 15:40
337 查看
多个源文件编译成一个模块,不正确的Makefile 会使printk 不能输出信息。
细细观测,发现是对Makefile 语法未深刻理解所致。 下面附上一例说明问题。
--------------------------------------------------------------------------------
简单的测试文件1
[root@hjj /home/samba/printk]# cat print.c
--------------------------------------------------------------------------------
#include <linux/module.h>
int mod_entry(void)
{
printk("hello entry\n");
return 0;
}
void mod_exit(void)
{
printk("leave the program\n");
}
module_init(mod_entry);
module_exit(mod_exit);
MODULE_LICENSE("GPL");
--------------------------------------------------------------------------------
简单的测试文件2
[root@hjj /home/samba/printk]# cat abc.c
--------------------------------------------------------------------------------
#include <linux/kernel.h>
void dummy(void)
{
}
--------------------------------------------------------------------------------
错误的Makefile. 这样虽然生成了print.ko,
但是只连接了abc.o 而丢失了print.o, 当然连接了print.mod.o, 可用make V=1 观察
[root@hjj /home/samba/printk]# cat Makefile
--------------------------------------------------------------------------------
ifneq ($(KERNELRELEASE),)
obj-m := print.o
print-objs := abc.o
else
PWD = $(shell pwd)
KVER = $(shell uname -r)
KDIR = /lib/modules/$(KVER)/build
all:
make -C $(KDIR) M=$(PWD)
clean:
rm *.o *.ko modules.*
endif
--------------------------------------------------------------------------------
正确的 Makefile. 生成了myprint.ko, 连接了print.o abc.o 两个目标文件
[root@hjj /home/samba/printk]# cat Makefile
--------------------------------------------------------------------------------
ifneq ($(KERNELRELEASE),)
obj-m := myprint.o
myprint-objs := print.o abc.o
else
PWD = $(shell pwd)
KVER = $(shell uname -r)
KDIR = /lib/modules/$(KVER)/build
all:
make -C $(KDIR) M=$(PWD)
clean:
rm *.o *.ko modules.*
endif
--------------------------------------------------------------------------------
至此问题已完全解决。 不过也花费了我不少时间
结论:
obj-m(或-y)由模块名.o文件连接生成。
模块名-objs(或-y)由指定.o 文件连接而成
--------------------------------------------------------------------------------
细细观测,发现是对Makefile 语法未深刻理解所致。 下面附上一例说明问题。
--------------------------------------------------------------------------------
简单的测试文件1
[root@hjj /home/samba/printk]# cat print.c
--------------------------------------------------------------------------------
#include <linux/module.h>
int mod_entry(void)
{
printk("hello entry\n");
return 0;
}
void mod_exit(void)
{
printk("leave the program\n");
}
module_init(mod_entry);
module_exit(mod_exit);
MODULE_LICENSE("GPL");
--------------------------------------------------------------------------------
简单的测试文件2
[root@hjj /home/samba/printk]# cat abc.c
--------------------------------------------------------------------------------
#include <linux/kernel.h>
void dummy(void)
{
}
--------------------------------------------------------------------------------
错误的Makefile. 这样虽然生成了print.ko,
但是只连接了abc.o 而丢失了print.o, 当然连接了print.mod.o, 可用make V=1 观察
[root@hjj /home/samba/printk]# cat Makefile
--------------------------------------------------------------------------------
ifneq ($(KERNELRELEASE),)
obj-m := print.o
print-objs := abc.o
else
PWD = $(shell pwd)
KVER = $(shell uname -r)
KDIR = /lib/modules/$(KVER)/build
all:
make -C $(KDIR) M=$(PWD)
clean:
rm *.o *.ko modules.*
endif
--------------------------------------------------------------------------------
正确的 Makefile. 生成了myprint.ko, 连接了print.o abc.o 两个目标文件
[root@hjj /home/samba/printk]# cat Makefile
--------------------------------------------------------------------------------
ifneq ($(KERNELRELEASE),)
obj-m := myprint.o
myprint-objs := print.o abc.o
else
PWD = $(shell pwd)
KVER = $(shell uname -r)
KDIR = /lib/modules/$(KVER)/build
all:
make -C $(KDIR) M=$(PWD)
clean:
rm *.o *.ko modules.*
endif
--------------------------------------------------------------------------------
至此问题已完全解决。 不过也花费了我不少时间
结论:
obj-m(或-y)由模块名.o文件连接生成。
模块名-objs(或-y)由指定.o 文件连接而成
--------------------------------------------------------------------------------
相关文章推荐
- 实现一个非常简单的模块编译makefile
- linux编译多个源文件成同一个模块
- linux编译单独一个模块makefile写法
- linux编译单独一个模块makefile写法
- 多个*.c文件编译生成一个模块驱动*.ko的makefile文件编写
- 多个*.c文件编译生成一个模块驱动*.ko的makefile文件编写
- Linux Kernel Module编程,多个源文件编译成一个模块的解决方案
- Linux Kernel Module编程,多个源文件编译成一个模块的解决方案
- 多个*.c文件编译生成一个模块驱动*.ko的makefile文件编写
- 程序编译时书写Makefile注意事项一例
- 多个*.c文件编译生成一个模块驱动*.ko的makefile文件编写
- 一个通用的编译模块Makefile,编译结果xxxx.ko
- 编译内核模块的的Makefile的讲解
- 编译一个自己的内核模块,并加载进内核
- 【Linux学习】 写一个简单的Makefile编译源码获取当前系统时间
- cmake 入门教程之编译一个源文件
- linux 2.6内核 编译模块Makefile 详解!
- .net同一个解决方案下面多个web项目。目的为了较大项目分解模块,各自编译开发!
- 单独修改编译一个framwork模块,make snod会有的问题
- 一个能自动搜索源文件并自动推导的Makefile