博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第2课 - 初识makefile的结构
阅读量:5797 次
发布时间:2019-06-18

本文共 1838 字,大约阅读时间需要 6 分钟。

1. makefile 的意义

  (1)makefile 用于定义源文件之间依赖关系 (在阅读开源软件源码时,可通过Makefile掌握源码中各个文件之间的关系

  (2)makefile 说明如何编译各个源文件生成可执行程序  

 

2. makefile 的规则

  (1)makefile 规则的定义

      形式1:targets : prerequisites  command

      形式2:targets : prerequisites 

          '\t'     command      

  (2)makefile 规则中各元素的含义

    targets 目标

        • 通常是需要生成的目标文件名  
        • make 所需执行的命令名称

    prerequisities 依赖        

        • 当前目标所依赖的其它目标文件

    command 命令

        • 完成目标所需要执行的命令系统自带命令 — PATH 环境变量、用户命令 — 自己指定路径)

  (3)规则中的注意事项

    targets 可以包含多个目标

        • 使用空格对多个目标进行分隔  

    prerequisities 可以包含多个依赖          

        • 使用空格对多个依赖进行分隔

    [Tab] 键: '\t'

        • 每一个命令行必须以 [Tab] 字符开始
        • [Tab] 字符告诉 make 此行是一个命令行

    续行符: \ 

        • 可以将内容分开写到下一行,提高程序的可读性

    makefile可以在命令前添加 @ 符号,使该命令静默执行

  (4)一个 makefile 的规则示例 

all : test    @echo "make all"    test :    @echo "make test"

 

 

3. makefile依赖(prerequisites)的规则

  (1)当目标对应的文件不存在时执行对应的命令

  (2)当依赖在时间上比项目更新时执行对应的命令

  (3)当依赖关系连续发生时,对比依赖链上的每一个目标

 

4. makefile编程实验

mian.c源码

//mian.c源码int main(void){     func();     return 0;}

 

func.c源码

//func.c源码#include "stdio.h"void foo(){    printf("void foo() : hello makefile\n");}

 

makefile源码

//makefile源码hello.out all : func.o main.o    gcc -o hello.out func.o main.o    func.o : func.c    gcc -o func.o -c func.c    main.o : main.c    gcc -o main.o -c main.c

 运行结果:

  

 

结论:

  (1)工程开发中可以将 最终可执行文件名 和 all 同时作为makefile第一条规则的目标。但最终可执行文件名要放在all之前make默认使用多个目标中的首个目标这样做的好处是当默认执行make时,make自行判断依赖关系有没有发生更新,如果没有就不会重新编译程序。如果这里用all作为目标,由于不存在all这个文件,每次执行make时,第一条规则的命令总会被执行,这与实际不符。如果需要强制编译该程序,执行 make all 即可

  (2)makefile不仅可以用在C/C++中,同样可以用在其它编程语言中,如Java等。makefile只是解决问题的一种方法,但普遍应用于C/C++中

 

java源码

//java源码public class HelloJava {    public static void main(String[] args) {        System.out.println("Hello Java!");    }}

 

 makefile源码

//makefile源码HelloJava.class all: HelloJava.java    @javac HelloJava.java    @java HelloJava

 运行结果:

  

 

 

 

 

转载于:https://www.cnblogs.com/hoiday/p/9241407.html

你可能感兴趣的文章
锐捷交换机密码恢复(1)
查看>>
Kali linux virtualbox rc=1908 错误解决办法
查看>>
Erlang学习总结之Erlang语法中的逗号(,)、分号(;),句号(.)的正确用法...
查看>>
linux软件包管理之三(源代码安装)
查看>>
数据库三范式是什么?
查看>>
[转载]设置Ubuntu自动连接无线,无须再输入密钥环和无线密码
查看>>
九叔Xen App测试报告
查看>>
Apache配置
查看>>
Ext gridPanel 单元格数据的渲染
查看>>
Android SDK 的下载代理
查看>>
Method Swizzling对Method的要求
查看>>
佛祖保佑,永不宕机
查看>>
四、配置开机自动启动Nginx + PHP【LNMP安装 】
查看>>
LNMP一键安装
查看>>
SQL Server数据库概述
查看>>
Linux 目录结构及内容详解
查看>>
startx命令--Linux命令应用大词典729个命令解读
查看>>
华为3026c交换机配置tftp备份命令
查看>>
Oracle命令导入dmp文件
查看>>
OCP读书笔记(24) - 题库(ExamD)
查看>>