让你提前认识软件开发(17):makefile文件的书写及应用
第1部分 又一次认识C语言
makefile文件的书写及应用
【文章摘要】
makefile用于Linux下整个project的编译。对于Linux下的C/C++语言的编译是至关重要的。
本文以实际的C源程序为样例。介绍怎样使用makefile来编译Linux下的C语言project,为相关开发工作的开展提供了參考。
【关键词】
makefile C语言 Linux 编译 开发
一、什么是makefile?
makefile是什么?假设你写的程序仅仅是在Windows下运行。那么非常有可能不知道有这个玩意儿。
而假设你要在Linux下编译并运行程序,那么你差点儿不可避免地要和makefile打交道。
makefile是一个文件,里面定义了一系列的规则来指定一个project中的哪些文件须要先编译,哪些文件须要后编译,哪些文件须要又一次编译,甚至进行更为复杂的功能操作。
简单点说,makefile就是Linux下的一个编译调度器。
二、makefile的语法规则
既然是一个编译调度器,那么它就会有自己的一套规则。
makefile的规则例如以下:
所看到的(“release”文件夹用于存放生成的文件)。
图1 该project的组织形式
1. “DataType.h”文件代码内容
2. “FunDeclaration.h”文件代码内容
3. “LowerToUpper.c”文件代码内容
4. “Main.c”文件代码内容
四、makefile文件的内容
为了对本project文件进行正确的编译,makefile文件能够例如以下编写:
LowerToUpper : Main/Main.c LowerToUpper/LowerToUpper.c
gcc -c -g Main/Main.c
gcc -c -g LowerToUpper/LowerToUpper.c
gcc -g -o release/LowerToUpper Main.o LowerToUpper.o
rm *.o
说明:
(1) 本文件能够命名为“makefile”或“Makefile”,不能有后缀,也仅仅能有第一个字母是大写的。
(2) 在第一行,我们终于生成的文件名称为“TestMakeFile”,要生成该文件。须要两个源文件“TestMakeFileMore1.c”和“TestMakeFileMore2.c”;对照makefile文件语法规则,target为“TestMakeFile”。prerequisites为“exec1/TestMakeFileMore1.c”和“exec2/TestMakeFileMore2.c”。
(3) 从第二行開始是命令行。即command。
(4) 第二行和第三行要以TAB键开头,是对两个源文件进行编译,生成.o文件的语句。“-g”是为了调试用的,“-c”用于产生.o文件(就是obj文件),不产生运行文件。
“gcc -c -g exec1/TestMakeFileMore1.c”的结果是生成“TestMakeFileMore1.o”。“gcc -c -g exec2/TestMakeFileMore2.c”的结果是生成“TestMakeFileMore2.o”。
第二行和第三行能够互换位置。
(5)第四行也要以TAB键开头,是将“TestMakeFileMore1.o”和“TestMakeFileMore2.o”编译生成“TestMakeFile”的语句。“-o outputfilename”,让输出文件的名称为“outputfilename”。而这个名称不能和已有的文件重名。在本例中,我们将“TestMakeFile”文件放到了release文件夹下。假设想把生成文件放到随意文件夹下。都能够用此方法来实现。
(6) 第五行也要以TAB键开头。用于删除.o文件。由于在编译过程中。有非常多.o文件生成(本例中包含“TestMakeFileMore1.o”和“TestMakeFileMore2.o”),假设我们不将它们清除掉,它们会一直留在project文件夹下。本语句相当于是一个完毕任务后的清理工作。当然,假设想对.o文件进行专门的清除,那么makefile文件能够例如以下编写:
LowerToUpper : Main/Main.c LowerToUpper/LowerToUpper.c
gcc -c -g Main/Main.c
gcc -c -g LowerToUpper/LowerToUpper.c
gcc -g -o release/LowerToUpper Main.o LowerToUpper.o
clean:
rm *.o
在Linux下输入“make clean”命令就可以将全部的o文件清除掉。
(7) 假设源文件和头文件为单个或多个,可參照本makefile进行编写。
五、makefile文件运行过程及程序运行结果
依照如图1所看到的的文件夹结构组织本project,并将之上传到Linux机器上。
1. makefile文件运行过程
登录到Linux机器上。在makefile文件所在文件夹下输入“make”命令。运行结果例如以下:
gcc -c -g Main/Main.c
gcc -c -g LowerToUpper/LowerToUpper.c
gcc -g -o release/LowerToUpper Main.o LowerToUpper.o
rm *.o
仅仅要没有出现报错信息,那么代码和makefile的编写就是正确的。
假设代码中有语法问题。那么输入“make”命令后。在运行的结果中会打印代码出现故障的行数。方便对问题进行改动。这与VC的编译功能非常类似。
2. 程序运行结果
转到release文件夹下(运行cd release命令),输入“./TestMakeFile”命令,运行结果例如以下:
Input the source string: aBcDeFg
Output the destination string: ABCDEFG
可见,达到了将小写字母变成大写字母的功能。
六、总结
本文对makefile文件的语法规则进行了介绍,并用一个实际的C程序project来说明了它的使用方法。
在编写和使用makefile文件的过程中,我们要注意下面问题:
(1) 要牢记makefile的语法。将不同程序文件的依赖关系理清楚。
(2) 命令(command)行一定要以TAB键开头,不要误写成了空格。
(3) 在makefile文件的最后。要将没实用的中间文件(如本例中的.o文件)清理掉。
(4) 对于make命令中出现的错误或警告,一定要尽量改动。
无论是Windows下的程序猿也好,还是Linux下的程序猿也罢,一定要对makefile有一定的了解,这能够从側面反映一个程序猿的专业程度。
(欢迎訪问南邮BBS:http://bbs.njupt.edu.cn/)
(欢迎訪问重邮BBS:http://bbs.cqupt.edu.cn/nForum/index)
(本系列文章每周更新两篇,敬请期待!
本人微博: topnav=1&wvr=5">http://weibo.com/zhouzxi?topnav=1&wvr=5
让你提前认识软件开发(17):makefile文件的书写及应用的更多相关文章
- python软件开发规范&分文件对于后期代码的高效管理
根据本人的学习,按照理解整理和补充了python模块的相关知识,希望对于一些需要了解的python爱好者有帮助! 一.软件开发规范--分文件 当代码存在一个py文件中时: 1.不便于管理 (修改,增加 ...
- 让你提前认识软件开发(23):怎样在C语言中运行shell命令?
第1部分 又一次认识C语言 怎样在C语言中运行shell命令? [文章摘要] Linux操作系统具备开源等诸多优秀特性,因此在很多通信类软件(主流开发语言为C语言)中,开发平台都迁移到了Linux上, ...
- 让你提前认识软件开发(19):C语言中的协议及单元測试演示样例
第1部分 又一次认识C语言 C语言中的协议及单元測试演示样例 [文章摘要] 在实际的软件开发项目中.常常要实现多个模块之间的通信.这就须要大家约定好相互之间的通信协议,各自依照协议来收发和解析消息. ...
- 让你提前认识软件开发(21):C程序中的定时器
版权声明:本文为博主原创文章.对文章内容有不论什么意见或建议.欢迎与作者单独交流.作者QQ(微信):245924426. https://blog.csdn.net/zhouzxi/article/d ...
- 让你提前认识软件开发(31):数据库脚本中的begin与end
版权声明:本文为博主原创文章.对文章内容有不论什么意见或建议,欢迎与作者单独交流.作者QQ(微信):245924426. https://blog.csdn.net/zhouzxi/article/d ...
- 让你提前认识软件开发(35):怎样改动SQL脚本以完毕需求?
第2部分 数据库SQL语言 怎样改动SQL脚本以完毕需求? SQL脚本的改动和C语言代码的改动流程是一样的,都要遵循下面步骤: 第一步,阅读需求.弄清楚自己要完毕什么功能. ...
- 【阅读笔记】《C程序员 从校园到职场》第六章 配置文件,makefile 文件 (Part 2)
Contents: 1.配置文件(通常以 ini 结尾) 2.makefile文件 (Linux) PS: 这篇文章的内容,不太理解. 一.配置文件 本文以一个实际的小软件为例,介绍了C语言中配置文 ...
- Python 入门之 软件开发规范
Python 入门之 软件开发规范 1.软件开发规范 -- 分文件 (1)为什么使用软件开发规范: 当几百行--大几万行代码存在于一个py文件中时存在的问题: 不便于管理 修改 可读性差 加载速度慢 ...
- Configure,Makefile.am, Makefile.in, Makefile文件
一 软件安装关于 makefile文件问题 如果拿到的工程文件中,没有Makefile文件,而只有configure.in和Makefile.am文件,我们是不能够直接进行编译的,必须根据config ...
随机推荐
- oschina jQuery 插件
jQuery 插件 jQuery自动完成插件(25) jQuery分页插件(20) jQuery 文件上传(21) jQuery 地图插件(14) jQuery对话框(109) jQuery图片展示/ ...
- IE, FireFox, Opera 浏览器支持CSS实现Alpha透明的方法 兼容问题
一:要解决的问题时:在ie6-ie11下兼容下面透明上传文件button的效果. 实现方式通过滤镜实现. 二:效果图例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3N ...
- AntiXSS - 支持Html同时防止XSS攻击
AntiXSS - 支持Html同时防止XSS攻击 跨站脚本攻击(XSS)已经不是什么新鲜的话题了,甚至很多大公司也为此吃尽苦头.最简单直接的防范方法,就是不允许任何html标签输入,对用户输入进行编 ...
- poj2528(线段树)
题目连接:http://poj.org/problem?id=2528 题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报 分析:离散化+线段树,这题因为每个数字其实表示的是一个单位长度,因 ...
- 前端编程提高之旅(六)----backbone实现todoMVC
乐帝当年学习backbone时.最開始是看官网todoMVC的实现.后来了解到requireJS便于管理JS代码.就对官网代码做了requireJS管理.但此时乐帝感觉此时的t ...
- Android仿WIN8系统磁贴点击下沉倾斜效果
※效果 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGluZ2xvbmd4aW4yNA==/font/5a6L5L2T/fontsize/400/fil ...
- SVN常见问题及解决方案
. 隐藏文件.svn目录删除了怎么办 Checkout后,工作空间下.svn目录下有大量隐藏文件,占用比较大的空间,他们是工作空间的管理文件,不能删除,如果不小心删除了也不要抓狂,不会影响服务器端的, ...
- 主要的核心思想是取cookie然后发查询请求,不需要浏览器做代理(转)
需求是催生项目和推进项目的不竭动力. 背景: 最近,因为媳妇要做个B超检查,想着去大医院查查应该更放心,所以就把目标瞄准在A医院.早已耳闻A院一号难求万人空巷,所以把所有能接触到的机会都看了一遍,线下 ...
- USACO comehome Dijkstra
USER: Kevin Samuel [kevin_s1] TASK: comehome LANG: C++ Compiling... Compile: OK Executing... Test 1: ...
- session与cookie的差别
session session 的工作机制是:为每一个訪客创建一个唯一的 id (UID),并基于这个 UID 来存储变量.UID 存储在 cookie 中,或者通过 URL 进行传导. ...