1、程序代码结构如下

makefile/
|-- Makefile
|-- haha.c
`-- hehe.c

  1.1、需要被编译的源代码如下

$ cat haha.c
#include "stdio.h" int main()
{
printf("ha ! ha !\n"); return ;
}
$ cat hehe.c
#include "stdio.h" int main()
{
printf("he ~ he ~\n"); return ;
}

  1.2、makefile的脚本如下

$ cat Makefile
.PHONY : dummy CFLAGS =
LDFLAGS = ALL_FILES = hehe haha all : $(ALL_FILES) hehe : hehe.o
gcc -o hehe hehe.o hehe.o : hehe.c
gcc -c hehe.c -o $@ haha : haha.o
gcc -o haha haha.o haha.o : haha.c
gcc -c haha.c -o haha.o clean : dummy
rm -rf *.o
rm -rf $(ALL_FILES)

  1.3、执行make命令后的编译结果

$ make
gcc -c hehe.c -o hehe.o
gcc -o hehe hehe.o
gcc -c haha.c -o haha.o
gcc -o haha haha.o
-rwxrwxr-x  normal normal  - : haha
-rw-rw-r-- normal normal - : haha.c
-rw-rw-r-- normal normal - : haha.o
-rwxrwxr-x normal normal - : hehe
-rw-rw-r-- normal normal - : hehe.c
-rw-rw-r-- normal normal - : hehe.o
-rw-rw-r-- normal normal - : Makefil

这样我们需要的程序就编译出来了。文件结构如下

makefile/
|-- Makefile
|-- haha
|-- haha.c
|-- haha.o
|-- hehe
|-- hehe.c
`-- hehe.o

多出来了4个文件,haha、haha.o、hehe、hehe.o

  1.4、执行结果

$ ./haha
ha ! ha !
$ ./hehe
he ~ he ~

  1.5 执行命令make clean,结果如下

$ make clean
rm -rf *.o
rm -rf hehe haha

多出来的文件都被删除了,接下来对makefile的脚本文件进行一下讲解。

2、下面是对makefile文件的讲解

  2.1、在make命令执行后,会在当前目录下搜索makefile、Makefile。如果当前目录没有这个两个文件的话就会报错:找不到makefile

$ make
make: *** 没有指明目标并且找不到 makefile。 停止。

  2.2、现在把Makefile改名,用参数-f 来指定要加载的脚本文件也是可以顺利编译的。

$ mv Makefile realmake
$ make -f realmake
gcc -c hehe.c -o hehe.o
gcc -o hehe hehe.o
gcc -c haha.c -o haha.o
gcc -o haha haha.o

  2.3、在Makefile脚本中,make会默认寻找第一个目标进行编译。比如上面的Makefile中,make会从上到下进行扫描,当扫描到“all :”的时候,终于找到一个目标了,然后就会对这个目标进行操作。当make发现这个all需要$(ALL_FILES)的时候,时候就会去寻找$(ALL_FILES)。但是,make在加载脚本的时候会把ALL_FILES变量进行置换为hehe haha,所以换成了寻找hehe和haha进行编译。当执行hehe的时候又发现需要hehe.o,然后又去寻找hehe.o,如此循环寻找吧,直到hehe.c的时候,终于在当前目录找到hehe.c了,这个调用栈才算到头了。

