首页 > 其他分享 >[转载] 跟我一起写Makefile

[转载] 跟我一起写Makefile

时间:2024-02-29 22:36:03浏览次数:29  
标签:文件 foo 变量 make Makefile 一起 规则 转载

目录

为方便本人查找makefile相关规则和函数,故将其转载。

简介

《跟我一起写Makefile》是 陈皓 发表在其CSDN博客上的系列文章。该系列文章翻译整理自 GNU Make Manual ,一直受到读者的推荐,是很多人学习Makefile的首选文档。目前网络上流传的PDF版本多为祝冬华整理的版本。这个版本的排版一般,代码部分没有做任何语法高亮。

2010年初学Makefile的时候,读了前几章皮毛,一直用到了现在。最近想着重新学习一下Makefile,顺便学习一下Sphinx,重新制作一个更精美的PDF版本。

概述

什么是makefile?或许很多Windows的程序员都不知道这个东西,因为那些Windows的集成开发环境(integrated development environment,IDE)都为你做了这个工作,但我觉得要作一个好的和专业的程序员,makefile还是要懂。这就好像现在有这么多的HTML编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标签的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。

因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计其数,并且按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。

makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。 make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

现在讲述如何写makefile的文章比较少,这是我想写这篇文章的原因。当然,不同产商的make各不相同,也有不同的语法,但其本质都是在 “文件依赖性”上做文章,这里,我仅对GNU的make进行讲述,我的环境是RedHat Linux 8.0,make的版本是3.80。毕竟,这个make是应用最为广泛的,也是用得最多的。而且其还是最遵循于IEEE 1003.2-1992标准的(POSIX.2)。

在这篇文档中,将以C/C++的源码作为基础,所以必然涉及一些关于C/C++的编译的知识。关于这方面的内容,还请各位查看相关的编译器的文档。这里所默认的编译器是UNIX下的GCC和CC。

关于程序的编译和链接

在此,我想多说关于程序编译的一些规范和方法。一般来说,无论是C还是C++,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成可执行文件,这个动作叫作链接(link)。

编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在C/C++文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。一般来说,每个源文件都应该对应于一个中间目标文件( .o 文件或 .obj 文件)。

链接时,主要是链接函数和全局变量。所以,我们可以使用这些中间目标文件( .o 文件或 .obj 文件)来链接我们的应用程序。链接器并不管函数所在的源文件,只管函数的中间目标文件(Object File),在大多数时候,由于源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便。所以,我们要给中间目标文件打个包,在Windows下这种包叫“库文件”(Library File),也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件。

总结一下,源文件首先会生成中间目标文件,再由中间目标文件生成可执行文件。在编译时,编译器只检测程序语法和函数、变量是否被声明。如果函数未被声明,编译器会给出一个警告,但可以生成Object File。而在链接程序时,链接器会在所有的Object File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error),在VC下,这种错误一般是: Link 2001错误 ,意思说是说,链接器未能找到函数的实现。你需要指定函数的Object File。

好,言归正传,gnu的make有许多的内容,闲言少叙。

makefile介绍

make命令执行时,需要一个makefile文件,以告诉make命令需要怎么样的去编译和链接程序。

首先,我们用一个示例来说明makefile的书写规则,以便给大家一个感性认识。这个示例来源于gnu 的make使用手册,在这个示例中,我们的工程有8个c文件,和3个头文件,我们要写一个makefile来告诉make命令如何编译和链接这几个文件。我们的规则是:

  1. 如果这个工程没有编译过,那么我们的所有c文件都要编译并被链接。
  2. 如果这个工程的某几个c文件被修改,那么我们只编译被修改的c文件,并链接目标程序。
  3. 如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的c文件,并链接目标程序。

只要我们的makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自动编译所需要的文件和链接目标程序。

makefile的规则

在讲述这个makefile之前,还是让我们先来粗略地看一看makefile的规则。

target ... : prerequisites ...
    recipe
    ...
    ...
  • target

    可以是一个object file(目标文件),也可以是一个可执行文件,还可以是一个标签(label)。对于标签这种特性,在后续的“伪目标”章节中会有叙述。

  • prerequisites

    生成该target所依赖的文件和/或target。

  • recipe

    该target要执行的命令(任意的shell命令)。

这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是说:

prerequisites中如果有一个以上的文件比target文件要新的话,recipe所定义的命令就会被执行。

