首页 网站首页 商业资讯 干货 查看内容

Makefile由浅入深--教程、干货

私域直播 干货 2022-11-24 13:53 6895人围观

很早之前写的培训用的Makefile文档,整理好分享给大师。

本文用Linux办事器下编写C法式来说授Makefile,首要实现两个方针:

  1. 自己能写简单的Makefile,玩转Linux编程。
  2. 看懂大神写的Makefile。

写个简单的Makefile做收场白



需要说明一下,文档目录结构是用户目录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确切可以当shell剧本履行,现在看到的同学最少学会怎样写简单的Makefile,可是只学会简单的Makefile并看不懂大神的Makefile啊。下面深入分析Makefile的其他写法。

Makefile结构说明

Makefile里首要包括了五个工具:变量界说、显式法则、隐晦法则、文件指示和正文。

1、变量的界说。在Makefile中我们要界说一系列的变量,变量一般都是字符串,这个有点像C说话中的宏,当Makefile被履行时,其中的变量城市被扩大到响应的援用位置上。

2、显式法则。显式法则说了然,若何天生一个或多的的方针文件。这是由Makefile的誊写者明显指出,要天生的文件,文件的依靠文件,天生的号令。 适才写的疑似shell剧本的Makefile全数都是显现法则。

3、隐晦法则。由于我们的make有自动推导的功用,所以隐晦的法则可以让我们比力粗糙地简单地誊写Makefile,这是由make所支持的。

4、文件指示。其包括了三个部分,一个是在一个Makefile中援用另一个Makefile,就像C说话中的include一样。

5、正文。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。




Makefile具体图解

到今朝为止的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的终极展现




Makefile具体图解

现实编译成果




Makefile编译成果

看着挺乱的吧,稍微改一改,双手送上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 ""

号令前加@,暗示当前号令不显现,最初编译成果是这样。




Makefile编译成果

以上是Makefile的全数内容,本文结束。


分享几个Makefile的示例DEMO,

编译SOCKET办事,利用mysql数据库。




编译socket办事

Makefile代码以下

#socket办事端编译(用到mysql数据库)
INCL=-I/usr/local/mysql/include -I$(HOME)/incl
LIB=-L/usr/local/mysql/lib -lmysqlclient -lmysqld -lmysqlservices -L$(HOME)/lib -lbanktest
BINDIR=$(HOME)/bin

.SUFFIXES: .cpp .c

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

.c.o:
gcc $(INCL) -c $<

all: clean server

server:server.o
@echo "============起头编译============"
gcc -o $@ $? $(LIB)
@mv $@ $(BINDIR)
@echo "============编译竣事============"

clean:
@rm -f *.o

编译des md5 base64密码办事的Makefile

#编译des md5 base64密码办事
INCL=-I/usr/local/mysql/include -I$(HOME)/incl
LIB=-L/usr/local/mysql/lib -lmysqlclient -lmysqld -lmysqlservices
BINDIR=$(HOME)/bin
LIBDIR=$(HOME)/lib

.SUFFIXES: .cpp .c

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

all: clean des md5 base64

des:des.o main_des.o
gcc -o $@ $? $(LIB)
mv $@ $(BINDIR)

md5:md5.o main_md5.o
gcc -o $@ $? $(LIB)
mv $@ $(BINDIR)

base64test:base64.o main_base64.o
gcc -o $@ $? $(LIB)
mv $@ $(BINDIR)

rsa:rsa.o main_rsa.o
gcc -o $@ $? $(LIB)
mv $@ $(BINDIR)

libjiami.a:des.o md5.o base64.o
ar -r $@ $?
mv $@ $(LIBDIR)

libdestest:main_des.o
gcc -o $@ $? $(LIB) -L$(HOME)/lib -ljiami
mv $@ $(BINDIR)

libtest.so:des.c md5.c base64.c
gcc -o $@ -fPIC -shared $?
mv $@ $(LIBDIR)

libmd5test:main_md5.o
gcc -o $@ $? $(LIB) -L$(HOME)/lib -ltest
mv $@ $(BINDIR)

libbanktest.a:banktest.o banksql.o
ar -r $@ $?
mv $@ $(LIBDIR)

banktest:banktest.o banksql.o
gcc -o $@ $? $(LIB) -L$(HOME)/lib -ltest
mv $@ $(BINDIR)

clean:
rm -f *.o

最初,加几点写Makefile的留意事项

1. tab分隔,不能用空格。

2. 每个makefile最好加一个all

3. 正文用“#”标记

4. 文件指示,援用其他的makefile文件


喜好作者的,可以加关注,后续会延续推出各类教程,皆为原创。

高端人脉微信群

高端人脉微信群

