Linux下makefile文件的编写问题!
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux下makefile文件的编写问题!相关的知识,希望对你有一定的参考价值。
已知C语言程序有主程序模块prog.c ,prog.h,其中调用了另一模块subr.c,subr.h中的功能,试写出一个可将这两个模块编译成可执行文件pr1的makefile
ifneq ($(KERNELRELEASE),)obj-m := prog.o subr.o
else
KDIR := /lib/modules/2.6.18-194.el5/build(你的内核的路径,自己选择)
all:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif
make之后,先加载subr.ko,在加载prog.ko。
祝你成功咯! 参考技术A 这个问题不是前几天我回答过么,还给过MAKEFILE么 ...一个比较简单的办法,你用VPATH把你存放文件的目录都列上。然后剩下的工作就跟放在一起没区别了。... 参考技术B #vi makefile 编写以下内容
pr1:prog.o subr.o
gcc prog.o subr.o -o pr1
prog.o:prog.h
gcc -c prog.c
subr.o:subr.c subr.h
gcc -c subr.c
clean:
rm -fr *.o
如何编写makefile
我的一个简单的linux内核模块,包含了,init.h,module.h,sched.h,现要编译,makefile怎么都通不过,
1.请问这个makefile怎么写?
2.以及如果用gcc编译的话应该如何写?谢谢
答案如果试了下可行的话追加分哦~
是这样包含的:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/sched.h>
gcc最一般的用法就是:
gcc -o 要生成的可执行文件名 源代码文件名
如:gcc -o hello.x hello.c
如果一些头文件要指明的话,可以这样:
gcc -o hello.x -I头文件所在的文件夹 -l一些库名 hello.c
最通常,我们用到一些数学库。gcc -o hello.x -lm hello.c
makefile的话,你可以基于上述的语句进行修改:建议你看点资料,或一些典型的例子。但是注意的是规则那一行,得用Tab键打头。
hello.x : hello.o
gcc -o hello.x hello.o (这一行,得用Tab打头)
hello.o : hello.c 头文件
gcc -c hello.o hello.c -I头文件所在目录 -lm (这一行,得用Tab打头) 参考技术A 如果你想写
Makefile
的话,那么你只要用一个不将制表符过滤掉的文本编辑器就可以了,用
vi/vim
可以,用
emacs
可以,用其它的
geditor
也是可以的,只要是文本编辑器就可以了。你在
win
下也可以用记事本写
Makefile
,当然要确保你的系统已经安装了
make
了(最好了
GNU
make)。Makefile
是不需要后缀的,也就是说
Makefile
的文件名就是
Makefile。
下面我给出一个我写的一个简单的
Makefile
给你参考一下吧:
#
Makefile
for
'kmp'
CC=gcc
CFLAGS=-g 参考技术B 1 # To build modules outside of the kernel tree, we run "make"
2 # in the kernel source tree; the Makefile these then includes this
3 # Makefile once again.
4 # This conditional selects whether we are being included from the
5 # kernel Makefile or not.
6 ifeq ($(KERNELRELEASE),)
7
8 # Assume the source tree is where the running kernel was built
9 # You should set KERNELDIR in the environment if it's elsewhere
10 KERNELDIR ?= /lib/modules/$(shell uname -r)/build
11 # The current directory is passed to sub-makes as argument
12 PWD := $(shell pwd)
13
14 modules:
15 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
16
17 modules_install:
18 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
19
20 clean:
21 rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
22
23 .PHONY: modules modules_install clean
24
25 else
26 # called from kernel build system: just declare what our modules are
27 obj-m := hello.o
28 endif
在lwn上可以找到这个例子,你可以把以上两个文件放在你的某个目录下,然后执行make,也许你不一定能成功,因为linux kernel 2.6要求你编译模块之前,必须先在内核源代码目录下执行make,换言之,你必须先配置过内核,执行过make,然后才能make你自己的模块.原因我就不细说了,你按着她要求的这么去做就行了.
另外注意命令前面必须是tab
什么是命令?
类似于这种
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules本回答被提问者采纳 参考技术C makefile其实就是shell基本,把我们在编译一个程序中所有的步骤(命令)都写进去,然后执行make命令时系统自动运行makefile文件内的指令,接着就是自动编译了,其实和手工编译原理相同,只是makefile实现了自动化编译而已。至于怎么写?不同类型的程序有各自的编译器和编译指令,不是很复杂的编译过程不用makefile最好,gtk+编程最喜欢使用makefile了,你去看看gtk+编程例子里的makefile吧,QT自动创建的makefile非常恐怖,内容相当复杂 参考技术D http://wiki.netbsd.se/index.php/Basic_Unix_programming#Using_BSD_Make
去看看,也许有帮助
以上是关于Linux下makefile文件的编写问题!的主要内容,如果未能解决你的问题,请参考以下文章