这就是makefile的规则,也就是makefile中最核心的内容。

说到底,makefile的东西就是这样一点,好像我的这篇文档也该结束了。呵呵。还不尽然,这是makefile 的主线和核心,但要写好一个makefile还不够,我会在后面一点一点地结合我的工作经验给你慢慢道来。内容还多着呢。

标签:文件,foo,变量,make,Makefile,一起,规则,转载
From: https://www.cnblogs.com/wsg1100/p/18045717

相关文章

  • How to Create a Wimboot Installation of Windows 8.1(转载)
    HowtoCreateaWimbootInstallationofWindows8.1Introduction:HowtoCreateaWimbootInstallationofWindows8.1IntroductionEverwonderhowcomputermanufacturerscanfita20GBinstallationofWindowsontoa16GBdrive?Itisnowpossiblewith......
  • Nginx添加开源防火墙(waf)防护(转载)
    项目背景介绍需求产生由于原生态的Nginx的一些安全防护功能有限,就研究能不能自己编写一个WAF,参考Kindle大神的ngx_lua_waf,自己尝试写一个了,使用两天时间,边学Lua,边写。不过不是安全专业,只实现了一些比较简单的功能:功能列表:支持IP白名单和黑名单功能,直接将黑名单的IP访问拒绝。......
  • Nginx安全防火墙配置,保护网站不受恶意攻击(转载)
    nginx安全防火墙配置,保护网站不受恶意攻击引言:在当今互联网时代,网站面临着各种安全威胁,如恶意攻击、入侵等。为了保护网站的数据和用户隐私,我们需要采取一系列措施来加强网站的安全性。Nginx是一个高性能的Web服务器,在安全方面也提供了丰富的功能,我们可以通过Nginx的防火墙配置来......
  • C#GDI高效绘图(转载)
    汇总利用双缓冲技术在C#中实现GDI高效绘图 双缓冲是将图片在显示到DC前,现在要内存建一个DC,也就是用于存储这张图片的内存区,然后在将这部分update到你要显示的地方这样,可以防止画面抖动很大这样和你说吧,如果要实现你要的效果,你必须用指针访问内存比如,把程序声明成unsaf......
  • 三分钟一起了解工作流拖拽
    低代码技术平台是如今深受很多行业喜爱的得力助手,也是实现提质增效的办公效果的有力武器。作为一家专业研发低代码技术平台的服务商,流辰信息的IBPS在很多行业领域中得到了大家的认可和喜爱,其中,工作流拖拽功能也是IBPS的主要功能之一,通过这篇文章,我们一起来了解它的相关知识点吧。......
  • CSDN以及博客园如何转载别人的文章
    1、找到要转载的文章,用chrome浏览器打开,右键选择检查2、在chrome中下方的框里找到对应的内容,html脚本中找到对应的节点(article_content),选中节点,网页上被选中内容会被高亮显示,然后右键菜单选中Copy–>CopyouterHTML3、进入直接的博客主界面,选择”写博客“,直接将chrome......
  • 更改pureftpd vsftpd与proftpd的默认端口(转载)
    tp的默认端口是21,但如果启用ftp且开放21端口,经常会受到各种工具尝试破解ftp密码,且说你的ftp密码非常的强大,几乎不能暴力破解,但是工具暴力破解ftp密码时需要消耗系统资源,所以我们干脆更改下ftp的端口,这样就可以防止了各种暴力破解工具的侵扰。下面www.centos.bz把21端口更改为2121......
  • pure-ftpd安装与使用(转载)
    一、摘要FTP是FileTransferProtocol(文件传输协议)的英文简称,而中文简称为"文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户......
  • 2024年与AI一起出发,一步步迈向你的梦想
    程序员的社交圈子几乎没有,而不是非常小,总是在两点一线之间往返,回忆起过往,自己错过了一班班划时代的列车。一、读书分享【财富的真相】李笑来所谓的个人财富自由,指的是某个人再也不用为了满足生活必需而出售自己的时间了。他强调概念的重要性,还说一个人的脑子是否清楚,就看他大......
  • makefile
    makefile的三要素:目标:要生成的目标文件依赖:目标文件由哪些文件生成命令:通过执行命令由依赖文件生成目标规则:目标:依赖<Tab>命令 执行make指令,默认是生成第一个目标原理:1.当依赖文件不存在,如果有的依赖文件不存在,则向下搜索规则,看是否有生成......