目录结构图示

deep - 图1

目录特点:

  • 头文件在一个目录;
  • 源文件在一个目录
  • 顶层目录一个入口主文件;

手动修改的几个文件

假设当前工作目录在,所以下面的介绍都加上了该工作目录方便说明:

002_deep/

002_deep/configure.ac

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.69])
AC_INIT([main], [1.2], [www.softool.cn])
#只填写入口主文件名即可:
AC_CONFIG_SRCDIR([main.c])
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE
# Checks for programs.
AC_PROG_CC

# Checks for libraries.
AC_PROG_RANLIB
# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.
#各个目录下面都需要一个 Makefile
AC_OUTPUT(Makefile
            inc/Makefile
            hello/Makefile
)

002_deep/Makefile.am

AUTOMAKE_OPTIONS = foreign
## 我们要使用递归目录变量 SUBDIRS
## 注意:头文件目录也要添加进来
SUBDIRS = hello inc
## 指定要生成的可执行文件的名:
bin_PROGRAMS = main
## 指定上面要生成可执行文件名依赖的主入口源文件:
main_SOURCES = main.c
## 需要链接各子目录生成的库:
main_LDADD = hello/libhello.a

## 指定 main.c 链接时需要寻找的头文件路径 inc/
## !个人感觉,我这里好像没有起作用,带考究!
INCLUDES = -I./inc

002_deep/inc/Makefile.am

AUTOMAKE_OPTIONS = foreign
## 由于此处的头文件,不需要安装到指定的目录中,所以我这里使用的前缀为 noinst
noinst_HEADERS = hello.h

002_deep/hello/Makefile.am

AUTOMAKE_OPTIONS = foreign
## 指定要生成的静态库
## 由于不需要安装到指定的目录中,所以这里使用的前缀为 noinst
noinst_LIBRARIES = libhello.a
## 指定上面的静态库依赖的源文件:
libhello_a_SOURCES = hello.c
## 指定编译选项搜索的头文件路径, 相当于 gcc -I../inc
libhello_a_CFLAGS = -I../inc

整个命令的执行过程

autoscan
mv configure.scan configure.ac

#手动编辑 configure.ac

aclocal
autoconf
autoheader

#手动编辑各目录的 Makefile.am

automake -a
./configure
make

效果

下图为执行过程演示图:

deep - 图2


deep - 图3


下图为目录结构图:

deep - 图4