make与makefile的几个例子和(自己写一下,汗!忘记了!)总结
共用的几个源代码文件:
main.c 2.c 3.c
代码依次为:
1 #include<stdlib.h> 2 #include "a.h" 3 extern void function_two(); 4 extern void function_three(); 5 6 int main() 7 { 8 function_two(); 9 function_three(); 10 exit (EXIT_SUCCESS); 11 }
#include "a.h" #include "b.h" void function_two(){}
#include "b.h" #include "c.h" void function_three(){}
还有三个文件:a.h b.h c.hz使用shell命令创建它们。
touch a.h b.h c.h
第一个版本的makefile
1 all:myapp 2 3 # Which compiler 4 cc = gcc 5 6 # Where are include files kept 7 INCLUDE = . 8 9 # Options for development 10 CFLAGS = -g -Wall -ansi 11 12 myapp: main.o 2.o 3.o 13 $(cc) -o myapp main.o 2.o 3.o 14 15 main.o: main.o a.h 16 $(cc) -I$(INCLUDE) $(CFLAGS) -c main.c 17 18 2.o:2.c a.h b.h 19 $(cc) -I$(INCLUDE) $(CFLAGS) -c 2.c 20 21 3.o:3.c b.h c.h 22 $(cc) -I$(INCLUDE) $(CFLAGS) -c 3.c
第二个版本的makefile
1 all:myapp 2 3 # Which compiler 4 cc = gcc 5 6 # Where to install 7 INSTDIR = /usr/local/bin 8 9 # Where are include files kept 10 INCLUDE = . 11 12 # Options for development 13 CFLAGS = -g -Wall -ansi 14 15 myapp: main.o 2.o 3.o 16 $(cc) -o myapp main.o 2.o 3.o 17 18 main.o: main.o a.h 19 $(cc) -I$(INCLUDE) $(CFLAGS) -c main.c 20 21 2.o:2.c a.h b.h 22 $(cc) -I$(INCLUDE) $(CFLAGS) -c 2.c 23 24 3.o:3.c b.h c.h 25 $(cc) -I$(INCLUDE) $(CFLAGS) -c 3.c 26 27 clean: 28 -rm main.o 2.o 3.o 29 30 install: myapp 31 @if [-d $(INSTDIR) ]; \ 32 then \ 33 cp myapp $(INSTDIR); && \ 34 chmod a+x $(INSTDIR)/myapp; && \ 35 chmod og-w $(INSTDIR) /myapp; && \ 36 echo "Installed in $(INSTDIR)";\ 37 else \ 38 echo "Sorry, $(INSTDIR) does not exist";\ 39 fi
第三个版本的makefile
all:myapp # Which compiler cc = gcc # Where to install INSTDIR = /usr/local/bin # Where are include files kept INCLUDE = . # Options for development CFLAGS = -g -Wall -ansi myapp: main.o 2.o 3.o $(cc) -o myapp main.o 2.o 3.o main.o: main.o a.h $(cc) -I$(INCLUDE) $(CFLAGS) -c main.c 2.o:2.c a.h b.h $(cc) -I$(INCLUDE) $(CFLAGS) -c 2.c 3.o:3.c b.h c.h $(cc) -I$(INCLUDE) $(CFLAGS) -c 3.c clean: -rm main.o 2.o 3.o install: myapp @if [-d $(INSTDIR) ]; \ then \ cp myapp $(INSTDIR); && \ chmod a+x $(INSTDIR)/myapp; && \ chmod og-w $(INSTDIR) /myapp; && \ echo "Installed in $(INSTDIR)";\ else \ echo "Sorry, $(INSTDIR) does not exist";\ fi
第四个版本的makefile
all: myapp # Which compiler CC = gcc # Where to install INSTDIR = /usr/local/bin # Where are include files kept INCLUDE = . # Options for development CFLAGS = -g -Wall -ansi # Options for release # CFLAGS = -O -Wall -ansi # Local Libraries MYLIB = mylib.a myapp: main.o $(MYLIB) $(CC) -o myapp main.o $(MYLIB) $(MYLIB): $(MYLIB)(2.o) $(MYLIB)(3.o) main.o: main.c a.h 2.o: 2.c a.h b.h 3.o: 3.c b.h c.h clean: -rm main.o 2.o 3.o $(MYLIB) install: myapp @if [ -d $(INSTDIR) ]; \ then \ cp myapp $(INSTDIR);\ chmod a+x $(INSTDIR)/myapp;\ chmod og-w $(INSTDIR)/myapp;\ echo "Installed in $(INSTDIR)";\ else \ echo "Sorry, $(INSTDIR) does not exist";\ fi
就上述例子做个总结:
1.第一行要指定:all的对象
2.table所在,命令所在。即所有命令均以table键开头。
3.#键所在,注释所在。
4.$( )所在,宏定义所在。
5. . 点所在,即为当前目录。
6. -I 表示指定目录。
7. 内置宏定义:
$d:表示目录
makefile文件结构:
第一点:设定all:可执行文件名
第二点:gcc -MM 主文件名
输出依赖关系
第三点:然后根据依赖关系写命令
第一.写生成可执行文件的命令,且后面根着的是目标文件。
第二.写生成目标文件的命令即编译函数(包括主函数)文件什么,且后面根着的是源文件
不要让今天成为明天的遗憾!