先来举一个简单的例子吧。如何写用code1.c, code2.c生成 prog1的configure.in和Makefile.am。
首先建立一个项目文件夹tt。在tt下建立dir1目录。
建立好这几个文件之后,下面就可以正式建立configure.in和Makefile.am了。
首先在tt目录下建立configure.in文件(可用autoscan):
#指定项目的一个源文件
AC_INIT(dir1/code2.c)
#指定项目名称和版本号
AM_INIT_AUTOMAKE(prog1, 0.0.1)
#检查编译器
AC_PROG_CC
#输出Makefile文件
AC_OUTPUT(Makefile
dir1/Makefile
)
同时建立tt目录下的Makefile.am文件,这个文件很简单,就一句话:
SUBDIRS=dir1
然后建立dir1目录下的Makefile.am文件,这才是真正起作用的Makefile.am文件:
bin_PROGRAMS=prog1
prog1_SOURCES=code1.c code2.c
完成之后,为了方便操作,再写一个autogen.sh文件,保存在tt目录下。
#!/bin/sh
aclocal
autoconf
automake --add-missing
存盘之后,用chmod +x改成可执行文件。然后执行autogen.sh。
./autogen.sh
即可在tt目录下生成configure和makefile文件,同时在dir1目录下也会生成一个makefile文件。现在在tt目录下执行 make,进入dir1目录,就可以看到生成的prog1程序。如果再执行make install,prog1将被安装到缺省的/usr/local/bin目录下去。
=====================================================================
在此基础上,如果要同时实现code1.c, code2.c生成 prog1, 而 code3.c生成prog2。由于code1.c,code2.c,code3.c都在同一个目录,只要改写dir1目录下的Makefile.am就可以了。
bin_PROGRAMS=prog1 prog2
prog1_SOURCES=code1.c code2.c
prog2_SOURCES=code3.c
====================================================================
两个处在不同子目录下的文件共同生成一可执行文件.一般互相引用的源程序都是放在同一个目录下的,如果要放在不同的目录,可以把要引用的源文件编译成静态库文件。
修改tt目录下的configure.in文件。
#指定项目的一个源文件
AC_INIT(dir2/code4.c)
#指定项目名称和版本号
AM_INIT_AUTOMAKE(myproject, 0.0.1)
#检查编译器
AC_PROG_CC
#检查ranlib
AC_PROG_RANLIB
#输出Makefile文件
AC_OUTPUT(Makefile
dir1/Makefile
dir2/Makefile
)
同时修改tt目录下的Makefile.am文件。
SUBDIRS = dir1 dir2
在dir1目录下修改Makefile.am文件。这时是将code1.c编译成一个不安装(noinst)的静态库文件。
noinst_LIBRARIES=libcode1.a
libcode1_a_SOURCES=code1.c
在dir2目录下添加一个Makefile.am文件。
INCLUDES= -I../dir1
bin_PROGRAMS=prog4
prog4_SOURCES=code4.c
prog4_LDADD=../dir1/libcode1.a