make 和 makefile(一)

从今天开始,我们来学习 makefile 了。那么什么是 make 呢?为什么需要 make 呢?在我们之前学习的 C 语言以及 C++ 语言中,我们在编译的时候只需要 gcc 或者 g++ 命令就可以完成源码的编译了。但是在嵌入式中一些大型的项目中,如内核的编译,动辄上万个源文件,我们还可能去一行一行的敲 gcc 命令吗?肯定不会了,这时我们便需要一个工具来进行代替了,此时便需要 makefile 了。

本系列博客内容是根据狄泰软件学院的《门徒计划》中的 makefile 相关内容总结而来,狄泰技术交流群:199546072。

make 是一个应用程序,它的作用是:a> 解析源程序之间的依赖关系;b> 根据依赖关系自动维护编译工作;c> 执行宿主操作系统中的各种命令。makefile 是一个描述文件,它的作用是:a> 定义一系列的规则来指定源文件编译的先后顺序;b> 拥有特定的语法规则,支持函数定义和函数调用;c> 能够直接集成操作系统中的各种命令。那么 make 和 makefile 之间的关系是怎样的呢?makefile 中的描述用于指导 make 程序如何完成工作;make 根据 makefile 中的规则执行命令,最后完成编译输出。如下所示

下来我们来看看最简单的 makefile 示例,如下

注意:目标 hello 后的命令需要用 Tab 键(' \t')隔开!make 程序的使用示例:make -f mf.txt hello,功能说明:以 hello 关键字作为目标查找 mf.txt 文件,并执行 hello 处的命令。它还有种简写:make hello,功能说明:以 hello 关键字作为目标查找 makefile 或 Makefile 文件,并执行 hello 处的命令。还有种写法是 make,功能说明:查找 makefile 或 Makefile 文件中最顶层目标,并执行最顶层目标的命令。

下来我们就来看看 makefile 是怎样用的,在 hello.txt 文件中编写代码

hello : 
    echo "hello makefile"

我们来看看编译效果是怎样的

我们来试试将 hello 后面的 Tab 键换成四个空格键看看编译还会通过吗?

我们看到直接出错了,所以大家一定要记得在 makefile 中目标后面的一定是 Tab 键。我们前面说还有种简写,是 make hello,我们来试试

我们看到没有相应规则,原来是它会去在当前目录下查找 makefile 或 Makefile 文件,下来我们将 hello.txt 文件名改为 makefile 试试呢

我们看到再次执行是正确的。我们前面说的直接执行 make 时,它默认执行的是最顶层的目标,那么意思是还会有别的目标。我们再来试试在 makefile 文件中添加 test 目标,还是打印 hello test。执行 make 看看

还是正确打印出了结果,说明 makefile 中是支持这种写法的,支持多个目标的同时定义。我们来试试 make test 呢

我们再来添加两句,pwd 和 ls 命令,最终程序将会变成下面这样

hello : 
    echo "hello makefile"
    
test : 
    echo "hello test"
    pwd
    ls

看看编译结果

我们看到它会依次执行目标后的命令。pwd 命令的意思是打印文件所在目录,ls 是显示当前文件下的所有文件。通过对 make 和 makefile 的学习,总结如下:1、make 只是一个特殊功能的应用程序;2、make 用于根据指定的目标执行相应的命令;3、makefile 用于定义目标和实现目标所需的命令;4、makefile 有特定的语法规则,支持函数定义和调用。

欢迎大家一起来学习 makefile,可以加我QQ:243343083。

原文地址:http://blog.51cto.com/12810168/2126643

时间: 2024-11-08 21:51:15

make 和 makefile(一)的相关文章

关于makefile中变量的多次赋值以及override指令

1 基本原则如下 1.1 原则1 变量的普通赋值是有先后顺序的,后面的赋值会覆盖掉前面的赋值. 1.2 原则2 使用的时候,用的是其前面最后的赋值,就算其后面有使用了override指令的赋值也不会影响这条原则. 1.3 原则3 当使用了override指令定义赋值了变量后,其后对该变量的所有的赋值都是无效的.但是override之前的所有的赋值都是有效的.使用的时候是往前最近原则. 2 override变量.命令行参数和普通变量之间的屏蔽关系 override变量会屏蔽命令行参数,除非用+=:

