在 Linux 中使用 Eclipse 和 Gnu Autotools 管理 C/C++ 项目
在我该系列的之前的所有随笔中,都是采用 Linux 发行版自带的包管理工具(如 apt-get、yum 等)进行软件的安装和卸载,从来没有向大家展示使用源代码自行编译安装软件的方法。但是长期混迹于 Unix/Linux 世界的童鞋们都知道,从源代码自行编译安装软件并不是那么的难,一般都是这样三个步骤:
configure
make
make install
之所以能够把源代码的构建管理得如此简单,这得益于 Gnu 的 Autotools 工具链。在上面的三个命令中,configure 是一个脚本,它的功能很强大,可以探测系统环境,比如探测出系统中的编译工具版本、标准库版本以及其它需要依赖的工具,生成一个Makefile,而后面的 make 和 make install 就根据刚生成的 Makefile 进行软件的编译和安装。看似很简单,但事实上 Autotools 工具链非常复杂,复杂到我多少次想学习这些工具都望而却步。直到我遇到 Eclipse。
先来说说 Gnu Autotools,关于该工具链的使用方法网上有很多的博文,我这里来一张图片先:
可以看到,Gnu Autotools 包含了 autoscan、aclocal、automake、autoconf、autoheader 等工具,而且还涉及一门非常古老的宏语言 m4 。其工作原理是这样的,先由 autoscan 对源码进行扫描,生成一个 Configure.scan 文件,然后用户对该文件进行编辑,生成 configure.in 文件。用户还要编写一个文件,那就是 Makefile.am 文件。然后 automake 对 Makefile.am 和 configure.in 文件进行处理,生成 Makefile.in 文件,而 autoconf 工具对 configure.in 进行处理,生成 configure 脚本, autoheader 工具对 configure.in 文件进行处理,生成 config.h.in 文件。至此,Autotools 工具的使命完成,生成的这些文件可以交付给用户使用了。用户拿到源码包后,运行 configure 脚本,该脚本会处理 Makefile.in 文件,生成最后的 Makefile,同时处理 config.h.in 文件,生成 config.h 文件。有了 Makefile,用户就可以使用 make 和 make install 编译和安装该软件了。(注:configure.in 或 configure.ac 均可。)
那么 aclocal 命令干啥用呢?这是因为 configure.in 文件中包含了大量的 m4 宏,这些宏最终都会展开为各种各样的 Shell 代码,用来探测系统环境。但是这些宏的定义往往散布在系统的各个角落,aclocal 命令就是将这些用到的宏收集到一个文件 aclocal.m4 中。
这个工具链真的是太复杂了,幸好我有 Eclipse。看过我 Java 博客的朋友都知道我是 Eclipse 粉,这里不多说。我们来看看 Ubuntu 的软件源中都有 Eclipse 的哪些包,如下图:
命令sudo aptitude search eclipse 可以找出软件源中所有包含单词 eclipse 的软件包,但是我要过滤一下,不是以 eclipse 开头的不要,包含“:i386”的也不要,因为我是64位的平台,默认的软件包正适合我,所以就有了后面的 | grep ' eclipse' | grep -v ':' ,最后,再加一个管道,使用 awk 命令只显示第2列,也就是软件包的名字。结果如上图所示。
从这些结果中可以看出,eclipse-cdt 是用来写 C/C++ 代码的 IDE 环境,而且还有 eclipse-cdt-autotools 包可用,那真的是正中我的下怀。不过我更贪心一点,我想安装所有的这些和 eclipse 相关的包,怎么办?有办法,在上面的命令后面再加上 | xargs echo sudo aptitude install 即可生成一个安装所有这些包的命令。我把生成的结果重定向到一个脚本文件,给该脚本文件加上执行权限,然后运行它,如下图:
回答一个“y”,就耐心地等待 eclipse 的安装吧。安装完成后,启动 eclipse ,新建项目的时候就可以选择 C++ 项目了,如下图:
点下一步,是如下界面:
可以看到有很多种项目类型可以选择,Eclipse 既可以使用它自己的项目文件管理 C/C++ 项目,也可以使用 Makefile 管理项目,当然,我们这里选择使用 Gnu Autotools 管理项目,而且选择简单的“Hello World”示范项目。点下一步,如下图:
输入一些项目相关的信息,再继续点下一步,如下图:
如果点那个“Advanced settings”按钮,还可以对 Gnu Autotools 工具链进行更详细的设置。如下图:
这个我这里就不瞎折腾了,点 OK 返回刚才的对话框,然后点 Finish 按钮,结果如下图:
Eclipse 提示我进入 C/C++ 透视图。那是必须的,点 Yes 按钮,结果如下图:
左边是项目文件的组成,右边可以看到 Makefile 的各个 Target,上面的一排工具栏,带锤子的那个就是 Build 命令。再看看下图:
而带箭头的那个按钮,就是运行程序的命令了。运行左边的那个带小虫子的按钮,就是调试命令。而且从上图可以看出,在 Build 之前,左侧的项目浏览器中看到的文件比较少,除了那个简单的显示 Hello World 的 cpp 文件之外,就只有 configure.ac 和 Makefile.am 值得我们看一看。看看 configure.ac 的内容,如下图,里面就是几行简单的 m4 宏。如下图:
Build 一下,就不得了了,如下图:
左边的项目视图,里面 aclocale.m4、configure脚本、Makefile.in 和 Makefile 都有了,右边的 Makefile 视图也可以看到一满条 Targets 了。中间,让大家见识一下传说中的 m4 宏是什么样子的。
下图,看看生成的 configure 脚本:
四千多行啊,太恐怖了。虽然我在这里 Bash脚本编程语言中的美学与哲学 和大家探讨过 Shell 脚本,但是对于写四千多行的 configure 文件我是想都不敢想。好在该文件是自动生成的。
同样自动生成的文件还有 Makefile ,七百多行,也够人喝一壶的,如下图:
在右边选择一个 Makefile 的 Target,点鼠标右键,在弹出的菜单中选择 Build Target,就可以进行相应的构建。是不是很方便呢?如下图:
现在,把 Eclipse 提供的 GUI 界面和前面介绍的 Gnu Autotools 工具链相互验证一下,是不是感觉突然明白了很多呢?
(京山游侠于2015-03-16发布于博客园,转载请注明出处。)
在 Linux 中使用 Eclipse 和 Gnu Autotools 管理 C/C++ 项目的更多相关文章
- 使用 GNU autotools 改造一个软件项目
使用 GNU autotools 改造一个软件项目 及永刚 jungle@soforge.com 2006 年 3 月 24 日 版本:0.3 本文不是一篇规范的教程,而是用一个软件项目作为例子,演 ...
- 【搭建开发环境】Linux 中安装 Eclipse 进行 C/C++ 开发
引言 Linux 中选用 C/C++ 的 IDE,推荐 Eclipse. 涉及工具:JDK,Eclipse. 欢迎来到 lovickie 的博客 http://www.cnblogs.com/lovi ...
- linux中安装eclipse,安装好之后不能直接建servlet,不能直接在jsp页面中run on server.权限在作怪,我猜的,
最近按照网上的教程安装了eclipse,开始很开心,但是慢慢的用的时候发现,不能在jsp页面run on server ,不能创建servlet,我也是醉了,我当时就猜测是权限问题,很多软件安装之后都 ...
- Linux中ifreq 结构体分析和使用 及其在项目中的简单应用
[基础知识说明] 结构原型: /* * Interface request structure used for socket * ioctl's. All interface ioctl's mu ...
- javaWeb开发中关于eclipse等ide重新部署或重启项目等原因造成上传文件丢失问题解决方案
在开发项目时,有时候需要用到上传功能,比如头像上传等,其文件会保存到服务器中.但是我发现在用eclipse做项目的过程中,每次重新部署项目,原来上传的文件就会丢失. 其原因是因为每次项目修改后,ecl ...
- Linux中使用MegaCli工具查看、管理Raid卡信息
MegaCli是一款管理维护硬件RAID软件,可以通过它来了解当前raid卡的所有信息,包括 raid卡的型号,raid的阵列类型,raid 上各磁盘状态,等等.通常,我们对硬盘当前的状态不太好确定, ...
- linux中kvm的安装及快照管理
一.kvm的安装及状态查看 1.安装软件 yum -y install kvm virt-manager libvirt2.启动libvirtd 报错,升级device-mapper-libs yum ...
- Linux 系统下Eclipse安装及使用
Linux 系统下Eclipse安装及使用 我们在搞上层开发的时候,都是在Windows下使用Eclipse,那么如果是Linux应用开发,就必须要在Linux中安装Eclipse,用于C/C++开发 ...
- 5 个在 Linux 中管理文件类型和系统时间的有用命令
对于想学习 Linux 的初学者来说要适应使用命令行或者终端可能非常困难.由于终端比图形用户界面程序更能帮助用户控制 Linux 系统,我们必须习惯在终端中运行命令.因此为了有效记忆 Linux 不同 ...
随机推荐
- 对抗密码破解 —— Web 前端慢 Hash
(更新:https://www.cnblogs.com/index-html/p/frontend_kdf.html ) 0x00 前言 天下武功,唯快不破.但在密码学中则不同.算法越快,越容易破. ...
- 23种设计模式--责任链模式-Chain of Responsibility Pattern
一.责任链模式的介绍 责任链模式用简单点的话来说,将责任一步一步传下去,这就是责任,想到这个我们可以相当击鼓传花,这个是为了方便记忆,另外就是我们在项目中经常用到的审批流程等这一类的场景时我们就可以考 ...
- 让kindeditor显示高亮代码
kindeditor4.x代码高亮功能默认使用的是prettify插件,prettify是Google提供的一款源代码语法高亮着色器,它提供一种简单的形式来着色HTML页面上的程序代码,实现方式如下: ...
- angular 源码分析 1 - angularInit()
angularjs 是个神奇的框架,由于我的好奇,想了解她的内部工作原理,只能一步一步的走进她,靠近她,和她深入的交流. angularjs 的入口是什么样子的呢?一起掀起她的盖头吧. 在这里我只讲方 ...
- gulp批量打包文件并提取公共文件
gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器. browseriyf是模块化打包工具. 一般情况下,Browserify 会把所有的模块打包成单个文件.单个文件在大多数情况下是 ...
- 从国内流程管理软件市场份额看中国BPM行业发展
随着互联网+.中国制造2025.工业4.0等国家战略的支持与引导,企业在数字经济时代的信息化表现惊人,越来越多企业认识到,对于企业的发展来说,信息自动化远远还不够,企业的战略.业务和IT之间需保持高度 ...
- [Android]使用Dagger 2进行依赖注入 - Producers(翻译)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/6234811.html 使用Dagger 2进行依赖注入 - P ...
- Android中的多线程断点下载
首先来看一下多线程下载的原理.多线程下载就是将同一个网络上的原始文件根据线程个数分成均等份,然后每个单独的线程下载对应的一部分,然后再将下载好的文件按照原始文件的顺序"拼接"起来就 ...
- 从史上八大MySQL事故中学到的经验
本文列举了史上八大MySQL宕机事件原因.影响以及人们从中学到的经验,文中用地震级数来类比宕机事件的严重性和后果,排在最严重层级前两位的是由于亚马逊AWS宕机故障(相当于地震十级和九级). 一.Per ...
- chattr用法
[root@localhost tmp]# umask 0022 一.chattr用法 1.创建空文件attrtest,然后删除,提示无法删除,因为有隐藏文件 [root@localhost tmp] ...