Makefile步步为营

本目录主要包含Makefile一步步递进学习的示例代码

makefile代码实例:https://www.lanzous.com/i9m9npi

step0:Makefile小实验

进行Makefile小实验,体验Makefile的功能。

目录中的Makefile是不严谨的编写方式。

目录中的Makefile_PHONY是严谨的编写方式。

make实验

切换至step0目录下,即Makefile所在的同级目录,使用如下命令实验:

#在主机上Makefile所在的目录执行如下命令
#查看当前目录的内容
ls
#执行make命令,make会在当前目录下搜索“Makefile”或“makefile”,并执行
make
#可看到make命令后的输出,它执行了Makefile中编写的命令
#查看执行make命令后的目录内容,多了test.txt文件
ls
#执行Makefile的targetd目标,并查看,少了test.txt文件
make targetd
ls
#执行Makefile的targetb目标,并查看,又生成了test.txt文件
make targetb
ls
#执行Makefile的targetc目标
make targetc

make使用-f参数可以指定使用其它文件。

#通过-f选项指定make使用的Makefile文件
make -f Makefile_PHONY
#本示例中其它操作与Makefile功能相同

step1:使用Makefile编译程序

使用Makefile编译Hello示例程序。

编译

编译的输出为hello_main文件

切换至step1目录下,即Makefile所在的同级目录,使用如下命令编译:

#后编译
make

运行

编译后使用如下命令运行:

./hello_main

step2:使用Makefile默认编译规则

使用Makefile编译Hello示例程序,Makefile中使用o文件依赖

编译及运行

本实验编译及运行操作与step1相同,切换至step2目录操作即可。


step3:使用变量

使用Makefile编译Hello示例程序,Makefile中使用变量

编译及运行

本实验编译及运行操作与step1相同,切换至step3目录操作即可。

Makefile_test实验

Makefile_test文件用于变量赋值实验测试,可执行如下命令实验:

make -f  Makefile
#实验输出为Makefile中各个变量的值

step4:使用变量及分支

使用Makefile编译Hello示例程序,Makefile中使用变量定义最终目标,并使用分支支持不同的架构

x86架构编译及运行

切换至step4目录下,即Makefile所在的同级目录,使用如下命令编译:

#先清理,否则可能因为*.o文件架构不同而出错
make clean
#后编译
make

编译后使用如下命令运行:

./hello_main

ARM架构编译及运行

切换至step4目录下,即Makefile所在的同级目录,使用如下命令编译:

#先清理,否则可能因为*.o文件架构不同而出错
make clean
#后编译
make ARCH=arm

编译后使用如下命令运行:

./hello_main

step5:使用函数

使用Makefile编译Hello示例程序,Makefile中使用函数,并支持层级目录。

x86架构编译及运行

切换至step5目录下,即Makefile所在的同级目录,使用如下命令编译:

make

编译的输出目录为bulid_x86

编译后使用如下命令运行:

.bulid_x86/hello_main

ARM架构编译及运行

切换至step5目录下,即Makefile所在的同级目录,使用如下命令编译:

make ARCH=arm

编译的输出目录为bulid_arm

编译后使用如下命令运行:

.bulid_arm/hello_main

清理文件

若要清理文件,也要指定架构

  1. 清理x86的编译输出,默认架构为x86,直接make clean即可:
make clean
  1. 清理arm的编译输出,需要使用ARCH=arm指定:
make clean ARCH=arm
  1. 清理所有的编译输出,可以直接使用cleanall目标:
make cleanall