人脉=钱脉,我们相信天下没有聚不拢的人脉,扫码进群找到你所需的人脉,对接你所需的资源。

商业合作微信

商业合作微信

本站创始人微信,13年互联网营销经验,擅长引流裂变、商业模式、私域流量,高端人脉资源丰富。

我有话说......

查看全部评论>>

相关推荐

Makefile由浅入深--教程、干货

Makefile由浅入深--教程、干货

很早以前写的培训用的Makefile文档,整理好分享给大家。本文用Linux服务器下编写C程序

干货——如何写中文论文

干货——如何写中文论文

有一个有趣的段子说,不同阶段的学生写论文就如同打兔子:本科生是老师告诉你死兔子在

干货!做什么副业最靠谱!

干货!做什么副业最靠谱!

完全可行的副业,每年多赚20万不是问题!我自己做过很多副业,从头条号、公众号、淘宝

干货!砂锅选购知识大全

干货!砂锅选购知识大全

一、砂锅的历史二、砂锅的材质分类三、砂锅的器型分类四、砂锅的著名产地五、为什么砂

(长文干货)全屋定制看这一篇就够了

(长文干货)全屋定制看这一篇就够了

这篇文章大概发了一个月左右的时间,承蒙大家厚爱,收到了许多赞和评论。大家问的最多

咸鱼被骗怎么办?干货!!详解。

咸鱼被骗怎么办?干货!!详解。

被骗怎么办。答案是维权!!一下是我的维权过程。可能有点长。但比较详细。想看干货直接

干货-线性调频连续波雷达基本原理(第1讲)

干货-线性调频连续波雷达基本原理(第1讲)

大家好!我是喜欢把问题研究明白的调皮哥,感谢关注我。我创建了一个【雷达工程技术交

干货| “理性” “客观”“中立”的迷思

干货| “理性” “客观”“中立”的迷思

作者:cherry it up(来自豆瓣,点击可阅读原文“中立” “客观” “理性”的迷思)今

干货!手把手教你解决谷歌翻译不能用的方法

干货!手把手教你解决谷歌翻译不能用的方法

前言最近可能很多使用 Chrome 的用户都发现了,Chrome 浏览器右键菜单里的网页翻译失

干货:FMCW雷达系统信号处理建模与仿真(含matlab代码)

干货:FMCW雷达系统信号处理建模与仿真(含matlab代码)

大家好,我是 @调皮连续波 ,江湖人称“调皮哥”。正值五一假期,去哪里都人多,因此

【干货】国内如何使用TikTok,国内如何使用TikTok

【干货】国内如何使用TikTok,国内如何使用TikTok

首先,这里需要申明的一点!解决国内如何使用TikTok真的非常简单,没有大家及网上说的

干货 | 设x=my+n?这不耍流氓嘛

干货 | 设x=my+n?这不耍流氓嘛

破300赞 更新一下首先统一回复一下质疑最多的问题明明都是学校讲过得啊,简单的变形而

货拉拉到底能不能干?

货拉拉到底能不能干?

各位老少爷们儿,这好像是我第一次在知乎写文章!不一定能有多少人看的到,尤其是针对

超级干货—超短线大框架(全)

超级干货—超短线大框架(全)

【一】干货较多,希望兄弟们耐心看完。这一期讲的主要是这四个东西中的跟风。后面还会

超好用的17个渗透测试工具(干货附下载地址)安全人员必备 ... ...

超好用的17个渗透测试工具(干货附下载地址)安全人员必备 ... .

渗透测试,是专业安全人员为找出系统中的漏洞而进行的操作。当然,是在恶意黑客找到这

广州特产购买清单,2分钟带你买遍广州人气特产

广州特产购买清单,2分钟带你买遍广州人气特产

有没有同感,一来到广州就懵了啊!广州好吃的、好看的实在是太多了!想买个特产,都不

【干货】英语语法基础知识大全,全部整理好!一定要收藏 ... ...

【干货】英语语法基础知识大全,全部整理好!一定要收藏 ... ...

{color{red}{看完这篇,再也不用为英语语法发愁啦(保真) !}} 这篇文章可以在 15

干货 | 怎么准备面试中的1分钟自我介绍?

干货 | 怎么准备面试中的1分钟自我介绍?

【本文章推荐实习信息——腾讯视频VIP商务合作渠道拓展】岗位信息在文末哦~欢迎关注,

C语言基础知识总结大全(干货)

C语言基础知识总结大全(干货)

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,下面为大家带来C语言基础知

干货!教你如何查询海关统计数据

干货!教你如何查询海关统计数据

海关统计数据在线查询系统优化升级了,系统更好用啦!1.进入海关总署官网http://www.c

电话咨询: 15924191378
添加微信