在Linux下写写简单的程序可以使用gcc/g++进行编译,若涉及的.c文件太多,则使用起来太麻烦,容易出错,且灵活性不高。
如:涉及文件有hello.c add.c等等
编译:gcc -o hello hello.c(未包含add.c文件)
gcc -o hello.o -c hello.c
gcc -o add.o -c add.c
gcc -o hello hello.o add.o(才可)
只是多了一个add.c文件,要是包含更多.c文件光是写命令就要耗费大量的时间。开发效率及其的低。
make 是一种能够控制编译或者重复编译软件的工具。
makefile是一个文本形式的脚本文件,其中包含一些规则告诉make编译哪些文件,怎样编译以及在什么条件下编译。
makefile规则遵循以下通用形式
target:dependency[dependency[...]]
command
command
......
每一个command的第一字符前面必须加上tab键。
举例说明:
最简单的形式
vi makefile
strat:hello.o
gcc -o hello hello.o
hello.o:
gcc -o hello.o hello.c
解析:start代表标号,hello.o代表依赖项,执行第一个标号,看是否有依赖项,若有则寻找此依赖项的标号,找到后即执行命令语句。(命令行输入make即可)
进一步完善makefile文件
start:hello.o
gcc -o hello hello.o
@echo '----------ok-----------'
hello.o
gcc -o hello.o hello.c
clean:
rm -f hello.o
解析:多加一个标号,可以通过命令行输入make clean,再调用此命令行。增加了@echo显示编译成功语句,为了将语句本身输出,加上@符号可以不输出命令。
更简单的使用makefile
在makefile中使用变量通过替换依赖项来完成。把变量用括号括起来,前面加上$就可以引用该变量的值,如$(varname),按习惯makefile的变量都是大写。
如:
CC = gcc
SRCS = hello.c
OBJS = hello.o
EXEC = hello
start:$(OBJS)
$(CC) -o $(EXEC) $(OBJS)
OBJS:
$(CC) -o $(OBJS) -c $(SRCS)
clean:
rm -f $(OBJS)
通过使用.SUFFIXES:.c .o(告诉make代表.c和.o之间有关系)若写的是.CPP文件时,应在将.c换成.cpp
如:
OBJS = $(>SUFFIXES:.c = .o)
$@ 常规的目标所对应的文件名(依赖项)
$< 规则中的第一个相关的文件名(被依赖项)
如:
.SUFFIXES:.c .o 若写的是.CPP文件时,应在将.c换成.cpp
CC = gcc
SRCS = hello.c
OBJS = $(SRCS:.c = .o) 若写的是.CPP文件时,应在将.c换成.cpp
EXEC = hello
start:$(OBJS)
$(CC) -o $(EXEC) $(OBJS)
.c.o: 若写的是.CPP文件时,应在将.c换成.cpp
$(CC) -o $@ -c $<
clean:
rm -f $(OBJS)
在makefile文件中同时编译多和源文件
如:hello.c add.c
即:
.SUFFIXES:.c .o 若写的是.CPP文件时,应在将.c换成.cpp
CC = gcc
SRCS = hello.c\
add.c
OBJS = $(SRCS:.c = .o) 若写的是.CPP文件时,应在将.c换成.cpp
EXEC = hello
start:$(OBJS)
$(CC) -o $(EXEC) $(OBJS)@echo '----------ok-----------'
-c.o: 若写的是.CPP文件时,应在将.c换成.cpp
$(CC) -o $@ -c $<
clean:
rm -f $(OBJS)