automake做工程管理总结

这篇博客总结了如何使用automake管理多目录工程,通过一个包含src和sample目录的例子,详细介绍了从autoscan到automake --add-missing的整个流程,最终实现动态库libdlist.so的生成及依赖它的可执行文件test。
摘要由CSDN通过智能技术生成

如需转载,请注明出处!

最近看了下,网上关于automake使用鱼龙混杂,很多只是给出简单的单一文件编译(以一个main.c为例)。在实际的工程应用中,我们常将代码按照模块进行组织,所以本文将结合多目录automake组织,以一个小例子来进行总结。

文件组织目录:

examples

               | -- src

                          | -- dlist_append.c

                          | -- dlist_append.h

               | -- sample

                           | -- main.c

编译目标:

src目录下的代码编译生成动态库libdlist.so;sample目录下main.c依赖libdlist.so 生成可执行文件test。


流程开始:

1. 在根目录example下执行命令:autoscan. 在当前目录下会生成文件 autoscan.log  和 configure.scan.

2. 将configure.scan重命名为 configure.in.

3. 编辑configure.in文件如下:

#                                               -*- Autoconf -*-                                                                                                                                         
# Process this file with autoconf to produce a configure script.
 
AC_PREREQ([2.69])                     # autoconf版本号
AC_INIT(dlist, 1.0, deric)            # 修改项:初始化信息,包含包名、版本号、作者联系信息
AC_CONFIG_SRCDIR([sample/main.c])     # 修改项:侦测指定源文件是否存在,该项目任意文件即可
AC_CONFIG_HEADERS([config.h])         # 生成config.h文件,供autoheader使用
AM_INIT_AUTOMAKE(dlist, 1.0)          # 添加项:初始化automake,包含包名、版本号
# Checks for programs.
AC_PROG_CC                            # 编译器
AC_PROG_CXX                           # 添加项:C++编译器
# Checks for libraries.
AC_PROG_RANLIB                        # 添加项:编译静态库使用
AC_PROG_LIBTOOL                       # 添加项:编译动态库使用
# Checks for header files.
AC_CHECK_HEADERS([stdlib.h])          # 检查系统头文件
 
# Checks for typedefs, structures, and compiler characteristics.
 
# Checks for library functions.
 
AC_CONFIG_FILES([Makefile src/Makefile sample/Makefile])  # 修改项:配置每一级模块目录下生成Makefile,很重要
AC_OUTPUT


4. 在根目录example下执行命令:aclocal. 在当前目录下会生成文件 aclocal.m4  和 autom4te.cache. 主要处理本地的宏定义。

5. 在根目录example下执行命令:autoconf. 在当前目录下会生成文件 configure.

6. 在根目录example下执行命令:autoheader. 在当前目录下会生成文件 config.h.in. 该工具负责从acconfig.h中复制用户附加的符号定义.

7. 在每个需要生成Makefile的目录中创建并编辑Makefile.am文件(examples  examples/src  examples/sample)

/* examples/Makefile */
AUTOMAKE_OPTIONS=foreign                # AUTOMAKE_OPTIONS 是Automake 的选项。Automake 主要是帮助开发 GNU 软
                                        # 件的人员来维护软件,所以在执行Automake 时,会检查目录下是否存在标准 GNU 软件中
                                        # 应具备的文件,例如 'NEWS'、'AUTHOR'、 'ChangeLog' 等文件。设置为foreign 时,Automake
                                        # 会改用一般软件的标准来检查。如果不加这句的话,需要在autoconf之前,先执行touch NEWS
                                        # README AUTHORS ChangeLog 来生成'NEWS'、'AUTHOR'、 'ChangeLog' 等文件                                                                                                                                                                 
SUBDIRS= src sample              # 执行子目录Makefile,注意顺序


/* examples/src/Makefile.am */
#staic libraries#                               # 生成静态库的版本
#AUTOMAKE_OPTIONS=foreign 
#lib_LIBRARIES=libdlist.a
#libdlist_a_SOURCES=dlist_append.c dlist_append.h
#include_HEADERS=dlist_append.h
 
#dynamic libraries#                             # 生成动态库的版本
AUTOMAKE_OPTIONS=foreign
lib_LTLIBRARIES=libdlist.la                     # 动态库名字以la结尾,最终生成的动态库会以so结尾
libdlist_la_SOURCES=dlist_append.c dlist_append.h        # 列出参与编译动态库的全部源文件
include_HEADERS=dlist_append.h                  # 生成的include目录,供其他程序调用时需要依赖的头文件

/* examples/sample/Makefile */
#static dependency#                # 依赖静态库的版本                                                                                                                                                                      
#AUTOMAKE_OPTIONS=foreign
#bin_PROGRAMS=test
#test_SOURCES=main.c
#test_CPPFLAGS=-I/home/deric/development/examples/src
#test_LDADD=/home/deric/development/examples/src/libdlist.a

#dynamic dependency#
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=test
test_SOURCES=main.c
test_CPPFLAGS=-I/home/deric/development/examples/src
test_LDADD=-L/home/deric/development/examples/src -ldlist

8. 若src生成动态库,则在根目录example下执行命令:libtoolize --automake;若生成静态库则忽略此命令。libtoolize 提供了一种标准的方式来将libtool 支持加入一个软件包

9. 在根目录example下执行命令:automake --add-missing. 选项“—adding-missing”可以让automake自动添加有一些必需的脚本文件。

10. 在根目录example下执行命令: ./configure --prefix=$(pwd)/build,  make,  make install    则在build目录下生成lib  include  bin目录,并生成相应库文件、外部需依赖的头文 件、可执行文件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值