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. 《转》.NET开源核心运行时,且行且珍惜

    转载自infoQ 背景 InfoQ中文站此前报道过,2014年11月12日,ASP.NET之父.微软云计算与企业级产品工程部执行副总裁Scott Guthrie,在Connect全球开发者在线会议上宣 ...

  2. x:Name标记特性与Name属性

    本文转载自silvergingko的专栏 在Xaml中定义了一个元素后,如果后面要使用该元素,则必须为该元素定义一个元素名称,在随后的Xaml中,通过元素名称来使用该元素. 在Xaml中,元素的名称定 ...

  3. 【leetcode】Interleaving String

    Interleaving String Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. Fo ...

  4. PYTHON实现HTTP基本认证(BASIC AUTHENTICATION)

    参考: http://www.voidspace.org.uk/python/articles/authentication.shtml#id20 http://zh.wikipedia.org/wi ...

  5. Android Studio "diamond operator is not supported" 处理方法

    低版本的android编译环境是不支持使用java7语法的,如果使用了,就会产生上述问题,如果你的android环境较新,那么可以使用以下方法: 在build.gradle的android标签下加入以 ...

  6. Java for LeetCode 031 Next Permutation

    Next Permutation Total Accepted: 33595 Total Submissions: 134095     Implement next permutation, whi ...

  7. 说说GET和POST方法的区别

    完全来自博客园的一篇文章,GET和POST有什么区别?说的非常有道理,学习了. 错误理解 反驳 GET使用URL或Cookie传参.而POST将数据放在BODY中. GET和POST与数据如何传递没有 ...

  8. eclipse + Android Studio 集成 Genymotion 模拟器

    Genymotion 官网 -- android 模拟器https://www.genymotion.com 虚拟机下载安装目录C:\Users\xxx\AppData\Local\Genymobil ...

  9. poj 3253:Fence Repair(堆排序应用)

    Fence Repair Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 23913   Accepted: 7595 Des ...

  10. Android VLC播放器二次开发1——程序结构分析

    最近因为一个新项目需要一个多媒体播放器,所以需要做个视频.音频.图片方面的播放器.也查阅了不少这方面的资料,如果要从头做一个播放器工作量太大了,而且难度也很大.所以最后选择了VLC作为基础,进行二次开 ...