当前位置: 技术问答>linux和unix
帮忙改一下Makefile
来源: 互联网 发布时间:2016-01-10
本文导语: 一个目录下有四个文件:Makefile、print.c、print.h、test.c test.c -------------------------------------------------- #include #include #include #include "print.h" int init_module(void) { char a[20]; strcpy(a, "Hello worldn"); print((vo...
一个目录下有四个文件:Makefile、print.c、print.h、test.c
test.c
--------------------------------------------------
#include
#include
#include
#include "print.h"
int init_module(void)
{
char a[20];
strcpy(a, "Hello worldn");
print((void*)a);
return 0;
}
void cleanup_module(void)
{
printk("Goodbye cruel world n");
}
MODULE_LICENSE("GPL");
--------------------------------------------------
print.c
--------------------------------------------------
#include
#include
#include
int print(void* data)
{
return printk("sting: %sn", (char*)data);
}
-------------------------------------------------
print.h
---------------------------------------------------
extern int print(void*);
--------------------------------------------------
Makefile
-------------------------------------------------
CC=gcc
KERNELDIR=/usr/src/linux-$(shell uname -r)
MODCFLAGS:=-Wall -DMODULE -D__KERNEL__ -DLINUX -I $(KERNELDIR)/include
test.o: test.c print.h print.c /usr/include/linux/version.h
$(CC) $(MODCFLAGS) -c test.c print.c
clean:
rm -f *.o
-------------------------------------------------
现在用“make”编译后回出现print.o和test.o两个文件,“insmod test.o”会出现“test.o: unresolved symbol print”的信息。上面Makefile应该怎么改?
test.c
--------------------------------------------------
#include
#include
#include
#include "print.h"
int init_module(void)
{
char a[20];
strcpy(a, "Hello worldn");
print((void*)a);
return 0;
}
void cleanup_module(void)
{
printk("Goodbye cruel world n");
}
MODULE_LICENSE("GPL");
--------------------------------------------------
print.c
--------------------------------------------------
#include
#include
#include
int print(void* data)
{
return printk("sting: %sn", (char*)data);
}
-------------------------------------------------
print.h
---------------------------------------------------
extern int print(void*);
--------------------------------------------------
Makefile
-------------------------------------------------
CC=gcc
KERNELDIR=/usr/src/linux-$(shell uname -r)
MODCFLAGS:=-Wall -DMODULE -D__KERNEL__ -DLINUX -I $(KERNELDIR)/include
test.o: test.c print.h print.c /usr/include/linux/version.h
$(CC) $(MODCFLAGS) -c test.c print.c
clean:
rm -f *.o
-------------------------------------------------
现在用“make”编译后回出现print.o和test.o两个文件,“insmod test.o”会出现“test.o: unresolved symbol print”的信息。上面Makefile应该怎么改?
|
“test.o: unresolved symbol print”是说test.c中调用到函数print但前面没有声明函数原型,所以这不是make的问题而是C语法问题,应在test.c前include声明了print函数原型的.h文件。
|
sorry刚才没看仔细瞎说了 -_-*
#include "print.h"已经声明了,compile没有问题的,是link时找不到print的函数体了。
#include "print.h"已经声明了,compile没有问题的,是link时找不到print的函数体了。
|
$(CC) $(MODCFLAGS) -c test.c print.c
ld demo.o test.o print.o (ld具体的使用方法请自己查)
ld demo.o test.o print.o (ld具体的使用方法请自己查)
|
不好意思,手头没有Linux没法验证。用下面的试一下吧:
----------------------------------------------------------------------
CC=gcc
KERNELDIR=/usr/src/linux-$(shell uname -r)
MODCFLAGS:=-Wall -DMODULE -D__KERNEL__ -DLINUX -I $(KERNELDIR)/include
.SUFFIXES: .c .o
.c.o:
$(CC) $(MODCFLAGS) $
----------------------------------------------------------------------
CC=gcc
KERNELDIR=/usr/src/linux-$(shell uname -r)
MODCFLAGS:=-Wall -DMODULE -D__KERNEL__ -DLINUX -I $(KERNELDIR)/include
.SUFFIXES: .c .o
.c.o:
$(CC) $(MODCFLAGS) $