非典型性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

相关文章

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则

MySQL Workbench 安装教程(保姆级)

《MySQLWorkbench安装教程(保姆级)》MySQLWorkbench是一款强大的数据库设计和管理工具,本文主要介绍了MySQLWorkbench安装教程,文中通过图文介绍的非常详细,对大... 目录前言:详细步骤:一、检查安装的数据库版本二、在官网下载对应的mysql Workbench版本,要是

通过Docker Compose部署MySQL的详细教程

《通过DockerCompose部署MySQL的详细教程》DockerCompose作为Docker官方的容器编排工具,为MySQL数据库部署带来了显著优势,下面小编就来为大家详细介绍一... 目录一、docker Compose 部署 mysql 的优势二、环境准备与基础配置2.1 项目目录结构2.2 基

Linux安装MySQL的教程

《Linux安装MySQL的教程》:本文主要介绍Linux安装MySQL的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux安装mysql1.Mysql官网2.我的存放路径3.解压mysql文件到当前目录4.重命名一下5.创建mysql用户组和用户并修

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件