相关文章推荐
可爱的木耳  ·  groovy 字符串转json-掘金·  2 年前    · 
爱搭讪的皮带  ·  Unable to install ...·  2 年前    · 
任性的滑板  ·  Processing Data with ...·  2 年前    · 

1
主目录下有俩个目录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
24、执行./configure生成Makefile
5、make
6 、OK

代码详情主目录下有俩个目录test_example和test_src。test_src 下有3个目录,分别对应三个功能模块。模块3依赖于模块1和模块2。现在需把三个模块分别编译成三个静态库。test_example是一些例子,sample.c 依赖于模块3实现的应用实例。生成Makefile1、先创建各个目录下的Makefile.am主目录 Makefile.am:# 在这里列举子目录时,如果目录之间存在依赖关系时,那么一定要在这里使用先后关系体现出来(被依赖的写在前面)# 读者可以尝试打乱 关于Autotools 我们前面的章节中已经讲到了Makefile使用(点击进入查看文章)。我们知道在Linux下面如果编译一个比较大型的项目,我们可以通过Makefile的方式来完成。 但是,我们又蛋疼了,Makefile拥有复杂的语法结构,甚至让人难以领会,当我们项目非常大的时候,维护Makefile会成为一件非常头疼的事情。于是我们就有了autotools工具,专门用来生成Makef... Makefile.am是AutoTool编译时读取相关编译参数的配置文件,文件区分大小写,从顶层目录到子工程生成进制文件的路径上的目录都要存在,如果中间目录不存在该文件,其下的子目录不会被编译。 中间目录Makefile.am至少包含 SUBDIRS   最终生成可执行文件文件的
《嵌入式Linux C语言应用程序设计》 作者:华清远见嵌入式培训中心 <br>第章、嵌入式Linux ... 嵌入式Linux下的工程管理器make ■ 如何使用autotools生成Makefile ■ 嵌入式Linux下的综合编辑器Emacs
0. 基础     先阅读GNU Autotools (autoconf, automake, libtool, etc.) 自动化编译 (1) 简单示例并成功执行、理解所说内容。 1. 先提供一个脚本。拷贝所有内容保存为文件atdir.sh并添加可执行权限,然后执行。注意,最好不要以根用户身份执行它。 #!/bin/sh echo "Autotools for autotools