1. 如何自己编写Makefile
如何自己编写Makefile 相信很多朋友都有过这样的经历,看着开源项目中好几页的makefile文件,不知所云。
在日常学习和工作中,也有意无意的去回避makefile,能改就不写,能用ide就用ide。其实makefile并没有想象的那么难写,只要你明白了其中的原理,自己实践几次。
你也可以自己写makefile,让别人对你头来羡慕的目光。 下面本人介绍一下自己的学习成果,初学阶段,欢迎大家多多指正。
简单的说,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至可以在makefile中执行shell脚本。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
关于程序的编译和链接 一般来说,无论是C还是C++,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile),一般来说,每个源文件都应该对应于一个中间目标文件(O文件或是OBJ文件)。然后再把大量的Object File合成执行文件,这个动作叫作链接(link)。
编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在C/C++文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。
链接时,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件(O文件或是OBJ文件)来 链接我们的应用程序。链接器并不管函数所在的源文件,只管函数的中间目标文件(Object File),在大多数时候,由于源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给 中间目标文件打个包,在Windows下这种包叫“库文件”(Library File),也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件。
下面我们开始看看如何自己写出makefile。 Makefile的规则 目标 : 需要的条件 (注意冒号两边有空格) 命令 (注意前面用tab键开头) 解释一下: 1 目标可以是一个或多个,可以是Object File,也可以是执行文件,甚至可以是一个标签。
2 需要的条件就是生成目标所需要的文件或目标 3 命令就是生成目标所需要执行的脚本 总结一下,就是说一条makefile规则规定了编译的依赖关系,也就是目标文件依赖于条件,生成规则用命令来描述。在编译时,如果需要的条件的文件比目标更新的话,就会执行生成命令来更新目标。
下面举个简单的例子说明。如果一个工程有3个头文件,和8个C文件,我们为了完成前面所述的那三个规则,我们的Makefile应该是下面的这个样子的。
edit : main.o kbd.o command.o display.o / insert.o search.o files.o utils.o cc -o edit main.o kbd.o command.o display.o / insert.o search.o files.o utils.o main.o : main.c defs.h cc -c main.c kbd.o : kbd.c defs.h command.h cc -c kbd.c command.o : command.c defs.h command.h cc -c command.c display.o : display.c defs.h buffer.h cc -c display.c insert.o : insert.c defs.h buffer.h cc -c insert.c search.o : search.c defs.h buffer.h cc -c search.c files.o : files.c defs.h buffer.h command.h cc -c files.c utils.o : utils.c defs.h cc -c utils.c clean : rm edit main.o kbd.o command.o display.o / insert.o search.o files.o utils.o 将上面的内容写入到Makefile文件中,然后执行make就可以进行编译,执行make clean就可以删除所有目标文件。解释一下,也就是说生成最终的目标文件edit,依赖于一系列的.o目标文件,而这些.o文件又是需要用源文件来编译生成的。
需要注意的是,clean后面没有条件,而clean本身也不是文件,它只不过是一个动作名字,其冒号后什么也没有,那么,make就不会自动去找文件的依赖性,也就不会自动执行其后所定义的命令。 make是如何工作的 在默认的方式下,也就是我们只输入make命令。
那么, 1、make会在当前目录下找名字叫“Makefile”或“makefile”的文件。 2、如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“edit”这个文件,并把这个文件作为最终的目标文件。
3、如果edit文件不存在,或是edit所依赖的后面的 .o 文件的文件修改时间要比edit这个文件新,那么,他就会执行后面所定义的命令来生成edit这个文件。 4、如果edit所依赖的.o文件也不存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。
(这有点像一个堆栈的过程) 5、当然,你的C文件和H文件是存在的啦,于是make会生成 .o 文件,然后再用 .o 文件生命make的终极任务,也就是执行文件edit了。 makefile中使用变量 前面的知识已经足以让你自己完成一个简单的makefile了,不过makefile的精妙之处远不止如此,下面来看看如何在makefile中使用变量吧。
在上面的例子中,先让我们看看edit的规则: edit : main.o kbd.o command.o display.o / insert.o search.o files.o utils.o cc -o edit main.o kbd.o command.o display。.。
2. 如何写Makefile文件
如果你想写 Makefile 的话,那么你只要用一个不将制表符过滤掉的文本编辑器就可以了,用 vi/vim 可以,用 emacs 可以,用其它的 geditor 也是可以的,只要是文本编辑器就可以了。你在 win 下也可以用记事本写 Makefile ,当然要确保你的系统已经安装了 make 了(最好了 GNU make)。Makefile 是不需要后缀的,也就是说 Makefile 的文件名就是 Makefile。
下面我给出一个我写的一个简单的 Makefile 给你参考一下吧:
# Makefile for 'kmp'
CC=gcc
CFLAGS=-g
kmp: kmpindex.o getnext.o main.o
$(CC) -o kmp kmpindex.o getnext.o main.o
kmpindex.o: kmpindex.c kmp.h
$(CC) -c kmpindex.c
getnext.o: getnext.c kmp.h
$(CC) -c getnext.c
main.o: main.c kmp.h
$(CC) -c main.c
clean:
rm -f *.o
# END
没有太多的注释,因为是用于小测试的。希望对你有所帮助
3. 怎么写这个程序的Makefile文件
Makefile文件名字,放在这个你这个程序的目录中:
prog=app
OBJS=sin_value.o cos_value.o haha.o main.c
LDFLAGS:= #这个是编译参数例:-lpthread 线程库
CFLAGS:= -g -Wall #可调式,以及编译警告通知
all:$(prog)
sin_value.o:sin_value.c
$(CXX) $(CFLAGS) -c -o $@ $^
cos_value.o:cos_value.c
$(CXX) $(CFLAGS) -c -o $@ $^
haha.o: haha.c
$(CXX) $(CFLAGS) -c -o $@ $^
main.o:main.c
$(CXX) $(CFLAGS) -c -o $@ $^
install:
cp $(prog) /bin
clean:
rm -rf *.o *~
rm -rf $(prog)
rm -rf /bin/$(prog)
$(prog):$(OBJS)
$(CXX) $(LDFLAGS) -o $@ $^
4. 这个makefile文件怎么写
obj-m =xxx.o
KDIR=xxx
PWD =$(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
clean:
@rm -vf *.o *.ko *. *.mod.c *.order *.mod.o *.symvers *~
其中的xxx.o需要你自己填写,比如你这个文件是hello.c,那就写成hello.o,然后KDIR=xxx,这个xxx是linux源码目录,比如/home/xxx/kernel,那就写成KDIR = /home/xxx/kernel,然后在Makefile的目录下执行make就行了
5. 怎么写这个程序的Makefile文件
Makefile文件名字,放在这个你这个程序的目录中:prog=appOBJS=sin_value.o cos_value.o haha.o main.cLDFLAGS:= #这个是编译参数例:-lpthread 线程e5a48de588b63231313335323631343130323136353331333262373935库CFLAGS:= -g -Wall #可调式,以及编译警告通知all:$(prog)sin_value.o:sin_value.c $(CXX) $(CFLAGS) -c -o $@ $^ cos_value.o:cos_value.c $(CXX) $(CFLAGS) -c -o $@ $^ haha.o: haha.c $(CXX) $(CFLAGS) -c -o $@ $^ main.o:main.c $(CXX) $(CFLAGS) -c -o $@ $^ install: cp $(prog) /binclean: rm -rf *.o *~ rm -rf $(prog) rm -rf /bin/$(prog)$(prog):$(OBJS) $(CXX) $(LDFLAGS) -o $@ $^。
6. 编写一个简单的 makefile 文件
makefile文件里面主要有三种内容: 1.变量声明: 变量声明就是一种基本的严格字符替换的操作。
比如在前面声明了:objects=program.o foo.o utils.o 那么在后面出现的所有$(objects)或者${objects}都会被自动替换成上面的那个字符序列,而且是严格替换,即不带空格的。 2.映射法则 3.命令: 映射法则和命令通常都是联合起来组成这样的结构形式: target。
: prerequisites.. command 可以简单地理解为通过prerequisites,也就是先决的依赖文件,采取后面描述的相应的命令(这里的命令都是linux里的shell命令)command之后(一般是)生成了文件target。命令的前面都要按以下tab建留一段空白来表示它是命令。
有的target后面并没有先决条件,也就是后面的命令是无条件执行的。makefile 文件c语言程序:#include
7. 如何写一个简单的makefile
一:makefile 雏形:#makefile的撰写是基于规则的,当然这个规则也是很简单的,就是:#target : prerequisitescommand //任意的shell 命令实例如下:makefile:helloworld : main.o print.o #helloword 就是我们要生成的目标# main.o print.o是生成此目标的先决条件gcc -o helloworld main.o print.o#shell命令,最前面的一定是一个tab键mian.o : mian.c print.hgcc -c main.cprint.o : print.c print.hgcc -c print.cclean :rm helloworld main.o print.oOK,一个简单的makefile制作完毕,现成我们输入 make,自动调用Gcc编译了,输入 make clean就会删除 hellowworld mian.o print.o二:小步改进:在上面的例子中我们可以发现 main.o print.o 被定义了多处,我们是不是可以向C语言中定义一个宏一样定义它呢?当然可以:makefile:objects = main.o print.o #应该叫变量的声明更合适helloworld : $(objects) //声明了变量以后使用就要$()了gcc -o helloworld$(objects)mian.o : mian.c print.hgcc -c main.cprint.o : print.c print.hgcc -c print.cclean :rm helloworld $(objects)修改完毕,这样使用了变量的话在很多文件的工程中就能体现出方便性了。
三:再进一步:再看一下,为没一个*.o文件都写一句gcc -c main.c是不是显得多余了,能不能把它干掉?而且 main.c 和print.c都需要print.h,为每一个都写上是不是多余了,能不能再改进?能,当然能了:makefile:objects = main.o print.ohelloworld : $(objects)gcc -o helloworld$(objects)$(objects) : print.h # 都依赖print.hmian.o : mian.c #干掉了gcc -c main.c 让Gun make自动推导了。print.o : print.cclean :rm helloworld $(objects)。
转载请注明出处育才学习网 » makefile文件怎么写