注:本文参照博客:https://blog.csdn.net/initphp/article/details/7692923

1. 概述

Makefile是一个C语言的程序编译规则。它能够帮助C语言建立自动化编译流程。一旦写好,便可以通过执行make命令,来编译整个工程。

2. 示例说明

创建项目如下:

val.h和val.c

val.h

    #include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int val(int *x);

val.c

    #include "val.h"
int val(int *x) {
puts("This is value=");
printf("x:%d\n",*x);
return 0;
}

get.h和get.c

get.h

    #include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int get(int *x,int *y);

get.c

    #include "get.h"
int get(int *x,int *y) {
puts("This is get");
return(*x)*(*y);
}

sum.h和sum.c

sum.h

    #include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int sum(int *x,int *y);

sum.c

    #include "sum.h"
#include "val.h"
int sum(int *x,int *y){
val(x);
puts("This is sum method");
return *x + *y;
}

main.c

    #include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include "sum.h"
#include "get.h"
int main(){
int x = 10;
int y = 20;
int z = sum(&x,&y);
puts("This is Main");
printf("z:%d\n",z);
x = 20;
z = get(&x,&y);
printf("z:%d\n",z);
return 1;
}

2.1 无makefile编译

生成中间目标文件

执行:gcc -c val.c get.c sum.c main.c

生成可执行文件

执行:gcc -o main main.o val.o sum.o get.o

2.2 有makefile编译

编辑makefile文件

注意:命令行需要[tab]键的空格

    main: get.o sum.o val.o main.o
gcc -o main get.o sum.o val.o main.o
main.o:main.c
gcc -c main.c
val.o:val.h val.c
gcc -c val.c
sum.o:val.h sum.h sum.c
gcc -c sum.c
get.o:get.h get.c
gcc -c get.c
clean:
rm -rf *.o

执行make命令

3.Makefile详解

3.1 Makefile的文件名称

makefile或者Makefile,一般采用大写(大写比较引人注目)。

当执行make命令时,工具会从当前目录寻找makefile文件。

3.2 目标可执行文件

main:get.o sum.o val.o main.o,main为目标可执行文件,也就是编译最后成功的文件名称。冒号后面的就是整个可执行文件依赖的中间目标文件。

3.3 中间目标文件

以.o结尾的就是中间目标文件。冒号后面跟的是目标文件的依赖文件:.h和.c文件

3.4 生成目标文件的命令

gcc命令代表将中间的目标文件连接起来,最终生成目标可执行文件。需要主要的是,命令行都是在第二行,且以tab键的空格,否则会不生效。

3.5 换行符\

如果一行太长,可以通过符号\来进行换行。

3.6 clean清除操作

clean是动作命令。make clean会清除的目标中间文件.o

4. 执行流程

  1. 当用户敲下make命令时,make工具会去找当前C工程目录下的Makefile或者makefile文件
  2. 找到Makefile这个文件后,它会找到第一个目标文件。然后去当前C工程目录下是否有main这个可执行的文件。然后判断这个可执行文件是否是最新的,如果是最新的,则不需要编译
  3. 如果不存在main这个可执行文件,make命令就会去生成.o中间目标文件,然后生成main可执行文件
  4. 如果main存在,make回去比较中间文件.o文件是否更新,如果是最新的则不需要更新,不是最新的继续往下找依赖,找到有需要更新的目标文件的时候,就会执行编译命令
  5. 整个make的依赖性就是make会一层层去找依赖关系,并且比较是否需要更新,直到编译出最终的可执行目标文件

5. 变量使用

Make file中也可以使用变量。变量可以用object或者" role="presentation" style="font-size: 100%; display: inline-block; position: relative;">或者object或者(object)这样的方式使用。

使用变量最大的好处就是大大简化了Makefile编写难度,增强了Makefile文件的可维护性

    object = get.o sum.o val.o main.o
main:${object}
gcc -o main${object}
main.o:main.c
gcc -c main.c
val.o:val.h val.c
gcc -c val.c
sum.o:val.h sum.h sum.c
gcc -c sum.c
get.o:get.h get.c
gcc -c get.c
clean:
rm -rf *.o

6. make的自动推导功能

object = get.o sum.o val.o main.o
main:${object}
gcc -o main${object}
main.o:get.h sum.h
val.o:val.h
sum.o:val.h sum.h
get.o:get.h
clean:
rm -rf *.o

7. include引用其他文件

