在Linux操作系统下进行开发,编写Makefile似乎是不可缺少的事情。但是对于一个比较大的工程,编写一个符合规范的Makefile并非易事。而且由于Makefile的各种显式,隐式规则,加之平时并不经常编写Makefile,导致我们写一个Makefile文件变得更加困难了。

幸好Linux社区有一群非常懒,又非常勤奋得程序员,他们开发了一个可以自动生成Makefile文件得工具,这就是autotools.该工具可以通过扫描源文件,自动生成一个Makefile文件。是不是很神奇!下面是生成Makefile的一个整体流程,我们后面慢慢介绍。

安装autotools

有的系统可能并没有autotools工具,需要手动安装,以Ubuntu为例,可以通过如下命令进行安装:

sudo apt install automake

完成安装之后就可以使用autotools进行下面的流程了。

生成configure.ac文件

首先我们要准备一些源文件,如下图是本文准备的源文件。本文以C++语言开发的程序为例,其中main.cpp是主程序所在文件,而async_network*和storage*分别是网络通信模块和本地存储模块,分别封装了一个C++类来实现具体的功能。本文通过多个文件是为了增加项目的复杂性。源文件的具体内容本文不再赘述,因为这个与内容无关。

完成对源文件创建后,我们就可以通过autoscan命令对该目录进行扫描,生成configure.scan文件。首先切换到该目录,然后执行命令,具体如下:

autoscan

执行成功后可以看出多了两个文件,一个是autoscan.log,这个是日志文件;另外一个是configure.scan文件,这个是扫描的结果文件。

这里configure.scan其实是一个模板文件,我们需要手动修改一下其内容,并将其改名为configure.ac。具体需要做:

1) AC_INIT里面的参数: AC_INIT(main,1.0, sunnyzhang@126.com);

2) 添加宏AM_INIT_AUTOMAKE;

3) 在AC_OUTPUT后添加输出文件Makefile。

完成修改后的文件内容如下:

生成aclocal.m4文件

直接执行aclocal命令即可生成该文件:

aclocal

aclocal.m4是一个宏定义文件,该文件内容的生成依赖于configure.ac文件。aclocal会根据confgure.ac文件的内容,搜索本地的m4文件(通常在类似目录下面/usr/share/aclocal-1.15/),然后生成一个在本目录下面使用的aclocal.m4文件。

生成config.h.in文件

该文件的生成比较简单,直接在命令行执行如下命令即可:

autoheader

这个文件是一个模板文件,后面会利用该文件生成config.h文件。该文件包含一些宏定义。

生成Makefile.in文件

生成Makefile.in文件之前需要首先手动的创建一个Makefile.am文件,该文件用于描述源文件与目标文件的关系。本文对应的Makefile.am文件如下所示:

可以看出该文件非常简单,这比写一个Makefile要简单的多。

如果要生成多个目标文件,需要在这里写多个源文件与目标文件的对应关系。这种情况是非常常见的,比如一些复杂的项目中通常会包含主程序,测试程序,动态库等等。

生成configure文件

上述文件都生成后就可以生成configure文件了。该文件是用于生成Makefile的一个脚本。我们在很多开源项目中肯定都遇到过。在开源项目中通常都有一个生成好的configure文件,我们只需要执行该文件就可以生成Makefile。

生成configure文件的方法很简单,我们执行如下命令即可:

autoconf

至此我们完成了生成Makefile的所有准备工作,然后我们在该目录下面运行configure脚本,即可生成Makefile文件。

./configure

可以看出,在整个过程中我们只需要手动修改或者创建2个文件,而且修改的内容很少。最后我们就可以得到一个完整的Makefile文件。对于大型的软件项目,这种方法无疑是非常有效的。

今天的内容就到这里,大家只需要按照步骤运行就可以生成Makefile文件。后续我们在对每个工具进行更加深入的介绍,这样大家不仅能知其然,还能知其所以然。

