标签:make linux linux unix常用指令 编译器
Makefile是一个文本形式的脚本,其中包含一些规则告诉编译器编译哪些文件,以及如何编译,make可以自动管理软件的编译内容、方式和时机,从而是程序员把更多的经历集中在编写代码上。
Makefile规则遵循一下通用形式:
Target:dependency[dependency[…]]
Commad
command
[….]
每个command第一个字符必须是一个tab键,而不是空格,否则make会报错
每次在终端输入make是 会自动执行当前目录下的makefile文件
start:hello.o
gcc – o hello hello.o
hello.o:
gcc –o hello.o hello.c
先执行 第一句 (gcc – o hellohello.o) 但是第一句上有一个依赖start(start称为标号target): 冒号之后的部分就是他的依赖,执行第一句的时候它会先扫描指定文件夹下是否有需要的依赖文件,如果没有则先执行后面的标号为此时需要的依赖(例如执行start:hello.o的时候需要hello.o 的依赖所以去执行标号为hello.o的语句)。
还有一种情况当第一个标号后还有一个标号,但是却不是需要的标号,而且也没有有依赖
则这种情况下这个标号不会被执行,只有在make的时候在make之后加上指定的标号
例如:
start:hello.o
gcc – o hello hello.o
ALL:
echo hello world
hello.o:
gcc –o hello.o hello.c
如果在echo前面加上@ 则只输出 helloworld
所以当我们编译生成 *.o文件的时候 可以用一个标号来删除它
clean:
rm –f *.o
为了简化编辑和维护makefile,可以在makefile中使用变量。
Varname = some_text
变量使用:用括号将varname括起来,并加上$
$(varname)
按照管理makefile的变量都是大写(只是习惯而已, 不是必须的)
结果和原来是一样的,使用变量是makefile变得更灵活简介。
更加方便一些的有:
SRCS=hello.c
OBJS=$(SRCS:.c=.o)替换SRCS的.c 替换 .o
.SUFFIXES:.c .o
表示声明 扩展名为 .c .o的文件 是有关联的
$@ 规则的目标所对应的文件名(目标由$(OBJS)决定)
$< 规则中的第一个相关文件名。因为目标为hello.o 有.o 所以 $<根据规则,其代表的文件名为 hello.c
执行结果:
这样的规则模式主要用于多个文件同时编译:
如下实例:
.SUFFIXES:.c .o //.c和.o建立关联
CC=gcc
SRCS=hello.c\
add.c //同时编译两个.c文件
OBJS=$(SRCS:.c=.o)//ORJS=hello.o add.o
EXEC=hello
start: $(OBJS) //依赖hello.oadd.o
$(CC) -o $(EXEC)$(OBJS)
@echo‘----------------ok------------‘
.c.o:
$(CC) -o $@ -c$< //自动根据$(OBJS) 中.o的数量循环编译, 直到编译完所有的.c文件
clean:
rm -f $(OBJS)
在编译后以后我再一次执行make
只有链接操作
但是当我修改add.c 文件的代码后再执行make
节省了很多编译时间
make常见错误:
No rule to make target ‘target’.Stop
没有包含指定的target
** missing separator
在command前没有使用tab键而使用了空格代替(一般)
标签:make linux linux unix常用指令 编译器
原文地址:http://blog.csdn.net/lingdi2000/article/details/45080737