美文网首页
Makefile recoder

Makefile recoder

作者: James999 | 来源:发表于2020-10-24 13:10 被阅读0次

Makefile简单示例

image.png

说明:文档目录结构是用户目录HOME下有src incl bin lib。

src:源码
incl:头文件
bin:执行码
lib:静态/动态库

最常见的Linux编程目录结构,以下代码编译都是依据这个结构。
Makefile代码

hello:hello.c
    gcc -I${HOME}/incl -c hello.c
    gcc -o hello hello.o
    rm -f hello.o
    mv hello ${HOME}/bin

没接触过Makefile的同学肯定能看出,这段代码不就是把编译、链接、删除、移动写成shell脚本执行吗?没错的,把第一行去掉,其他代码粘贴到shell脚本里同样可以编译成功,一点问题都没有。看来大家都学会了Makefile,本文就到这里。

Makefile结构说明

Makefile里主要包含了五个东西:变量定义、显式规则、隐晦规则、文件指示和注释。

  • 变量的定义。在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点像C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。
  • 显式规则。显式规则说明了,如何生成一个或多的的目标文件。这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。 刚才写的疑似shell脚本的Makefile全部都是显示规则。
  • 隐晦规则。由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书写Makefile,这是由make所支持的。
  • 文件指示。其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的include一样。
  • 注释。Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用“#”字符,这个就像C/C++中的“//”一样。如果你要在你的Makefile中使用“#”字符。

复杂一些的Makefile

根据上面的结构说明,我们对Makefile一层一层的改写,首先是隐晦规则,告诉大家其中一种用法。

.SUFFIXES: .cpp .c
.cpp.o:
    g++ ${INCL} -c $<
.c.o:
    gcc ${INCL} -c $<

这个隐晦规则其实就是告诉大家,后缀为cpp的文件怎么编译成.o,后缀为c的文件怎么编译成.o。


image.png

到目前为止的Makefile已经有模有样了,Makefile代码双手奉上。

#隐含规则
INCL=-I${HOME}/incl

.SUFFIXES: .cpp .c
.cpp.o:
    g++ ${INCL} -c $<
.c.o:
    gcc ${INCL} -c $<

#C++编译
hellocpp:hellocpp.o
    echo "开始编译"
    g++ -o hellocpp hellocpp.o
    rm -f hellocpp.o
    mv hellocpp ${HOME}/bin
    echo "编译结束"
#C编译
hello:hello.o
    echo "开始编译"
    gcc -o hello hello.o
    rm -f hello.o
    mv hello ${HOME}/bin
    echo "编译结束"

注意前方高能,Makefile的最终展现


image.png

实际编译结果


image.png
看着挺乱的吧,稍微改一改,双手奉上Makefile代码。
#最后形成的Makefile
INCL=-I${HOME}/incl
BIN=$(HOME)/bin
OBJ1=hellocpp.o
OBJ2=hello.o

.SUFFIXES: .cpp .c
.cpp.o:
    g++ ${INCL} -c $<

.c.o:
    gcc ${INCL} -c $<

all: hellocpp hello

#C++编译
hellocpp:${OBJ1}
    @echo "============开始编译============"
    g++ -o $@ $?
    @rm -f ${OBJ1}
    @mv $@ ${BIN}
    @echo "============编译结束============"
    @echo ""

#C编译
hello:${OBJ2}
    @echo "============开始编译============"
    gcc -o $@ $?
    @rm -f ${OBJ2}
    @mv $@ ${BIN}
    @echo "============编译结束============"
    @echo ""
image.png

以上是Makefile的全部内容,本文完结。

https://zhuanlan.zhihu.com/p/47390641

相关文章

  • Makefile recoder

    Makefile简单示例 说明:文档目录结构是用户目录HOME下有src incl bin lib。 最常见的Li...

  • Recoder 02

    最近的事让我想起来我高一最后一次去当家教的场景…那是一个三岁半的男孩子,有点自闭倾向,我跟他说话几乎都没有回应,我...

  • AVFoundation框架中录音和播放音效的基本使用

    //停止录音 调用recoder的stop方法 @IBAction func stop(_ sender: UIB...

  • 编写Makefile及简单分析

    makefile的好处:一次编写,终身受益 makefile的命名规则: makefile Makefile ma...

  • Makefile 工程管理

    Ⅰ Makefile的用途 Ⅱ Makefile的构成 Ⅲ Makefile构成-----规则 Ⅳ Makefil...

  • win_c/c++ mess01

    1. win makefile 1.1 win makefile,eg: 1.2 makefile explai...

  • [C] Makefile

    Makefile Blog [Makefile的简便写法] [Makefile]菜鸟教程 [gcc编译声明问题] ...

  • 迅为IMX6ULL开发板Ubuntu下C编程入门(二)

    本文是介绍3.3 初识 Makefile+3.4Makefile语法 3.3初识Makefile 3.3.1什么是...

  • Make

    make 目标 顶层 Makefile 作为入口, 来调用其他 makefile, 顶层 makefile 一般有...

  • Makefile学习笔记

    Makefile学习笔记 学习Makefile的资料 《跟我一起写makefile》 《GUN make manu...

网友评论

      本文标题:Makefile recoder

      本文链接:https://www.haomeiwen.com/subject/wtvimktx.html