首页 > 编程知识 正文

makefile是什么,linux编译c文件

时间:2023-05-04 04:33:54 阅读:49350 作者:4962

Autotools中常见的软件包(如autoconf、automake和libtool ),每个软件包都有多个工具。 这些工具有助于自动生成makefile,但命令过程很复杂,而且会在过程中生成大量不同的配置文件和脚本。 很多人容易觉得麻烦,理解不了复杂的关系,但自己写的文章,想帮助大家理解里面的关系。

在手工制作makefile时代初期,我们在Unix、linux环境中开发了软件。 makefile都是手写的。 makefile允许您使用make命令直接编译源代码。

此后,随着Unix版本的增加,每个分支的差异都变大,我们写的makefile在其他Unix平台上可能会编译失败,例如库问题。 库和头文件的路径可能因操作系统版本而异。 怎么办? 之后,我们通过手写配置脚本配置解决了这个问题。 在您当前的Unix平台上,用脚本配置makefile可以在当前平台上愉快地编译。

到了Autoconf时代,linux操作系统问世,后续版本也随之增多,各种版本错综复杂,包括Redhat系列、debian系列等。 差异越来越大,甚至操作系统界面也出现了差异。 此时,makefile能否正确编译的问题当然存在,即使我们创建的APP应用程序编译正确,也可能无法在其他平台上运行。 大家都知道,这个问题后来出现了POSIX API标准。 那是可移植的操作系统接口。 无论您发布的是什么版本的Unix、Linux,操作系统界面都遵循此标准,以确保我们创建的APP应用程序在Linux、Unix等系列版本的操作系统上顺利运行对于makefile,为了适应操作系统的更多版本,只能继续添加代码。 结果,配置脚本变大,开发人员无法承受,维护成本变高。

1991年,David Mackenzie开发了用于自动生成配置脚本的Autoconf工具。 因为对于很多用户来说,关于版本的差异、库的版本、基础的详细情况,鬼才是不擅长的。 他们关心的是库文件、头文件的位置和软件的最终安装路径在哪里。 因此,这个工具的出现,极大地解放了开发者的时间,给很多程序员带来了福音。 用户可以定义一些宏,指示感兴趣的配置选项,将其存储在configure.ac文件中,然后使用Autoconf工具自动生成configure脚本。

Autoconf工具比阿姨更亲切,为了减轻程序员的负担,configure.ac文件也不需要我们手写。 Autoconf工具包包含自动扫描项目并生成configure.scan文件的autoscan工具,可以自动添加宏,无需手动添加。 将此configure.scan文件重命名为configure.ac文件并应用修补程序即可。 Autoconf工具大大减轻了程序员的负担,妈妈,不用再担心很晚回家吃饭了

autoconf :用于生成可执行http://www.Sina.com /的工具的工具。 由autoconf生成的配置脚本在运行时不需要用户手动操作。 通常,您甚至不需要手动指定参数来确定系统类型。 相反,我们将单独测试软件包所需的各种特性。 在每次测试之前,都会打印一行消息,表示正在进行测试,以防止用户等待脚本运行并烦躁不安。 因此,它在混合系统和从各种常见UNIX变种定制的系统中运行良好。 也可以省去工作。 不需要维护文件来保存每个UNIX变种或版本支持的特征列表。 在automake时代,随着项目的增长,makefile也变得复杂,特别是在大型项目中更难手写。 我该怎么办?

automake工具在这个时候闪亮登场了!

开发人员关心的是,这个项目将生成什么样的可执行文件,需要编译什么源文件,以及如何编译。 的链接细节,鬼才懒得管。 程序员加班已经足够了,心里已经很累了。 我们拒绝makefile的肆虐和压迫

使用automake工具访问自动地配置软件源代码包以适应多种UNIX类系统的shell脚本

只需要手工编写一个makefile.am文件,lldhy定义我们想要生成的目标、需要编译的源文件,然后使用automake工具就可以帮我们自动生成makefile!

但是Makefile.am将指明工程需要哪些源文件,建造的是什么,如何安装它们

为了在特定平台上成功编译,必须设置上一个脚本配置,最终为项目生成makefile。

Autoconf工具通过定义一系列宏为我们提供。 设置所需的配置选项或配置makefile吧。

随后,Automake工具出现后,我们自定义了一些宏,并扩展了这些宏。

例如,Autoconf以前是单独使用的,但现在要与automake配合使用,请将它添加到configure.ac文件中

AM_INIT_AUTOMAKE这个宏。

这个宏是在automake工具包里定义的,当我们运行autoconf命令的时候,就是出错,因为找不到这个宏的定义。怎么办,咋办?

后来在configure.ac同目录下,定义一个aclocal.m4格式的文件,里面存放用户定义的一些宏、或者automake的一些宏,这样,autoconf运行的时候,就可以在这个文件里找到宏定义了。


偷懒,是人类社会进步的最大动力。后来,为了进一步减少工作量,又出现一个aclocal工具,会自动将automake、autoconf以及用户定义的所有宏统统放在aclocal.m4文件里。

autoconf工具包里还有一个autoheader工具,用来将configure.ac里面的宏配置转换为我们C语言格式的#define形式,并保存在config.h.in文件里,当我们运行./configure生成makefile的时候,顺便也会将config.h.in转换为config.h文件,这样在我们的程序里,如果想使用这些宏,就可以直接#include “config.h”就可以了。

比如头文件里面定义的软件版本号VERSION宏,就可以在程序里直接使用,打印在程序里打印我们的软件版本号。

automake:是一个从文件Makefile.am自动生成Makefile.in的工具。每个Makefile.am基本上是一系列make的宏定义(make规则也会偶尔出现)生成的Makefile.in,服从GNU Makefile标准。为了生成Makefile.in,automake需要perl。但是由automake创建的发布完全服从GNU标准,并且在创建中不需要perl。

总之:GNU 提供的Autoconf及Automake这两套工具使得编写makefile不再是一个难题。我们可以利用 这两套工具来协助我们自动产生 Makefile文件,并且让开发出来的软件可以像大多数源码包那样,只需"./configure", “make”,“make install” 就可以把程序安装到系统中。

libtool时代

随着Unix、Linux之间的差异越来越大,对动态共享库的管理差异也越来越大,比如有些共享库,使用.so格式,有的是.a,有的是.o的形式。运行时对动态库的管理方式也一样,有的操作系统支持动态加载,有的就不支持。这就对我们Makefile带来了挑战。怎么办?libtool的工具出现就是为了解决这个问题的,它通过对生成的动态库进行抽象,统一生成.la的形式,可以支持十几种各种不同的平台。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。