码迷,mamicode.com
首页 > 其他好文 > 详细

make指令入门学习

时间:2015-04-17 11:46:22      阅读:138      评论:0      收藏:0      [点我收藏+]

标签: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还有一个很牛逼的功能,当程序已经编译完毕以后,如果你修改了某一个源文件,你再次编译的时候,并不会全部重新编译一次,只编译被修改的源文件。make通过获取文件的修改时间来比较是否大于目标文件的修改或者生成时间。

 

在编译后以后我再一次执行make

技术分享

只有链接操作

     但是当我修改add.c 文件的代码后再执行make

技术分享

 

节省了很多编译时间

 

 

 

make常见错误:

     No rule to make target ‘target’.Stop

     没有包含指定的target

 

** missing separator

     在command前没有使用tab键而使用了空格代替(一般)

 



make指令入门学习

标签:make   linux   linux unix常用指令   编译器   

原文地址:http://blog.csdn.net/lingdi2000/article/details/45080737

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!