【转】Makefile步步为营的更多相关文章

  1. 说说Makefile那些事儿

    说说Makefile那些事儿 |扬说|透过现象看本质 工作至今,一直对Makefile半知半解.突然某天幡然醒悟,觉得此举极为不妥,只得洗心革面从头学来,以前许多不明觉厉之处顿时茅塞顿开,想想好记性不 ...

  2. 编写一个通用的Makefile文件

    1.1在这之前,我们需要了解程序的编译过程 a.预处理:检查语法错误,展开宏,包含头文件等 b.编译:*.c-->*.S c.汇编:*.S-->*.o d.链接:.o +库文件=*.exe ...

  3. 编写简单的Makefile文件

    makefile中的编写内容如下: www:hello.c x.h gcc hello.c -o hello clean: rm hello www:hello.c  x.h 表示生成www这个文件需 ...

  4. 简单编写Makefile

    相信很多朋友都有过这样的经历,看着开源项目中好几页的makefile文件,不知所云.在日常学习和工作中,也有意无意的去回避makefile,能改就不写,能用ide就用ide.其实makefile并没有 ...

  5. [转]Linux中configure/makefile

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

  6. Linux内核配置、编译及Makefile简述

    Hi,大家好!我是CrazyCatJack.最近在学习Linux内核的配置.编译及Makefile文件.今天总结一下学习成果,分享给大家^_^ 1.解压缩打补丁 首先是解压缩你获取到的Linux内核. ...

  7. make 查找的文件名顺序为:“GNUmakefile”、“makefile”、“Makefile”

    默认的情况下,make会在工作目录(执行make的目录)下按照文件名顺序寻找makefile文件读取并执行,查找的文件名顺序为:“GNUmakefile”.“makefile”.“Makefile”. ...

  8. 实例:对2个Makefile的备注

    实例1:Makefile编译链接简单.c函数 example.c Makefile exe: example.c gcc example.c -o exe clean: rm exe 执行效果: 实例 ...

  9. Linux中C程序调试、makefile

    gcc基本语法格式:gcc [-选项] 源文件 [-选项] 目标文件,GCC编译C程序的过程: 预处理:gcc -E hello.c hello.i.-E指定执行到预处理结束,下面类似. 编译:gcc ...

随机推荐

  1. Qt Installer Framework翻译(7-3)

    控制脚本 对于每个安装程序,您可以指定一个控制脚本,用来与安装程序的部分UI或功能进行交互.控制脚本可以在向导中添加和删除页面,更改现有页面,进行附加检查以及通过模拟用户单击来与UI交互.例如,这允许 ...

  2. Scala 学习(6)之「对象」

    目录 object 伴生对象 继承抽象类 apply方法 main方法 用 object 来实现枚举功能 object 相当于 class 的单个实例,通常在里面放一些静态的 field 或者 met ...

  3. WebAPI接口开发实践

    背景 在团队两年多陆续负责了几个项目的开发上线已经代码的review,特别是对老项目的重构过程中,发现之前的API设计是没有任何规范和约定的,不同的开发同学有不同的习惯,因此需要一套规范去约定,现在分 ...

  4. VScode前端插件推荐

    工欲善其事,必先利其器,安利一波前端插件. Chinese (Simplified) Language Pack for Visual Studio CodeVScode汉化插件 Beautify代码 ...

  5. Python zmq的三种简单模式

    ZMQ (以下 ZeroMQ 简称 ZMQ)是一个简单好用的传输层,像框架一样的一个 socket library,他使得 Socket 编程更加简单.简洁和性能更高. 是一个消息处理队列库,可在多个 ...

  6. springBoot的事件机制---GenericApplicationListener用法

    springBoot的事件机制---GenericApplicationListener用法 什么是ApplicationContext? 它是Spring的核心,Context我们通常解释为上下文环 ...

  7. os 模块 的常用方法讲解

    import osprint(os.getcwd()) #拿到当前文件的目录os.chdir(r'E:\pycharm 5.3 wenjian weizhi ')#改变当前脚本的工作目录 'r'表示原 ...

  8. Oracle数据库、实例、用户、表空间、表之间的关系

    完整的Oracle数据库通常由两部分组成:Oracle数据库和数据库实例. 1) 数据库是一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等): 2) Oracle数据库实例则是一组Ora ...

  9. Sea.js 手册与文档

    Sea.js 手册与文档 首页 | 索引 目录 何为 CommonJS 何为 CommonJS 模块 为何封装模块 何为 CommonJS? CommonJS 是一个有志于构建 JavaScript ...

  10. Python报错:PermissionError: [Errno 13] Permission denied

    问题分析: 错误产生的原因是文件无法打开,可能产生的原因是文件找不到,或者被占用,或者无权限访问,或者打开的不是文件,而是一个目录. 问题解决: 1.检查对应路径下的文件是否存在,且被占用.如果文件不 ...