Makefile recoder

2020-10-24  本文已影响0人  James999

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

根据上面的结构说明,我们对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

上一篇 下一篇

猜你喜欢

热点阅读