Makefile包含 目标文件、依赖文件、可运行命令三部分。
每部分的基本格式例如以下:
test: prog.o code.o
gcc -o test prog.o code.o
当中,第一行的test是目标文件。 prog.o、code.o是依赖文件;
第二行的gcc -o test prog.o code.o是可运行命令。
整个Makefile文件都是这样的格式。
下面是一些example:
-----------------------Makefile example 1----------------------------------
#this line is the comment for the Makefile
test: prog.o code.o
gcc prog.o code.o -o test
prog.o: prog.c prog.h code.h
gcc -c prog.c -o prog.o
code.o: code.c code.h
gcc -c code.c -o code.o
clean:
rm -f *.o
----------------------------------------------------------------------------------------------
-------------------------------example 2(包括变量)---------------------------------
#this line is the Makefile comment
OBJS = prog.o code.o
CC = gcc
CFLAGS = -Wall -g -O
test: ${OBJS}
${CC} ${CFLAGS} ${OBJS} -o test
prog.o: prog.c prog.h code.h
${CC} ${CFLAGS} -c prog.c -o prog.o
code.o: code.c code.h
${CC} ${CFLAGS} -c code.c -o code.o
clean:
rm -f *.o
------------------------------------------------------------------------------------------------
-------------------------------example 3(使用Makefile的隐含规则)---------------------------------
1,假设没有对应的编译命令,则使用隐含规则,全部的 ".c文件" 编译成与它名称同样的 ".o文件"。
2, 使用Makefile的自己主动变量。
#this line is the Makefile comment
OBJS = prog.o code.o
CC = gcc
test: ${OBJS}
${CC} -o $@ $^
prog.o: prog.c prog.h code.h #no exec command,and will generate the prog.o
code.o: code.c code.h #no exec command,and will generate the code.o
clean:
rm -f *.o
------------------------------------------------------------------------------------------------
-----------------------------------------------------下面为我測试过的实例文件内容 :-----------------------------------------------------
========================== Makefile ===============
#this line is the comment
CC = gcc
OBJS = my_str.o
CFLAGS = -Wall -g -O
program: my_main.c ${OBJS}
${CC} ${CFLAGS} $^ -o $@
my_str.o: my_str.c my_str.h
${CC} ${CFLAGS} -c my_str.c -o my_str.o
clean:
rm -f *.o
=======================================================================
==========================my_main.c=======================
#include <unistd.h>
#include <stdlib.h>
#include "my_str.h"
int
main(int argc, const char **argv)
{
if(my_cmp(argv[1], argv[2]) == 0)
write(1, "Equal !\n", sizeof("Equal !\n"));
else
write(1, "Not Equal !\n", sizeof("Not Equal !\n"));
exit(0);
}
===============================================================
========================my_str.c=============================
#include "my_str.h"
int
my_cmp(const char *str1, const char *str2)
{
if(!str1 || !str2)
return -1;
while(*str1 && *str2 && *str1 == *str2)
str1++, str2++;
return *str1 - *str2;
}
==================================================================
===================my_str.h============================================
#ifndef _MY_STR_H
#define _MY_STR_H
int my_cmp(const char *str1, const char *str2);
#endif
==================================================================