非典型性C语言教程- x.3 make

2024-02-08 05:18
文章标签 语言 教程 make 典型性 x.3

本文主要是介绍非典型性C语言教程- x.3 make,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前面介绍了两种IDE的使用,大部分IDE的使用都大同小异。对于C/C++来说,所有的IDE都是通过著名的make程序来管理工程的。下面简单介绍一下make。

IDE里面会有工程(project)的概念,一个工程最后构建出一个可执行体。实际上每一个工程都是用make程序来管理的。什么是make呢? 可以参考下面两个链接 Gnu的make, wiki百科的make词条。后一个连接可能需要用代理才能打开(被伟大的G*F*W*e*d了)。

在这里转中文wiki百科关于make的介绍

Make

维基百科,自由的百科全书

跳转到: 导航, 搜索

make是一个自动转化文件形式的工具,同时它也会检查文件的从属关系,如果需要的话,它会调用一些外部的软件来完成任务。它的依靠关系检查系统非常简单,主要是使用输入文件的修改时间。大多数情况下,它被用来编译源代码,生成结果代码,然后把结果代码连接起来生成可执行文件或者库文件。它使用叫做"makefile"的文件来确定一个输出文件的从属关系,然后把编译脚本程序传给shell去编译这个文件。"makefile"这个词是来自于它通常的文件名"makefile"和后来的"Makefile"

目录

  • 1 起源
  • 2 现在版本
  • 3 优点和缺点
  • 4 Makefile的结构
  • 5 makefile 例子

起源

现在有不少的从属关系检查工具,但是make是被使用最广泛的一个之一,主要是归功于它被包含在Unix系统中。Stuart Feldman 在1977年在贝尔实验室里制作了这个软件。2003年Feldman因发明了这样一个重要的工具而接受了美国计算机协会(ACM)颁发的软件系统奖。

在make诞生之前,Unix系统的编译系统主要由"make"和"install"shell脚本程序和程序的源代码组成。它可以把不同目标的命令组成一个文件,而且可以抽象化从属关系的检查和存档。这是向现代编译环境发展的重要一步。

现在版本

make程序已经被多次重写,其中包括几次用相同的文件格式和算法原理从新编写,并且添加了一些不常见的改进。三个不同的make程序是:

  • BSD make, 是从Adam de Boor的制作的版本上发展成的。它编译目标的时候有并行计算的能力。它在FreeBSD,NetBSD 和 OpenBSD 中不同程度的修改下存活了下来。
  • GNU make, 是大多数GUN Linux 安装的一部分,常常被和GNU编译系统一起使用。
  • NMAKE, Visual C++使用的编译系统。

优点和缺点

就像其他和make有着悠久历史的软件一样,它有着很多的拥护者和反对者。它的很多问题因现代大型的软件项目的出现而暴露出来。但是很多人争论说它在常见的情况下可以很好的工作,而且使用非常的简单,功能强大,表达清楚。无论如何,make仍然被用来编译很多完整的操作系统,而且现在替代品们在基本的操作上与它没有太大差别。

随着现代的集成开发环境(IDE)的诞生,特别是非Unix的平台上,很多程序员不再手动管理依靠关系检查,甚至不用去管哪些文件是这个项目的一部分,而是把这些任务交给了他们的开发环境去做。类似的,很多现代的编程语言有自己特别的高效的从属关系的设置方法。

Makefile的结构

一 个makefile是由定义一个文件或者一些规定依靠关系的文本组成。比如说,输出文件被标记着要依靠它的源文件,而源文件被标记着要依靠它内部 include的文件。在每个依靠关系都被列出来之后,一系列的文本就会来定义如何把输入文件转化成输出文件。这些定义会被称为编译脚本程序,并且被转到 shell去生成目标文件。它的基本结构是:


# Comments use the pound sign (aka hash)
target: dependencies
command 1
command 2
.
.
.
command n

makefile 文件也可以包含变量的定义和其他的makefile。makefile里面的变量可以被命令窗口调用make工具时的参数而改变。 这样就允许用户去设定编译脚本的不同功能。比如说,CC变量在makefile里面通常被用来指一个C的编译器,用户可以通过设定参数去使用不同的编译 器。

