使用autotools生成Makefile (二) 多目录编译

该博客介绍了如何使用autotools将具有依赖关系的多个模块编译成静态库,并创建一个依赖这些库的应用实例。通过创建各目录下的Makefile.am,配置configure.ac文件,然后执行相关自动化工具,最终成功构建并编译项目。
摘要由CSDN通过智能技术生成

代码详情

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值