模拟需求,如图
aktest项目的源码放在src/lib1和src/test下,相当于两个子项目,lib1生成libfunc.a一个库文件,test是主项目,生成aktest(可执行文件)。
平台:freeBSD 8
准备工作:下载安装m4、autoconf、automake
第一步,切换到项目根目录(即aktest),运行autoscan命令,生成了autoscan.log和configure.scan两个文件。把configure.scan重命名为configure.in然后Vi打开
1 # -*- Autoconf -*- 2 # Process this file with autoconf to produce a configure script. 3 4 AC_PREREQ([2.69]) 5 AC_INIT([aktest], [0.1], [xxxx@gmail.com]) 6 AC_CONFIG_SRCDIR([src/lib1/libfunc.h]) 7 AC_CONFIG_HEADERS([config.h]) 8 AM_INIT_AUTOMAKE(aktest, 0.1) 9 10 # Checks for programs. 11 AC_PROG_CXX 12 AC_PROG_CC 13 AC_PROG_RANLIB 14 15 # Checks for libraries. 16 17 # Checks for header files. 18 19 # Checks for typedefs, structures, and compiler characteristics. 20 21 # Checks for library functions. 22 23 AC_OUTPUT([Makefile 24 src/lib1/Makefile 25 src/test/Makefile])
configure.in调用一系列autoconf宏来测试程序需要的或用到的特性是否存在,以及这些特性的功能。上面是经过修改的configure.in,AC_INIT的三个参数意义分别是包名称,版本号,报告bug的邮箱地址。AM_INIT_AUTOMAKE必须加,不然执行automake的时候会报错,参数同样是包名称和版本号。AC_PROG_RANLIB要加是因为这个项目的其中之一子项目生成库文件,如果不加执行automake同样会报错,它会提示你加这个宏。AC_OUTPUT它指定了要生成这些Makefile文件。
第二步,在aktest,lib1,test这三个目录里添加Makefile.am,要自己手动写
aktest/Makefile:
1 AUTOMAKE_OPTIONS=foreign 2 SUBDIRS=src/lib1 src/test
AUTOMAKE_OPTIONS=foreign可以不加,但是加上可以少很多麻烦。SUBDIRS指定子目录,就好像把当前这个makefile的任务分解成了子任务,子任务由各自的makefile去完成
lib1/Makefile:
1 noinst_LIBRARIES=libfunc.a 2 libfunc_a_SOURCES=libfunc.cpp
第一行表示这个makefile的目标是生成一个名称为libfunc.a的库文件,如果有多个目标,就用空格隔开,如果用lib_LIBRARIES则这个库是可以安装到系统中的,如果不需要安装就用noinst_LIBRARIES。第二行libfunc.a这个目标由哪些cpp编译生成,所有的文件都要列出来,手动,目前还不知道有没有自动的方法。每个目标都要列出其对应的源文件。名称,比如libfunc.a对应的就是libfunc_a_SOURCES(注意点变成了下划线),abc对应就是abc_SOURCES。
test/Makefile:
1 noinst_PROGRAMS=test 2 test_LDADD=$(top_srcdir)/src/lib1/libfunc.a 3 test_SOURCES=class1.cpp \ 4 foolinux.cpp \ 5 main.cpp 6 DEFS+=-D_LINUX 7 INCLUDES=-I$(top_srcdir)/src/lib1
解读:目标是test,这是个可执行文件,因为用的是noinst_PROGRAMS,并且这个可执行文件是不可安装到系统的,因为noinst前缀,如果要安装把系统的就用bin_PROGRAMS。test_LDADD指定test这个目标需要的库,$(top_srcdir)是一个宏,他表示项目的根目录,也就是aktest。DEFS是编译的时候用到的宏,相当于VC中的“预处理器定义”,INCLUDES相当于VC的附加包含目录。
第三步:aktest目录下运行aclocal命令,然后项目根目录下多了aclocal.m4和autom4te.cache
第四步:执行autoconf(还是在aktest目录)生成了configure脚本
第五步:执行autoheader生成config.h.in
第六步:执行automake --add-missing
后面的步骤就和在类unix上安装软件的步骤一样了,除了不用make install
第七步:./configure生成了我们想要的Makefile(此例中三个Makefile)
第八步:make 大功告成~~~,在src/test里面生成了最终的可执行文件test
参考资料:
1.http://www.ibm.com/developerworks/cn/linux/l-makefile/
2.http://hi.baidu.com/alanx/blog/item/fc4849a40536eff39052ee79.html