很早之前写的培训用的Makefile文档,整理好分享给大师。 本文用Linux办事器下编写C法式来说授Makefile,首要实现两个方针:
写个简单的Makefile做收场白需要说明一下,文档目录结构是用户目录HOME下有src incl bin lib。 src:源码 incl:头文件 bin:履行码 lib:静态/静态库 这是大师最多见的Linux编程目录结构,以下代码编译都是根据这个结构。 Makefile代码 hello:hello.cgcc -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代码。 #最初构成的MakefileINCL=-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文件 喜好作者的,可以加关注,后续会延续推出各类教程,皆为原创。 |
很早以前写的培训用的Makefile文档,整理好分享给大家。本文用Linux服务器下编写C程序
有一个有趣的段子说,不同阶段的学生写论文就如同打兔子:本科生是老师告诉你死兔子在
完全可行的副业,每年多赚20万不是问题!我自己做过很多副业,从头条号、公众号、淘宝
一、砂锅的历史二、砂锅的材质分类三、砂锅的器型分类四、砂锅的著名产地五、为什么砂
这篇文章大概发了一个月左右的时间,承蒙大家厚爱,收到了许多赞和评论。大家问的最多
被骗怎么办。答案是维权!!一下是我的维权过程。可能有点长。但比较详细。想看干货直接
大家好!我是喜欢把问题研究明白的调皮哥,感谢关注我。我创建了一个【雷达工程技术交
作者:cherry it up(来自豆瓣,点击可阅读原文“中立” “客观” “理性”的迷思)今
前言最近可能很多使用 Chrome 的用户都发现了,Chrome 浏览器右键菜单里的网页翻译失
大家好,我是 @调皮连续波 ,江湖人称“调皮哥”。正值五一假期,去哪里都人多,因此
首先,这里需要申明的一点!解决国内如何使用TikTok真的非常简单,没有大家及网上说的
破300赞 更新一下首先统一回复一下质疑最多的问题明明都是学校讲过得啊,简单的变形而
各位老少爷们儿,这好像是我第一次在知乎写文章!不一定能有多少人看的到,尤其是针对
【一】干货较多,希望兄弟们耐心看完。这一期讲的主要是这四个东西中的跟风。后面还会
渗透测试,是专业安全人员为找出系统中的漏洞而进行的操作。当然,是在恶意黑客找到这
有没有同感,一来到广州就懵了啊!广州好吃的、好看的实在是太多了!想买个特产,都不
{color{red}{看完这篇,再也不用为英语语法发愁啦(保真) !}} 这篇文章可以在 15
【本文章推荐实习信息——腾讯视频VIP商务合作渠道拓展】岗位信息在文末哦~欢迎关注,
C语言是当代人学习及生活中的必备基础知识,应用十分广泛,下面为大家带来C语言基础知
海关统计数据在线查询系统优化升级了,系统更好用啦!1.进入海关总署官网http://www.c
声明:本站内容由网友分享或转载自互联网公开发布的内容,如有侵权请反馈到邮箱 1415941@qq.com,我们会在3个工作日内删除,加急删除请添加站长微信:15924191378
Copyright @ 2022-2024 私域运营网 https://www.yunliebian.com/siyu/ Powered by Discuz! 浙ICP备19021937号-4