使用Makefile去管理程序

前言:在gcc中如何使用分屏操作  : 在命令行中使用    : sp + filename     vim  Makefile  编辑make工程   第一行使用 # 进行注释   说明是什么make  内容格式:  目标文件:  依赖文件 ·  ·  ·  但是一定要注意如果要使用编译指令一定要用table键 不能使用几个空格代替 另外  max.h 和min.h 的内容就是函数声明 下面说下这样make的好处吧:  在大型程序中能很好帮我们管理我们的代码和项目,程序的任何部分分工都很明确,

Contiki 2.7 Makefile 文件(三)

2.第二部分 这里的usage,targets,savetarget,savedefines都是伪目标. 和all不同,这些伪目标不会被执行,除非显式指定这些目标. 这里有两个目标savetarget,savedefines前边我们提过. 通过命令 make TARGET=esb savetarget可以保存默认的TARGET到Makefile.target中. 通过命令 make TARGET=esb DEFINES=MYTRACE,MYVALUE=4711 savedefines 可以保存默

My first makefile to compile multiple C files

I have three files to compile: main.c, func.c,  func.h The steps: 1   main.c   to   main.o 2   func.c    to   func.o 3    link main.o func.o to main(file that can execute) So, u need to run at least three commands without a Makefile.Then if u have 10

liunx中ctags 与makefile的使用

ctags 是vim下可以帮助阅读代码的一个的工具,它可以很方便的看到程序的源代码 使用ctags可以有两种方法:(1).可以在任意目录下建立文件,然后使用 ctags *.c,这个命令的意思是把当前目录下的所有文件生成标签文件(vim可以通过标签,跳转到标签文件处)例如: vim ctag.h vim ctag.c vim main.c 在main.c中把光标移至fun函数处,按Ctrl+[就会跳转到fun函数定义的地方,即ctag.c处,Ctrl+T回转到main.c函数 (2).输入cta

linux中make命令的简单使用以及Makefile文件的书写

Makefile 会不会写makele,从一个侧面说明了一个是否具备完成大型工程的能力. 一个工程中的源件不计数,其按类型.功能.模块分别放在若干个目录中,makele定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makele就像一个Shell脚本一样,其中也可以执行操作系统的命令.makele带来的好处就是"自动化编译",一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率. ma

makefile编译文件介绍

通常在C语言程序开发中,尤其是大型项目的构建,我们不可能一个文件一个文件去编译,通常会编写Makefile文件使用make命令完成项目的编译构建: 如下:math项目是简单的计算那个数字大,哪个数字小,以及两个数字和的小程序.由max.c,min.c , sum.c 和main.c构成,分别如下: max.c #include <stdio.h> int max(int a,int b) {     if(a>b){         return a;      }else{      

通用多目录makefile的写法

我的项目文件层次是:项目名称/include.output.src src/admin.stu.tch.common 最外层的Makefile: DEBUG = yMYDEBUG = DEBUGifeq ($(DEBUG),y)DEBFLAGS = -O -g -D$(MYDEBUG)elseDEBFLAGS =endif PRJ_HOME := $(shell pwd)SOURCES := $(wildcard *.c)OBJECTS := ${SOURCES:%.c=%.o}INCPATH

mcstructs使用CMake生成Makefile文件

CMakeLists.txt project(MCSTRUCTS) set(SRC_LIST src/main.c src/mcslist.c src/mcsringbuf.c) add_executable(mcstructs ${SRC_LIST}) 执行过程: [email protected]:~/projects/mcstructs$ cmake . -- Configuring done -- Generating done -- Build files have been writ

makefile实例(2)-多个文件实例

1,源文件依赖关系 defs.h command.h buffer.h main.cpp * util.cpp * kde.cpp * * command.cpp * * display.cpp * * insert.cpp * * search.cpp * * files.cpp * * * 2, 源文件 因为这里只是想做一下简单测试,所以很多源文件的内容都是空的. [[email protected] 1-makefile]#head *.h ==> buffer.h <== #pragm