代码详情
主目录下有俩个目录test_example和test_src。test_src 下有3个目录,分别对应三个功能模块。模块3依赖于模块1和模块2。现在需把三个模块分别编译成三个静态库。test_example是一些例子,sample.c 依赖于模块3实现的应用实例。
下载代码:autotools 测试代码
生成Makefile
1、先创建各个目录下的Makefile.am
主目录 Makefile.am:
# 在这里列举子目录时,如果目录之间存在依赖关系时,那么一定要在这里使用先后关系体现出来(被依赖的写在前面)
# 读者可以尝试打乱这里写好的顺序,自己跑一遍编译流程,查看编译报错
SUBDIRS = test_src test_example
test_src 目录 Makefile.am:
# moudle3依赖于moudel1和moudle2,写在最后
SUBDIRS = moudle1 moudle2 moudle3
test_src/moudle1 目录 Makefile.am:
NULL =
# 用于其他目录下源码的编译链接,noinst加上之后是只编译,不安装到系统中
noinst_LIBRARIES = libmoudle1.a
# $(includdir)的值由autoconf为我们自动生成,默认是'/urs/include' 或 '/usr/local/include'
# _CPPFLAGS指定预处理阶段头文件的查找目录(gcc -I)
libmoudle1_a_CPPFLAGS = \
-I$(includedir) \
$(NULL)
# automake可以从autoconf继承变量
# 即Makefile文件用到下列变量时可以在configure脚本文件中寻找这些变量的定义
# 当然,这些变量最初是由开发者在configure.ac文件中增加的
# _LIBADD指定链接阶段so库的查找路径(gcc -l)
libmoudle1_a_LIBADD = \
$(NULL)
libmoudle1_a_SOURCES = m1_f1.c m1_f1.h m1_f2.c m1_f2.h
test_src/moudle2 目录 Makefile.am:
NULL =
# 用于其他目录下源码的编译链接,noinst加上之后是只编译,不安装到系统中
noinst_LIBRARIES = libmoudle2.a
# $(includdir)的值由autoconf为我们自动生成,默认是'/urs/include' 或 '/usr/local/include'
# _CPPFLAGS指定预处理阶段头文件的查找目录(gcc -I)
libmoudle2_a_CPPFLAGS = \
-I$(includedir) \
$(NULL)
# automake可以从autoconf继承变量
# 即Makefile文件用到下列变量时可以在configure脚本文件中寻找这些变量的定义
# 当然,这些变量最初是由开发者在configure.ac文件中增加的
# _LIBADD指定链接阶段so库的查找路径(gcc -l)
libmoudle2_a_LIBADD = \
$(NULL)
libmoudle2_a_SOURCES = m1_f1.c m1_f1.h m1_f2.c m1_f2.h
test_src/moudle3 目录 Makefile.am:
NULL =
# 用于其他目录下源码的编译链接,noinst加上之后是只编译,不安装到系统中
noinst_LIBRARIES = libmoudle3.a
# $(includdir)的值由autoconf为我们自动生成,默认是'/urs/include' 或 '/usr/local/include'
# _CPPFLAGS指定预处理阶段头文件的查找目录(gcc -I)
libmoudle3_a_CPPFLAGS = \
-I$(includedir) \
$(NULL)
# automake可以从autoconf继承变量
# 即Makefile文件用到下列变量时可以在configure脚本文件中寻找这些变量的定义
# 当然,这些变量最初是由开发者在configure.ac文件中增加的
# _LIBADD指定链接阶段so库的查找路径(gcc -l)
libmoudle3_a_LIBADD = \
../moudle1/libmoudle1.a \
../moudle2/libmoudle2.a \
$(NULL)
libmoudle3_a_SOURCES = m3_f1.c m3_f1.h m3_f2.c m3_f2.h
test_example 目录下Makefile.am
AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS = sample
# 这里要注意顺序, sample.c 依赖于moudle3, 而moudle3依赖于moudle1和moudle2
sample_LDADD = ../test_src/moudle3/libmoudle3.a ../test_src/moudle1/libmoudle1.a ../test_src/moudle2/libmoudle2.a
sample_SOURCES = sample.c
2、创建configure.ac文件(看上篇博客)
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
AC_INIT([sample-test], [1.0], [qigaohua@xxx.com])
# add
AM_INIT_AUTOMAKE(sample-test, 1.0)
AC_CONFIG_SRCDIR([test_example/sample.c])
AC_CONFIG_HEADERS([config.h])
# Checks for programs.
AC_PROG_CC
# add 表示构建当前目录时需要生成静态库文件
AC_PROG_RANLIB
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_CONFIG_FILES([Makefile
test_example/Makefile
test_src/Makefile
test_src/moudle1/Makefile
test_src/moudle2/Makefile
test_src/moudle3/Makefile])
AC_OUTPUT
3、执行aclocal、autoconf、autoheader、touch NEWS README AUTHORS ChangeLog、automake --add-missing
4、执行./configure生成Makefile
5、make
6 、OK