Linux-C-Program:makefile的更多相关文章

  1. Linux kernel的 Makefile和Kconfig以及Make menuconfig的关系【转】

    本文转载自:http://blog.sina.com.cn/s/blog_4ba5b45e0102e6vp.html 熟悉内核的Makefile对开发设备驱动.理解内核代码结构都是非常重要的linux ...

  2. ti processor sdk linux am335x evm Makefile hacking

    # # ti processor sdk linux am335x evm Makefile hacking # 说明: # 本文主要对TI的sdk中的Makefile脚本进行解读,是为了了解其工作机 ...

  3. 【总结】嵌入式linux内核中Makefile、Kconfig、.config的关系及增加开机Hello World【转】

    本文转载自:http://blog.csdn.net/fengyuwuzu0519/article/details/73772109 为了弄清内核的组织结构,我们先来实现下面这个简单的例子. 一.增加 ...

  4. linux内核的makefile.txt讲解

    linux内核的linux-3.6.5\Documentation\kbuild\makefiles.txt Linux Kernel Makefiles This document describe ...

  5. Linux编程(3) MakeFile

    1. 在Linux中,make工具可以维护程序模块关系和生成可执行程序.它可根据程序模块的修改情况重新编译链接生成中间代码或最终的可执行程序.执行make命令,需要一个名为Makefile的文本文件, ...

  6. [转]Linux下的Makefile

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

  7. Linux Kernel的Makefile与Kconfig文件的语法

    https://www.kernel.org/doc/Documentation/kbuild/kconfig-language.txt Introduction ------------ The c ...

  8. Linux下编写 makefile 详细教程

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

  9. [转]Linux中configure/makefile

    本文教你如何使用autoconf.automake等来制作一个以源代码形式(.tar.gz)发布的软件.并可在执行configure时使用自定义参数. 一.概述和基础知识 在Linux下得到一个以源代 ...

  10. linux 下如何 makefile

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

随机推荐

  1. EntityFramework Code-First 简易教程(十一)-------从已存在的数据库中映射出表

    怎样从一个已存在的数据库中映射表到 entity 实体? Entity Framework 提供了一个简便方法,可以为已存在的数据库里的所有表和视图创建实体类(entity class),并且可以用 ...

  2. [HDFS_add_2] SecondaryNameNode 滚动 NameNode 数据流程

    0. 说明 在 将 SecondaryNameNode 配置到 s105 节点上 的基础上进行 SecondaryNameNode 滚动 NameNode 数据流程 分析 1. SecondaryNa ...

  3. 彻底修改 Windows 系统用户名

    在 Windows 安装的时候会输入一个用户名,电脑店装的一般都会给你设置成Admin之类的.这个时候你想要改成自己的,一般都是直接在 控制面板 > 用户帐户和家庭安全 > 用户帐户 &g ...

  4. Linux系统将http转为https

    想把网站由http访问转变为https访问并没有想象中那么难,网上查了一些资料,想要转为https需要SSL安全证书,这里推荐一款景安网络的证书,可以免费试用一年时间,自己拿来实践还是很不错的选择. ...

  5. 基于jquery的从一个页面跳转到另一个页面的指定位置的实现代码

    比如 想跳到 mao.aspx 的页面 的div id="s" 的位置 那么 只用<a href="mao.aspx#s"> 就可实现跳转到指定位置 ...

  6. Django admin 后台管理

    在App 文件夹下的 admin.py 文件中写入 from django.contrib import admin from app名 import models admin.site.site_h ...

  7. numpy的random模块

    随机抽样 (numpy.random) 简单的随机数据 rand(d0, d1, ..., dn) 随机值 >>> np.random.rand(3,2) array([[ 0.14 ...

  8. 基于php实现QQ授权登陆

    第一步: 首先登陆QQ互联首页https://connect.qq.com/进行个人/企业认证.大概审核时间在一周左右. 认证通过之后创建应用: 这里主要用到应用的APP ID 和 APP Key  ...

  9. 在H5页面内通过地址调起高德地图实现导航

    项目中用到的一个功能是要通过点击地址来实现打开地图app实现地址导航. 如下图: 实现思路就是在H5页面内通过点击marker图标然后进行当前位置与页面上地址的路程规划与导航. 由于项目中用到的是高德 ...

  10. 使用ElasticSearch服务从MySQL同步数据实现搜索即时提示与全文搜索功能

    最近用了几天时间为公司项目集成了全文搜索引擎,项目初步目标是用于搜索框的即时提示.数据需要从MySQL中同步过来,因为数据不小,因此需要考虑初次同步后进行持续的增量同步.这里用到的开源服务就是Elas ...