makefile 例子

下面是一个非常简单的例子。这段命令让makefile用C编译器来编译一个叫helloworld.c源文件。

helloworld: helloworld.o
cc -o $@ ___FCKpd___1lt; helloworld.o: helloworld.c cc -c -o $@ ___FCKpd___1lt; .PHONY: clean clean: -rm -f helloworld helloworld.o



当C 语言编写的软件规模很大时,将整个程序完整的编译出来,有时需要很多步骤,可能需要编译上10万个源文件,还有额外的拷贝,建文件等步骤,有时有些头文件 和源文件还需要其他的自动生成工具生成。手工敲一个一个编译命令会让人发疯。这是需要写一个批处理脚本,自动的执行大量的编译命令。make实际上就是这 么一个脚本工具的增强版本。 上面提到,make会自动检查依赖关系。

make是一个工具,make工具执行时需要一个makefile 文件。这个Makefile文件和Unix脚本一样可以使用宏变量,管道,条件分支,循环等一系列复杂的语法,还可以使用一切shell可以执行的程序。 看一看Linux内核的make文件就知道make可以写到多么复杂了。

这篇关于非典型性C语言教程- x.3 make的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/690006

相关文章

Nexus安装和启动的实现教程

《Nexus安装和启动的实现教程》:本文主要介绍Nexus安装和启动的实现教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Nexus下载二、Nexus安装和启动三、关闭Nexus总结一、Nexus下载官方下载链接:DownloadWindows系统根

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个

Go语言中Recover机制的使用

《Go语言中Recover机制的使用》Go语言的recover机制通过defer函数捕获panic,实现异常恢复与程序稳定性,具有一定的参考价值,感兴趣的可以了解一下... 目录引言Recover 的基本概念基本代码示例简单的 Recover 示例嵌套函数中的 Recover项目场景中的应用Web 服务器中

CnPlugin是PL/SQL Developer工具插件使用教程

《CnPlugin是PL/SQLDeveloper工具插件使用教程》:本文主要介绍CnPlugin是PL/SQLDeveloper工具插件使用教程,具有很好的参考价值,希望对大家有所帮助,如有错... 目录PL/SQL Developer工具插件使用安装拷贝文件配置总结PL/SQL Developer工具插

Java中的登录技术保姆级详细教程

《Java中的登录技术保姆级详细教程》:本文主要介绍Java中登录技术保姆级详细教程的相关资料,在Java中我们可以使用各种技术和框架来实现这些功能,文中通过代码介绍的非常详细,需要的朋友可以参考... 目录1.登录思路2.登录标记1.会话技术2.会话跟踪1.Cookie技术2.Session技术3.令牌技

Python使用Code2flow将代码转化为流程图的操作教程

《Python使用Code2flow将代码转化为流程图的操作教程》Code2flow是一款开源工具,能够将代码自动转换为流程图,该工具对于代码审查、调试和理解大型代码库非常有用,在这篇博客中,我们将深... 目录引言1nVflRA、为什么选择 Code2flow?2、安装 Code2flow3、基本功能演示

Java Spring 中的监听器Listener详解与实战教程

《JavaSpring中的监听器Listener详解与实战教程》Spring提供了多种监听器机制,可以用于监听应用生命周期、会话生命周期和请求处理过程中的事件,:本文主要介绍JavaSprin... 目录一、监听器的作用1.1 应用生命周期管理1.2 会话管理1.3 请求处理监控二、创建监听器2.1 Ser

MySQL 安装配置超完整教程

《MySQL安装配置超完整教程》MySQL是一款广泛使用的开源关系型数据库管理系统(RDBMS),由瑞典MySQLAB公司开发,目前属于Oracle公司旗下产品,:本文主要介绍MySQL安装配置... 目录一、mysql 简介二、下载 MySQL三、安装 MySQL四、配置环境变量五、配置 MySQL5.1

MQTT SpringBoot整合实战教程

《MQTTSpringBoot整合实战教程》:本文主要介绍MQTTSpringBoot整合实战教程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录MQTT-SpringBoot创建简单 SpringBoot 项目导入必须依赖增加MQTT相关配置编写