我前面说了很多如何用gcc或 Makefile怎么编译的东东,但在Linux下装过软件的都应当见过,很多源码安装的包是用Automake
 
来编译的。输入下"./configure","make","make install"就装上了。Automake就是有群人觉得写Makfile不方便,特别是工程文件多
 
目录复杂时。所以就搞了这么个自动生成Makefile的开源的东东。类似的工具还有cmake和qmake。
 
Automake功能还是很强大的,不想手写Makefile的可以试试。
 
我下面有详细说明.
 
一. 详解Automake的编译做法,编译出一个可运行程序。
二. 如何清理Automake生成的文件和目录。
三. Automake编译中的常见问题
 
测试文件:
 
main.c add.c sub.c calc.h
 
 
一. 详解Automake的编译做法,编译出一个可运行程序。
 
1. autoscan
 
//扫描源代码以搜寻普通的可移植性问题,
 
//比如检查编译器,库,头文件等,生成文件configure.scan,它是configure.ac的一个雏形。
 
2. cp configure.scan configure.in
 
3. vi configure.in
 
configure.in 文件的更改是件很麻烦的事。Automake自己定义了很多宏。而autosca生成的
 
这个文件中有几个宏是必须要改的,甚至要依编译情况,还要手工加些宏在上面。
 
常见的要改更的有下面几个.
 
#AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
 
AC_INIT(add.c,1.0)
AM_INIT_AUTOMAKE(xcldemo,1.0)
AC_CONFIG_SRCDIR([add.c])
AC_CONFIG_HEADERS([config.h])
  # Checks for programs.
  
 AC_PROG_CXX
  
 AC_PROG_CC
  
AC_PROG_AWK
 AC_PROG_INSTALL
 AC_PROG_LN_S
 AC_PROG_RANLIB
 AC_PROG_CPP
 AC_PROG_LIBTOOL
  
 
 
//AC_OUTPUT表示最后要生成Makefile
 
AC_OUTPUT(Makefile)
4. aclocal
 
//由configure.in生成aclocal.m4
 
附注: 如果执行时报错,可尝试将上面的 AC_PROG_RANLIB 注释掉
 
 
5. //编译共享库前,运行 libtoolize -f -c 但这里好像没用
 
如果少了 ltmain.sh
 
就执行 libtoolize --automake --copy --debug --force
 
或者 libtoolize -f -c
 
6. autoconf
 
//autoconf:将configure.ac中的宏展开,生成configure脚本。这个过程可能要用到aclocal.m4中定义的宏
 
//由configure.in和aclocal.m4生成configure脚本
 
7. 如果没有生成config.h.in,则autoheader
 
 
8. vi Makefile.am
 
这个文件是除了上面的configure.in以后,在Automake编译过程中要手工编写的另一个文件。
 
它的作用决定了编译出来是什么样的程序,如编译出动态库还是静态库还是其它什么。
 
这个文件相当蛋疼。 写法大至和手写Makefile差不多,生成定义要编译哪些文件,这些文件要引用哪些目录下的库或
 
库文件。 要用到哪些编译参数等等。光这个还好说,问题是Automake还自定义了很多的宏。你要按这些宏及规则来
 
写。而且你还要在这些宏前加上你要生成的库的名字。这样弄下来,个人觉得其实和单独写出个Makefile文件是一样的工作量。
 
AUTOMAKE_OPTIONS=foreign
 
 
bin_PROGRAMS=xcldemo
 
 
xcldemo_SOURCES=main.c add.c sub.c calc.h
 
 
9. automake -a
 
 
//automake --add-missing
 
 
//由Makefile.am和configure.in生成各级目录下的Makefile.in
 
 
附,如果出现"error: cannot find input file: Makefile.in"错误,则可以通过执行 automake --add-missing来解决.
 
 
 
10. 执行configure生成Makefile ,ls中应当可以看到Makefile已经产生了.
 
./configure //执行的时候会扫描各个目录下的Makefile.in生成不同的Makefile
 
11. make
 
12.测试编译结果
 
[root@ol64 test4_auto]# ./xcldemo
 
add() = 8
 
sub() = 2
 
13.打包一个tar.gz
 
 
[root@ol64 test4_auto]# make dist
 
 
[root@ol64 test4_auto]# ls *.tar.gz
 
 
xcldemo-1.0.tar.gz
 
 
二. 如何清理Automake生成的文件和目录。
 
a. 首先理解下Automake生成的目录结构
 
user input files optional input processes output files
 
 
================ ============== ========= ============
 
 
.——–,
 
 
| | – - -> COPYING
 
 
| | – - -> INSTALL
 
 
| |——> install-sh
 
 
| |——> missing
 
 
|automake|——> mkinstalldirs
 
 
configure.ac ———————–>| |
 
 
Makefile.am ———————–>| |——> Makefile.in
 
 
| |——> stamp-h.in
 
 
.—+ | – - -> config.guess
 
 
| | | – - -> config.sub
 
 
| `——+-’
 
 
| | – - – -> config.guess
 
 
|libtoolize| – - – -> config.sub
 
 
| |——–> ltmain.sh
 
 
| |——–> ltconfig
 
 
`———-’
 
//-------------------------------------------------------------------------
 
 
b. 理解了上面的目录结构后,就后清理了
 
##清掉Makfile生成的东东
 
make clean
 
##连Makefile也清掉
 
make distclean
 
##如需要,保留输入的configure.in及Makefile.am文件
 
mv configure.in configure.in_old
 
 
mv Makefile.am Makefile.am_old
 
 
##清掉aclocal
 
rm -rf aclocal.m4
 
rm -rf autom4te.cache
 
rm -rf autoscan.log
 
 
##清掉autoheader
 
rm -rf config.h.in
 
 
##libtoolize
 
rm -rf ltmain.sh
 
 
##automake -a
 
rm -rf install-sh
 
rm -rf missing
 
rm -rf depcomp
 
 
##清掉.configure
 
rm -rf config.guess
 
rm -rf Makefile.in
 
rm -rf stamp-h1
 
rm -rf .deps
 
rm -rf configure
 
rm -rf config.sub
 
rm -rf config.status
 
rm -rf configure.scan
 
 
--rm -rf configure.in
 
 
 
三. Automake编译中的常见问题
 
1.如果编译出错,可以设为成中文显示错误
 
解决:
 
locale -a #查看系统支持的语言
export LANG=zh_CN.GB18030 #将系统语言改为中文
 
 
2.编译过程中提示:
 
/bin/rm: cannot remove `libtoolt': No such file or directory
 
解决:
 
1、确认libtool是否已经安装,如果没有安装的话,则先安装libtool
# yum -y install libtool
2、分别执行以下三条命令:
# autoreconf --force --install
# libtoolize --automake --force
# automake --force --add-missing
再重新编译安装,问题解决!
 
3. aclocal时报下面的错误
root@localhost OA]# aclocal
 
configure.in:6: error: m4_defn: undefined macro: _m4_divert_diversion
 
autoconf/general.m4:464: AC_CONFIG_SRCDIR is expanded from...
 
configure.in:6: the top level
 
autom4te: /usr/bin/m4 failed with exit status: 1
 
aclocal: autom4te failed with exit status: 1
 
解决:
 
 
4. required file `config.h.in' not found
 
解决:
 
在执行automake --add-missing之前执行autoheader,生成config.h.in
 










