一江春水向东流

做一个有思想的人,期待与每一位热爱思考的人交流,您的关注是对我最大的支持。

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  44 随笔 :: 139 文章 :: 81 评论 :: 0 Trackbacks
在入门篇我们简单介绍了使用automake自动产生makefile的几个关键步骤,所有文件都在同一个目录下。但在比较大的项目中,很少将所有文件放在一个目录下的。本文针对这种情况做个简单介绍。
   
    多级目录结构的软件,一般是单个程序、库文件或模块放在各自的目录中。automake要求每个目录都有自己的Makefile.am文件来编译各自目录 下的代码。在顶级的目录中,有一个Makefile.am文件,该文件通过SUBDIRS指明了这个目录下有多少个直接下级目录的代码需要编译。下级目录 的Makefile.am也指明自己需要编译的下级目录。通过这样的层层递归i,从而完成多级目录结构的编译。
   
    下面看一个具体的示例:
   
    本例假设目录结构如下:
    helloworld   
    |src
    ||--test.cpp
    ||dohello  
    |||--dohello.h
    |||--dohello.cpp
    |doc
    ||--userguide
    顶级目录helloworld,该目录下有src和doc两个目录。src目录下有一个test.cpp文件,一个dohello目录,dohello目录下又有dohello.h和dohello.cpp两个文件。doc下有一个readme文件。
    整个程序中test.cpp是主文件,里面有main函数。test.cpp调用了dohello.h和dohello.cpp中的类。
   
    下面是编译步骤:
   
    1.运行autoscan产生configure.scan
   
    在顶级目录helloworld下运行autoscan命令。产生configure.scan文件内容如下:
#                -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ(2.61)
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_CONFIG_SRCDIR([src/test.cpp])
AC_CONFIG_HEADER([config.h])

# Checks for programs.
AC_PROG_CXX
AC_PROG_CC

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_CONFIG_FILES([Makefile
                 src/Makefile
                 src/dohello/Makefile])                      
AC_OUTPUT
   
   
    2.编辑configure.in
   
    将configure.scan改名成configure.in,然后修改如下:
# Process this file with autoconf to produce a configure script.

AC_PREREQ(2.61)
AC_INIT(hello,1.0)   #软件包名称和版本号,另一种写法是写在AM_INIT_AUTOMAKE中.
AC_CONFIG_SRCDIR([src/test.cpp])
#AC_CONFIG_HEADER([config.h])
AM_INIT_AUTOMAKE

# Checks for programs.
AC_PROG_CXX
AC_PROG_CC
AC_PROG_RANLIB       #使用了静态库编译,需要此宏定义

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

#AC_CONFIG_FILES([src/Makefile src/dohello/Makefile])
AC_OUTPUT(Makefile src/Makefile src/dohello/Makefile) #需要生成的Makefile,本例需要生成三个。
   
    3.运行aclocal和autoconf
   
    configure.in修改完后则先后执行aclocal和autoconf命令。
   
    4.建立各个目录的Makefile.am文件
   
    在顶级目录、src目录和dohello目录下分别建立三个Makefile.am文件。内容分别如下:
   
    顶级目录Makefile.am:
#----------------开始------------------------------------------    
AUTOMAKE_OPTIONS=foreign
SUBDIRS=src   #本目录的直接下级目录src需要编译
EXTRA_DIST=doc/userguide #doc/userguide不需要编译,但要发布该文件。如果有多个文件,则用空格分开。
#----------------结束------------------------------------------

   
    src目录下的Makefile.am:
#----------------开始------------------------------------------
AUTOMAKE_OPTIONS=foreign
SUBDIRS=dohello #本目录的直接下级目录dohello需要编译
bin_PROGRAMS=hello #本目录的文件编译成可执行文件hello。如有多个,用空格分开。然后在下面分别写它们的SOURCE和LDADD。
hello_SOURCES=test.cpp #编译hello需要的源文件列表,如有多个,用空格分开。
hello_LDADD=dohello/libhello.a #编译hello需要的库文件列表。如有多个,用空格分开。
#----------------结束------------------------------------------

   
    dohello目录下的Makefile.am
#----------------开始------------------------------------------   
AUTOMAKE_OPTIONS=foreign
noinst_LIBRARIES=libhello.a   #本目录下的代码编译成libhello.a库。不需要发布。如果需要发布,则写成bin_LIBRARIES。注意,库的名称格式必需为 libxxx.a。因为编译静态库,configure.in需要定义AC_PROG_RANLIB宏。
libhello_a_SOURCES=dohello.h dohello.cpp #编译libhello.a需要的源文件。注意将库名称中的'.'号改成'_'号。
#----------------结束------------------------------------------

   
    5.运行automake
   
    以上几个Makefile.am都书写完毕后,运行automake --add-missing。
   
    6.运行./configure和make
   
    上面步骤完成后,先后运行./configure和make完成编译。如果编译成功,运行make dist可以将所有文件打包成hello-1.0.tar.gz。


posted on 2008-03-22 17:20 allic 阅读(2234) 评论(0)  编辑  收藏 所属分类: linux/UNIX 应用开发

只有注册用户登录后才能发表评论。


网站导航: