洞房大花猫

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

模拟需求,如图

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

posted on 2012-08-03 16:00  spencer24  阅读(468)  评论(0编辑  收藏  举报