autoconf&automake 使用总结

本文介绍如何使用autoconf和automake等工具,实现软件源码(.tar.gz)发布及用户自定义参数编译。从autoscan生成configure.ac开始,经过宏定义、Makefile.am编写、aclocal、autoheader、automake、autoconf等步骤,最终生成Makefile并完成编译安装。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文教你如何使用autoconf、automake等来制作一个以源代码形式(.tar.gz)发布的软件、并可在执行configure时使用自定义参数。

流程如下,每步的作用也做了简要说明:

1. 源码根目录调用autoscan脚本,生成configure.scan文件,然后将此文件重命名为configure.ac,或者configure.in。其中,configure.ac是新的写法,configure.in是比较旧的写法。并修改configure.ac文件。

2. 修改【configure.ac,利用autoconf提供的各种M4宏,配置项目需要的各种自动化探测项目,下面附上一个自己修改用的.ac文件:

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
AC_INIT([lgj],[0.1],[XXX@gmail.com])----此处修改为自己想要生成的文档和错误log发送邮件地址。请自己修改
AC_LANG([C])----增加
AM_INIT_AUTOMAKE([-Wall -Werror foreign])-----增加,后面有解释
AC_CONFIG_SRCDIR([src/main.cpp])----代码目录和主程序
AC_CONFIG_HEADERS([config.h])
# Libtool initialisation
AC_CONFIG_MACRO_DIR([m4])----增加,当输入aclocal命令时,输出.m4文件
LT_INIT
# Checks for programs.
AC_PROG_CXX
AC_PROG_CC
#AC_PROG_CXX
#AC_PROG_AWK
AC_CHECK_PROG([DOXYGEN], [doxygen], [true], [false])----增加
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
AC_HEADER_STDBOOL
AC_C_CONST
AC_C_INLINE
# Checks for library functions.
# Generate Makefiles----下面是设置在哪些目录自动生成Makefile文件,可在下面增加
AC_CONFIG_FILES([Makefile----在自己工程的根目录下面生成
                 src/Makefile----在代码文件夹src/目录下面生成
])
AC_OUTPUT
echo "Configured!"

3. 编写【自定义宏】,建议每个宏一个单独的*.m4文件;

4. 调用aclocal收集configure.ac中用到的各种非Autoconf的宏,包括自定义宏;

5. 调用autoheader,扫描configure.ac(configure.in)acconfig.h(如果存在),生成config.h.in宏定义文件,里面主要是根据configure.ac中某些特定宏(AC_DEFINE)生成的#define#undefine宏,configure在将根据实际的探测结果决定这些宏是否定义(具体见后面例子)。

6. 按照automake规定的规则和项目的目录结构,编写一个或多个【Makefile.am(Makefile.am数目和存放位置和源码目录结构相关)Makefile.am主要写的就是编译的目标及其源码组成。下面附上自己用的工程根目录的Makefile.am和子目录Makefile.am文件:

工程根目录Makefile.am文件内容:

EXTRA_DIST = COPYING NEWS INSTALL README
SUBDIRS = src
ACLOCAL_AMFLAGS = -I m4
AM_CXXFLAGS =
CLEANFILES = *~

子目录Makefile.am文件内容:

AM_CPPFLAGS = \
-Wall \          
----打印警告
-O0 \            ----不优化
-fprofile-arcs -ftest-coverage 

AM_LDFLAGS = -lgcov
----编译库进去
AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS = lgj----编译完成后生成的文件,直接在。 ./src目录下运行 ./lgj即可运行编译后的程序,前提编译通过,否则不产                    ----生lgj文件,此处要与“configure.ac”文件中的定义一样。

lgj_SOURCES = main.cpp name.cpp name.h\    ------此部分为当有多个子程序时,一一列举在此,编译时会自动调用要使用的子程序
              ttimes.cpp ttimes.h\         ------注意使用tab键,否则会报错。

              yardstolb.cpp yardstolb.h    ------最后一个子程序不用加“\”,可以一直加子程序。由于本人已经写了一些代码在                                            ------里面,所有这里是我自己的一部分代码。新手可以自己写一个测试程序hello.cpp


lgj_LDADD = 
EXTRA_DIST =  
CLEANFILES = *~ \#* Makefile Makefile.in *.gc*  ----运行makeclean命令时,会自动删除与此处定义匹配的文件

7. 调用automake,将每个Makefile.am转化成Makefile.in,同时生成满足GNU编码规范的一系列文件(带-a选项自动添加缺少的文件,但有几个仍需要自己添加,在执行automake前需执行touch NEWS README AUTHORS ChangeLog)。如果configure.ac配置了使用libtool(定义了AC_PROG_LIBTOOL宏(老版本)或LT_INIT宏),需要在此步骤前先在项目根目录执行libtoolize --automake --copy --force,以生成ltmain.sh,供automakeconfig.status调用。

8. 调用autoconf,利用M4解析configure.ac,生成shell脚本configure。以上几步完成后,开发者的工作就算完成了,后面的定制就由开源软件的用户根据需要给configure输入不同的参数来完成。

9. 用户调用configure,生成Makefile,然后make && make install

  说穿了就是在工程目录下运行一系列命令,创建和修改几个文件,就可以生成符合该平台的Makefile文件。

   具体使用的时候,首先我们进入 project 目录:

   在project下面新建src目录:mkdir src

   切换到src目录下面 :cd src

    自己写一些代码:main.cpp,写好后保存。

    切换到project目录:cd ..

1) 运行autoscan命令

2) 将configure.scan 文件重命名为configure.ac或者configure.in,并修改configure.ac文件(参考上面写的修改说明)

3) 在project目录下新建Makefile.am文件,并在各个子目录下也新建makefile.am文件(参考上面写的修改说明)

4) 运行aclocal命令

5) 执行autoheader

6) automake --add-missing 

7) libtoolize --automake --copy --debug --force

8) 运行automake命令

9) 运行autoconf命令

10) 运行./confiugre脚本

   可以通过图看出产生Makefile的流程,如图所示:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值