注:本文参照博客: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. 慕学在线网0.2_users表设计(1)

    1.Django App设计: users-用户管理(任何web中,users表都是第一个被设计的) course-课程管理 organization-机构和教师管理 operation-用户操作管理 ...

  2. Java新建Web应用与配置Tomcat流程

    1. 新版本IDEA新建Web应用后没有web.xml文件,需要通过下图方式添加 2. IDEA中的web文件夹相当于eclipse里的WebRoot文件夹,在里面新建WEB-INF文件夹,再创建cl ...

  3. Oracle EBS FA 获取累计折旧

    FUNCTION get_ltd_deprn(p_asset_id IN NUMBER, p_book_type_code IN VARCHAR2, p_rate_source_rule IN VAR ...

  4. Sql_server基本操作

    使用Sql_server创建表,视图,触发器,存储过程,函数等基本操作. create table test1( /* 创建一个表 */ num int ) alter table test1 /* ...

  5. Linux中用find命令查找当前文件夹下的.elf文件

    find ./ -name "*.elf" 注意:""不能少

  6. Jmeter压力测试简单教程(包括服务器状态监控)

    前段时间公司需要对服务器进行压力测试,包括登录前的页面和登录后的页面,主要目的是测试负载均衡的实现效果.不知道是不是因为Jmeter不如loadRunner火爆还是什么,网上关于Jmeter的资料有很 ...

  7. python中remove的一些坑

    前几天,使用python时遇到这么一个需求,删除一个列表中值为1的元素.我寻思着使用remove方法,但是remove方法只会删除第一个,于是我使用for循环去删除.代码和运行结果如下: 当时这个结果 ...

  8. 在Oracle中使用Guid

    sys_guid()  -  唯一索引 在Oracle中可以用SYS_GUID()来生成一个guid,相当于msSql中的newid(). 在Oracle9i和Oracle 10g 里SYS_GUID ...

  9. ethereum/EIPs-712 Ethereum typed structured data hashing and signing

    https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md eip title author discussions-to status ...

  10. java FTP各种操作

    package com.ailk.qw.util; import it.sauronsoftware.ftp4j.*;import org.slf4j.Logger;import org.slf4j. ...