linux系统中自动生成snap文件_在Linux操作系统下自动生成Makefile的方法相关推荐

  1. linux如何生成tar文件内容,在Linux系统中创建tar.gz文件的方法及实例讲解

    本文介绍在Linux系统中创建tar.gz文件的方法,及实例讲解. 介绍 tar存档是一个文件,用于存储其他文件的集合,包括有关它们的信息,例如所有权.权限和时间戳. 在Linux操作系统中,可以使用 ...

  2. Linux系统中一些目录和文件的详细解释(参照RHEL5.4)

    linux有四种基本文件系统类型: –普通文件:如文本文件.c语言源代码.shell脚本等,可以用cat.less.more.vi等来察看内容,用mv来改名: –目录文件:包括文件名.子目录名及其指针 ...

  3. linux常用删除空文件夹,Linux基础 linux系统中的批量删除文件与空文件删除的命令介绍...

    Linux基础教程linux系统中的批量删除文件与空文件删除的命令介绍 Linux资料下面删除文件或者目录命令rm(remove): Linux培训功能说明:删除文件或目录. 语 法:rm [-dfi ...

  4. linux如何找大文件夹,Linux系统中如何查找大文件或目录文件夹的方法

    Linux系统中如何查找大文件或文件夹的方法 在Windows系统中,我们可以使用TreeSize工具查找一些大文件或文件夹,非常的方便高效,在Linux系统中,如何去搜索一些比较大的文件呢?下面我整 ...

  5. Linux系统中如何查找大文件或目录文件夹的方法

    Linux系统中如何查找大文件或文件夹的方法 在Windows系统中,我们可以使用TreeSize工具查找一些大文件或文件夹,非常的方便高效,在Linux系统中,如何去搜索一些比较大的文件呢?下面我整 ...

  6. 怎样在 Linux 系统中恢复被删除文件

    导读 当用户意外地删除了一个仍然需要的文件时,大多数情况下,是没有简便的方法可以重新找回或重建这个文件.不过,幸运的是文件是可以通过一些方法恢复的.当用户删除了一个文件,该文件并没有消失,只是被隐藏了 ...

  7. 成功恢复 Linux 系统中已删除的文件

    点击关注公众号,回复"1024"获取2TB学习资源! 当用户意外地删除了一个仍然需要的文件时,大多数情况下,是没有简便的方法可以重新找回或重建这个文件.不过,幸运的是文件是可以通过 ...

  8. linux中profile文件作用,解析Linux系统中bashrc和profile文件的作用区别

    使用终端ssh登录Linux操作系统的控制台后,会出现一个提示符号(例如:#或~),在这个提示符号之后可以输入命令,Linux根据输入的命令会做回应,这一连串的动作是由一个所谓的Shell来做处理. ...

  9. linux中一切都是文件_在Linux中,“一切都是文件”是什么意思?

    linux中一切都是文件 One of the defining features of Linux and other UNIX-like operating systems is that &qu ...

最新文章

  1. 自然语言(NLP)发展史及相关体系
  2. ios android 内存不足,怎样解决手机内存不足?iOS系统可以试试这些方法
  3. SparkSQL之External Data
  4. 天谕手游会长大人与司空望月,谁的人气更高?都是NPC,别比了
  5. Shell(7)——case
  6. 二叉树的最大深度Python解法
  7. 汇编语言重写除零中断
  8. h5分享到朋友圈_微信朋友圈创意招聘广告制作方法 H5模板
  9. 控件的布局 1124
  10. python的前世今生
  11. 如何重新安装微软应用商店
  12. JDBC 数据连接池
  13. 分享微信预约系统开发制作步骤_教你实现微信公众预约系统的方法
  14. FEC(前向纠错码)
  15. 空间直线同球体交点求解
  16. 必读论文 | 机器交互必读论文8篇
  17. YAH2460型圆振动筛设计
  18. win7休眠 计算机管理,win7休眠设置在哪 win7休眠设置方法【图文】
  19. 如何设置Android手机的sqlite3命令环境
  20. org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'dataSource' is defin

热门文章

  1. java 打印16进制数组_如何在Java中将字节数组转换为十六进制字符串?
  2. ios APP进程杀死之后和APP在后台接收到推送点击跳转到任意界面处理
  3. @Autowired @Primary @Qualifier
  4. python selenium-9 grid模式
  5. 微信小程序开发教程(六)配置——app.json、page.json详解
  6. Light oj 1214-Large Division (同余定理)
  7. EditPlus使用技巧(汇总)
  8. ICCV 2021 | 带你了解微软亚洲研究院CV领域前沿进展
  9. 谷歌大脑:探索权重无关神经网络
  10. 注意!Python开发中最容易掉进去的10个坑!你遇到过那些