实例讲解Linux下的makefile的更多相关文章

  1. 实例讲解Linux系统中硬链接与软链接的创建

    导读 Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接.硬链接与软链接的区别从根本上要从Inode节点说 ...

  2. linux 下如何 makefile

    本文目的: 尝试着把makefile讲解清楚.非原创,仅仅是学习笔记和备忘录之用. makefile 的目的和好处: 一个工程中的源文件不计数,其按类型.功能.模块分别放在若干个目录中,makefil ...

  3. 简单实例讲解linux的module模块编译步骤

    注:原博文地址http://blog.sina.com.cn/s/blog_4ba5b45e0102v25h.html ---------------------------------------- ...

  4. Linux下编写 makefile 详细教程

    原文地址: https://www.cnblogs.com/mfryf/p/3305778.html 近期在学习Linux下的C编程,买了一本叫<Linux环境下的C编程指南>读到make ...

  5. Linux下对于makefile的理解

    什么是makefile呢?在Linux下makefile我们可以把理解为工程的编译规则.一个工程中源文件不计数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,那些 ...

  6. 实例讲解Nginx下的rewrite规则 来源:Linux社区

    一.正则表达式匹配,其中:* ~ 为区分大小写匹配* ~* 为不区分大小写匹配* !~和!~*分别为区分大小写不匹配及不区分大小写不匹配二.文件及目录匹配,其中:* -f和!-f用来判断是否存在文件* ...

  7. MetaSploit攻击实例讲解------终端下PostgreSQL数据库的使用(包括kali linux 2016.2(rolling) 和 BT5)

    不多说,直接上干货! 配置msf连接postgresql数据库 我这里是使用kali linux 2016.2(rolling)   用过的博友们都知道,已经预安装好了PostgreSQL. 1. p ...

  8. [转]Linux下的Makefile

    Makefile 介绍——————— make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序. 首先,我们用一个示例来说明Makefile的书写规则.以便 ...

  9. 实例讲解Nginx下的rewrite规则(转)

    一.正则表达式匹配,其中:* ~ 为区分大小写匹配* ~* 为不区分大小写匹配* !~和!~*分别为区分大小写不匹配及不区分大小写不匹配二.文件及目录匹配,其中:* -f和!-f用来判断是否存在文件* ...

随机推荐

  1. Android mtk单路录音问题

    在单路录音中,有两种情况导致底层录音资源被占用的问题: 1 开启vmLog后,拨打一个电话,挂断电话.如果挂断电话后,没有关闭vmlog进程,则会导致其它AP 无法得到底层的录音资源,从而无法录音. ...

  2. springMVC 上传文件

    spring mvc(注解)上传文件的简单例子,这有几个需要注意的地方1.form的enctype=”multipart/form-data” 这个是上传文件必须的2.applicationConte ...

  3. 对Java中字符串的进一步理解

    字符串在程序开发中无处不在,也是用户交互所涉及到最频繁的数据类型,那么字符串不仅仅就是我们简单的理解的String str = "abc";一起来更加深入的看一下 在Java中,字 ...

  4. 如何在Ubuntu下安装”.deb“、”.bin“、”.tar.gz“、”.tar.bz2“格式的软件包!

    今天在Ubuntu11.10中安装Google chrome浏览器是遇到了问题,下载好的“.deb”格式的安装文件google-chrome-stable.deb双击后或者右键快捷菜单选择 Synap ...

  5. July 28th, Week 31st Thursday, 2016

    Time is a bird flying into eternity. 时间是一只永远在飞翔的鸟儿. Time waits for nobody. Vitality shows in not onl ...

  6. Oracle 日常应用和操作笔记

    简单整理oracle日常应用笔记. 1.采用excel表格中的数据直接粘贴数据库记录中,默认会在后面加一个空格“”,操作完成后一定要记得对空格匹配然后修改一下. 2.查询数据库里的所有表结构, 采用s ...

  7. 联系旭日150安装CentOS5.X版本手记

    有一台旧电脑.想装个Linux.于是上网查了查.据说可以装CentOS5.3.于是我就去下载了一个. 下载地址可以到http://www.centoscn.com/去下载. 我先下载的是5.3版本的I ...

  8. wp8 -- gameover

    <phone:PhoneApplicationPage.Resources> <Storyboard x:Name="Storyboard1"> <D ...

  9. java中ArrayList 、LinkList区别

    转自:http://blog.csdn.net/wuchuanpingstone/article/details/6678653 个人建议:以下这篇文章,是从例子说明的方式,解释ArrayList.L ...

  10. ER-STUDIO 6.5工具使用帮助的中文翻译

    转自于:http://yujingwang.blog.sohu.com/63362979.html 1       资料 ER-STUDIO的帮助(英文) 2       内容 2.1         ...