Electronic Joint Business

Solution for E-Business

makefile

用 autoconf 和 automake 生成 makefile

文章评价:
在 Unix/Linux 上编写程序的人大都遇到过 Makefile,尤其是使用 C/C++ 语言的开发者。用 make 来开发和编译程式的确很方便,可是要编写一个 Makefile 就不那么简单了。而且介绍 Makefile 的资料并不多,GNU Make 那份打印出来要几百页的文件,光看完序言就是花不少时间,难怪许多人谈 Unix 编程而色变。

本文将介绍如何利用 GNU Autoconf 及 Automake 这两套软件来帮助我们“自动”生成 Makefile 文件,让开发出来的软件可以像 Apache,MySQL 等常见应用一样,只要输入 “ ./configure ”, “ make ”,“ make install” 就可以把编译结果安装到系统中。

如果您有心开发开源软件,或主要是在 Unix/Linux 系统下编写程序。希望这份介绍文件能帮助您轻松地进入 Unix/Linux 编程的殿堂。

简介
Makefile 基本上就是“目标”(target), “依赖”(dependencies) 和“动作”三者所组成的一连串规则。而 make 就会根据 Makefile 的规则来决定如何编译 (compile) 和链接 (link) 程序。实际上,make 可做的不只是编译和链接程序,例如 FreeBSD 的 port collection 中,Makefile 可以自动去下载原始程式包,解压缩 (extract) ,打补丁 (patch),然后运行设定并编译,最后安装至系统中。

Makefile 基本构造虽然简单,但如能妥善运用这些规则就也可以玩出许多不同的花样。却也因此,许多人刚开始学习写 Makefile 时会感到没有规范可循,每个人写出来的 Makefile 长得都不太一样,不知道从何下手,而且常常会受限于自己的开发环境,只要环境参数不同或路径被修改一下,可能就需要跟着修改 Makefile。虽然有 GNU Makefile Conventions (GNU Makefile 惯例) 订出一些使用 GNU 程序设计时撰写 Makefile 的一些标准和规范,但是内容很长而且很复杂, 并且经常调整。为了减轻程序设计师维护 Makefile 的负担, GNU 推出了 Automake 这个工具。

>>> 阅读全文

 

, , , ,

在 Eclipse 中集成 MinGW64 开发环境

文章评价:

本文主要讨论如何集成 Eclipse 和 MinGW64 来进行 C/C++ 应用程序的开发。由于不同版本 Eclipse CDT 的稳定性表现不一,因此需要你合理选择 Eclipse 的版本,现在已知 Helios (Eclipse 3.6) 的 CDT 在开发中会频繁崩溃,不建议使用。本文选择的是 Eclipse 4.3.1 来讲解,其他版本方法基本相同。

GCC编译器
首先要做的是下载一个合适的 MinGW64 编译器。要开发并运行 64 位的 Windows 应用,你可以选择 32 位的 GNU C/C++ 编译器并通过交叉编译来产生 64 位应用, 也可以选择纯 64 位的编译器。在 MinGW64 的官方站点上提供了许多不同的版本,你可以在 EJB.CC 下载到 GCC 4.6.1 for Windows ,或者在SourceForge.net上选择最新的版本。

同时还需用到 MSYS(在 MinGW 的站点上提供),MSYS 提供一些常见的 Linux 命令工具用于 Windows GCC 的编程开发,目前只有 32 位版本,不过不会对代码生成有任何影响。

接下里要做的就是为 Eclipse 安装最新的 CDT,目前 Galieo 只支持 CDT 6.0,Helios 则支持 CDT 7.0,而 Indigo 则支持 CDT 8.0,以此类推。如果你下载的 Eclipse 并未集成 CDT,你可以从 “Help” 菜单下选择 “install new software”,之后在 “avaiable software” 中的 “programming languages” 中选择各个 C++ 子项并安装。

>>> 阅读全文

 

, , , , ,

详解GNU Make (二) 高级用法

在上一篇文章中,我们了解了 makefile 的基本结构和一些常见用法,在这篇文章中我们会更深入地了解一些“高级用法”,这些用法在实际的例子中相当常见,可以极大地提高 makefile 的编写效率。

Makefile 里有什么?
Makefile 里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释。

  • 显式规则。显式规则说明了如何生成一个或多的的目标文件。这是由 Makefile 的编写者显示地指出:要生成的文件、文件的依赖文件和生成命令。
  • 隐晦规则。由于 make 有自动推导的功能,所以隐晦规则可以让编写者比较简略地编写 Makefile,这是 make 所支持的。
  • 变量定义。在 Makefile 中我们可以定义一系列的变量,变量一般都是字符串,有点 C 语言中的宏,当 Makefile 被执行时,其中的变量都会被扩展到相应的引用位置上。
  • 文件指示。其包括了三个部分:一是在 Makefile 中引用另一个 Makefile,类似 C 语言中的 #include;二是指根据某些情况指定 Makefile 中的有效部分,类似 C 语言中的条件编译 #if ;三是定义多行的命令。有关这一部分的内容,我会在后续的部分中讲述。
  • 注释。Makefile 中只有行注释,和 UNIX 的 Shell 脚本一样,其注释是用“#”字符, 类似 C/C++ 中的“//”。如果要在 Makefile 中使用“#”字符,可以用反斜杆进行转义:“\#”。

最后要注意的是,在 Makefile 中的命令,必须要以 Tab 键开始。

Makefile 的文件名

默认的情况下,make 命令会在当前目录下按顺序找寻文件名为 “GNUmakefile”、“makefile”、“Makefile” 的文件,找到了就解释这个文件。在这三个文件名中,最好使用 “Makefile” 这个文件名,因为,这个文件名第一个字符为大写比较显目。最好不要用 “GNUmakefile”,这个文件是 GNU 的 make 识别的。有另外一些 make 只对全小写的 “makefile” 文件名敏感,但是基本上大多数的 make 都支持 “makefile” 和 “Makefile” 这两种默认文件名。

>>> 阅读全文

 

, , , , , ,

详解GNU Make (一) 基本规则

文章评价:
一个较大的项目会有许许多多源文件,一般我们会按类型、功能、模块等类别分别放在若干个目录中,makefile 提供了一系列的规则用于指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile 就像一个 Shell 脚本一样,其中也可以执行操作系统的命令。

因此,makefile 关系着整个项目的编译规则,带来的好处就是“自动化编译”。一旦写好 makefile,你只需要运行 make 命令,整个工程完全自动编译,极大地提高了软件开发的效率。

负责解释 makefile 中指令的工具是 make。一般来说,大多数的 C/C++ 编译器都提供这个工具,最常见的有:Visual C++ 的 nmake,GNU 的 make。但是不同产商的 make 各不兼容,makefile 语法也略有不同。这里我们以应用最为广泛的 GNU make 来做讲解。

Makefile 介绍
我们先引用 GNU 的 make 使用手册中的一个例子,假设我们的工程有 8 个 C 文件和 3 个头文件,要如何编写 Makefile 来实现自动编译和链接这几个文件。我们的要求是:
1)如果这个工程没有编译过,那么我们的所有 C 文件都要编译并被链接。
2)如果这个工程的某几个 C 文件被修改,那么我们只编译被修改的 C 文件,并链接目标程序。
3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的 C 文件,并链接目标程序。

所有这些要求,只需要一个 makefile 就可以完成了。make 命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。

>>> 阅读全文

 

, , , , ,