什么是 GNU helloGNU hello
程序主要的新东西自己手写,一些体力劳动就直接复制粘贴了。最终出来的内容不一定与 GNU hello 完全相同。
本篇学习内容基本的程序文件组织方式
程序文件的组织严格来说,一个程序并没有什么标准的组织规范,任何组织形式都是可以的。但是良好的程序文件组织结构可以让人快速定位开发文件,更好地管理项目。在 长期的实践中,Unix社区对一些常见文件的组织逐渐形成了一些传统,这些传统不仅是经受了时间的考验,也能让别人更好的了解自己的项目文件组织结构。
在 GNU hello 中,文件是这样组织的(设“/”是代码根目录)
Autoconf 和 Automake它们是干啥的?Unix下的软件,编译安装一般来说是要运行如下三条命令:
1../configure
2.make
3.make install
make是通过Makefile里指定的命令与目标来进行相应操作的程序,可以简单地理解为一串指令的集合(当然, 它远远不止于此)。用它就不必为编译代码写一条条的指令,只要把相关的指令写在Makefile里,直接make就行了。
然而不同的系统里装的软件不一样。可能一台机子里装了gcc,另一台机子里装的是cc。为了使Makefile能在所有机子里通用,就了有 configure脚本。代码里并不带有Makefile,只有一个模板文件Makefile.in,里面用变量来定义要使用的命令,由 configure脚本将检测到的工具填入Makefile.in生成Makefile。
但是不论是configure脚本还是Makefile,都并不是两句话可以写完的,而其内容多是类似的重复内容,于是就有了autoconf和automake。它们通过一些相对简单的语法来生成标准的configure脚本和Makefile。
准备工作写一个最简单的hello world,存为src/hello.c:
2
3
4
5
6
7
8
在顶层目录运行autoscan,软件自动生成configure.scan,这是一个根据现有代码生成的configure.ac模板,将它另存为如下的configure.ac文件:
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
与configure.ac不同,我们要为每个文件夹写一个Makefile.am文件
根目录下的Makefile.am文件很简单,它不用做任何事情, 只要告诉make它有个子目录src,让make去操作src目录:
2
2
3
4
5
01
02
03
04
05
06
07
08
09
10
其中,aclocal是为autoconf进行准备工作的。
automake默认是GNU模式,GNU规范要求程序包含(NEWS README AUTHORS ChangeLog)等说明文件,我们用touch暂创建几个临时文件上去。
automake还需要创建一些辅助脚本,这些脚本由--add-missing选项添加到目录中。由于在configure.ac里用 AC_CONFIG_AUX_DIR定义到了build-aux目录下,我们要先创建这个目录。如果没有指定--copy,那么创建的是指向 automake安装目录相应文件的符号链接,指定后是直接复制一份。
可以看到autoconf创建了configure脚本,而automake则在程序根目录和src子目录下创建了Makefile.in,接下来就用configure脚本配合Makefile.in来生成Makefile:
1
由于我们在configure.ac里用AC_CONFIG_FILES指定了生成Makefile和src/Makefile两个文 件,configure脚本通过相应的.in文件替换到检测到的相应变量后生成。注意生成的文件不仅限于Makefile,任何文件名都是可以的,只要它 有.in模板。
有了Makefile就可以make啦:
1
直接用make也可以。all是指定的目标,也是一个约定俗成的目标(这是Makefile指定的,不同Makefile可以指定不同的目标,只要把它放在第一个就行),它的作用是编译程序。
于是现在可以执行Hello world了:
1
可以看到我的hello world出现了:-)
换一个目标试试:
1
有安装自然也有卸载,卸载的目标是uninstall。
还可以用make clean来清除编译出来的文件。