(6)autotools工具的使用

   autotools是专门用来生成Makefile的一系列工具,包括autoscan、aclocal、autoheader、autoconf、automake等。

    (1)autotools解决了什么问题

在大型项目中,使用手写Makefile时,可能会很复杂并难以维护;
在不同的编译环境,由于参数不同,需要手写不同的Makefile,增加了工作量;由于Makefile有一些复杂的参数,手写Makefil可能会不符合规范;

autotools工具能够帮助开发人员简单而快捷地生成Makefile,完成各种复杂工程地编译和链接。

    (2)autotools生成Makefile的流程

1. 源码根目录调用autoscan脚本,生成configure.scan文件,然后将此文件重命名为configure.ac(或configure.in,早期使用.in后缀);
2. 修改【configure.ac】,利用autoconf提供的各种M4宏,配置项目需要的各种自动化探测项目;
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主要写的就是编译的目标及其源码组成。
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,供automake和config.status调用。
8. 调用autoconf,利用M4解析configure.ac,生成shell脚本configure。以上几步完成后,开发者的工作就算完成了,后面的定制就由开源软件的用户根据需要给configure输入不同的参数来完成。
9. 用户调用configure,生成Makefile,然后make && make install。

    autotools系列工具简单操作示例如下:

现有test文件夹存在如下文件:

//test
calc_test.h
calc_test.cpp
make_test.h
make_test.cpp
main.cpp

步骤一:在test目录同级目录下执行autoscan test 或者 在test目录下执行autoscan

步骤二:更改生成的configure.scan 为configure.ac,编辑并修改为以下内容(标粗的是新添加或者修改的内容)

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.69])
AC_INIT([autotest], [1.0], [BUG-REPORT-ADDRESS])
AM_INIT_AUTOMAKE([foreign -Wall -Werror])
AC_CONFIG_SRCDIR([calc_test.cpp])
AC_CONFIG_HEADERS([config.h])

# Checks for programs.
AC_PROG_CXX
AC_PROG_CC

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.
AC_CONFIG_FILES([Makefile])
AC_OUTPUT

步骤三:依此执行aclocal命令、autoheader、autoconf命令,生成configure文件

步骤四:新建Makefile.am命令

bin_PROGRAMS = autotest
autotest_SOURCES =  calc_test.h                       calc_test.cpp                     make_test.cpp                     main.cpp
autotest_LDADD =
autotest_LDFLAGS =
autotest_CFLAGS = -g

步骤五:执行automake --add-missing

步骤六:执行./configure命令生成Makefile

    (3)autotool参数详解

    1)configure.scan的参数

标签名  说明
AC_PREREQ 声明autoconf要求的版本号
AC_INIT 定义软件名称、版本号、联系方式
AM_INIT_AUTOMAKE 必须要的,指定编译参数
AC_CONFIG_SRCDIR 用来侦测所指定的源码文件是否存在, 来确定源码目录的有效性
AC_CONFIG_HEADER 指定产生的配置文件名称(一般是config.h),用于生成config.h文件,以便 autoheader 命令使用
AC_PROG_CC 用以探测当前系统的C编译器
AC_PROG_RANLIB 用于生成静态库
AC_PROG_LIBTOOL 用于生成动态库
AM_PROG_AR 生成静态库时使用,用于指定打包工具,一般指ar
AC_CONFIG_FILES 告知autoconf本工程生成哪些相应的Makefile文件,不同文件夹下的Makefile通过空格分隔
AC_OUTPUT 最后一个必须的宏,用以输出需要产生的文件
AC_PROG_CXX 用于探测系统的c++编译器
AC_CHECK_LIB 探测工程中出现的库文件及库文件中的方法

2)Makefile.am的参数

include_HEADERS 标明哪些头文件将在执行make install命令之后被安装到系统include目录下
bin_PROGRAMS 生成的目标库文件名,如果有多个,用空格隔开,与configure.ac中AC_INIT对应库名对应
XXX_SOURLDADDCES 编译XXX库需要哪些源文件,使用相对路径
XXX_LDADD 指定要链接的静态库名称
LIBS  指定要链接的动态库名称
INCLUDE 一般指定要使用的头文件所在路径
AUTOMAKE_OPTIONS
设置automake的选项,automake提供了三种软件等级:foreign、gnu和gnits,当当前库文件编译所需源文件不在当前目录时要设置参数subdir-objects

XXX_CPPFLAGS 预处理器选项,编译选项,一般用来指定所需要头文件目录
noinst_LIBRARIES 指定生成的静态库名称,当前目录下源码及头文件最终生成的目标文件名
AM_V_AR 指定把目标打包成静态库,使用ar命令
RANLIB 指定为静态库创建索引,使用ranlib

    (4)autotools使用范例

    1)单个Makefile.am生成多个库文件

现test文件夹下有如下文件

//用于生成 make_test 动态库
calc_test.h
calc_test.cpp
make_test.h
make_test.cpp
main.cpp//用于生成 tiny_test 动态库tinyxml2_main.cpptinyxml2.h   //在/usr/include/tinyxml2路径下tinyxml2.cpp //在/usr/include/tinyxml2路径下

使用autoscan生成configure.in,并改名为configure.ac,修改添加参数后如下:

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.69])
AC_INIT([make_test tiny_test], [1.0 1.0], [1577429698@qq.com])
AC_CONFIG_SRCDIR([calc_test.cpp])
AC_CONFIG_SRCDIR([../../../usr/include/tinyxml2/tinyxml2.cpp])
AM_INIT_AUTOMAKE([foreign -Wall -Werror])
AC_CONFIG_HEADERS([config.h])

# Checks for programs.
AC_PROG_CXX
AC_PROG_CC

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_CONFIG_FILES([Makefile])
AC_OUTPUT

Makefile.am书写如下:

#include_HEADERS = /usr/include/tinyxml2/tinyxml2.h
bin_PROGRAMS = make_test tiny_test
AUTOMAKE_OPTIONS = subdir-objects
#INCLUDE = -l/usr/include/tinyxml2/
make_test_SOURCES = calc_test.h                        calc_test.cpp                      make_test.cpp                      main.cpp
tiny_test_SOURCES = tinyxml2_main.cpp                     tinyxml2.h                            ../../../usr/include/tinyxml2/tinyxml2.cpp
make_test_LDADD =
make_test_LDFLAGS =
make_test_CFLAGS = -g #-I/usr/include/tinyxml2/  

     2)多级源码路径多个Makefile.am生成多个库文件(包含动态库及静态库使用)

参考https://blog.csdn.net/zhengqijun_/article/details/70105077

在test目录下,make_test子目录将单独生成一个动态库make_test,tinyxml子目录单独生成一个静态库tinyxml2,test本身目录引用tinyxml目录生成的静态库和自身文件再生成一个动态库tiny_test;

make_test及tinyxml子目录下各自有的configure.ac文件和Makefile.am文件配合在一起单独使用,生成相应库;make_test及tinyxml目录下Makefile.am文件和test根目录下Makefile.am及总configure.ac文件配合在一起也可组合生成三个库。

    1.文件树状图:

    2.文件内容:

    2.1 tinyxml2_main.cpp

#include <iostream>
//必须写相对路径
#include "tinyxml/tinyxml2.h"
using namespace std;
using namespace tinyxml2;

int main(int argv,char *argc[])
{
  XMLDocument xmlDoc;
  xmlDoc.LoadFile("test.xml");
  int errorID = xmlDoc.ErrorID();
  if(errorID)
  {
    cout<<"Load xml test.xml fail!"<<endl;
    return -1;
  }
  cout<<"Load xml test.xml success!"<<endl;
  XMLElement *pRootElement = xmlDoc.RootElement();
  const char * name = pRootElement->FirstChildElement("name")->GetText();
  cout<<"name = "<<name<<endl;
  return 0;
}

    2.2 configure.ac

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.69])
AC_INIT([tiny_test], [1.0], [[email protected]])
AC_CONFIG_SRCDIR([tinyxml2_main.cpp])
AC_CONFIG_SRCDIR([make_test/calc_test.cpp])
AC_CONFIG_SRCDIR([tinyxml/tinyxml2.cpp])
AM_INIT_AUTOMAKE([foreign -Wall -Werror])

AC_CONFIG_HEADERS([config.h])

# Checks for programs.
AC_PROG_CXX
AC_PROG_CC
AC_PROG_RANLIB
AM_PROG_AR([ar])
# Checks for libraries.

# Checks for header files.
AC_CHECK_HEADERS([limits.h stddef.h stdint.h stdlib.h string.h])

# Checks for typedefs, structures, and compiler characteristics.
AC_CHECK_HEADER_STDBOOL
AC_C_INLINE
AC_TYPE_INT64_T
AC_TYPE_SIZE_T
AC_CHECK_TYPES([ptrdiff_t])

# Checks for library functions.
AC_CHECK_FUNCS([memset strchr])

AC_CONFIG_FILES([Makefile
                 make_test/Makefile
                 tinyxml/Makefile])
AC_CONFIG_SUBDIRS([make_test
                   tinyxml])

    2.3 Makefile.am

AUTOMAKE_OPTIONS = foreign
SUBDIRS = tinyxml make_test
bin_PROGRAMS = tiny_test
tiny_test_SOURCES = tinyxml2_main.cpp
#INCLUDE = -I ./tinyxml
#静态库连接
#tiny_tes_CFLAGS = -I ./tinyxml
tiny_test_LDADD = tinyxml/libtinyxml2.a

#动态库连接

    2.4 make_test/Makefile.am

bin_PROGRAMS = make_test
make_test_SOURCES = calc_test.h                        calc_test.cpp                      make_test.h                        make_test.cpp                      main.cpp
make_test_LDADD =
make_test_LDFLAGS =
make_test_CFLAGS = -g

    2.5 make_test/configure.ac

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.69])
AC_INIT([make_test], [1.0], [1577429698@qq.com])
AM_INIT_AUTOMAKE([foreign -Wall -Werror])
AC_CONFIG_SRCDIR([calc_test.cpp])
AC_CONFIG_HEADERS([config.h])

# Checks for programs.
AC_PROG_CXX
AC_PROG_CC

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_CONFIG_FILES([Makefile])
AC_OUTPUT

    2.6 make_test/calc_test.h

#ifndef _CALC_TEST_H_
#define _CALC_TEST_H_
namespace test
{

  int add(int a,int b);

}
#endif

    2.7 make_test/clac_test.cpp

#include "calc_test.h"
namespace test
{
  int add(int a,int b)
  {
    return a + b ;
  }
}

    2.8 make_test/make_test.h

#ifndef _MAKE_TEST_
#define _MAKE_TEST_
#include <iostream>
namespace test
{
  class MakeTest
  {
    public:
      void run();
  };
}

    2.9 make_test/make_test.cpp

#include "make_test.h"
#include "calc_test.h"
namespace test
{
  void MakeTest::run()
  {
    int a = 10;
    int b = 10;
    std::cout<<test::add(a,b)<<std::endl;
  }
}

    2.10 make_test/main.cpp

#include <iostream>
#include "string.h"
#include "make_test.h"

using namespace std;

int main()
{
  test::MakeTest makeTest;// = new MakeTest();
  makeTest.run();
  return 0;
}

    2.11 tinyxml/Makefile.am

noinst_LIBRARIES = libtinyxml2.a
libtinyxml2_a_SOURCES = tinyxml2.h tinyxml2.cpp
#AM_V_AR = ar
RANLIB = ranlib

    2.12 tinyxml/configure.ac

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.69])
AC_INIT([tinyxml2], [1.0], [1577429698])
AM_INIT_AUTOMAKE([foreign -Wall -Werror])
AC_CONFIG_SRCDIR([tinyxml2.cpp])
AC_CONFIG_HEADERS([config.h])

# Checks for programs.
AC_PROG_CXX
AC_PROG_CC
AC_PROG_RANLIB
AM_PROG_AR([ar])

# Checks for libraries.

# Checks for header files.
AC_CHECK_HEADERS([limits.h stddef.h stdint.h stdlib.h string.h])

# Checks for typedefs, structures, and compiler characteristics.
AC_CHECK_HEADER_STDBOOL
AC_C_INLINE
AC_TYPE_INT64_T
AC_TYPE_SIZE_T
AC_CHECK_TYPES([ptrdiff_t])

# Checks for library functions.
AC_CHECK_FUNCS([memset strchr])

AC_CONFIG_FILES([Makefile])
AC_OUTPUT

    configure.ac文件均是由autoscan命令生成的configure.scan修改改名而来;在前面文件创建、均被完毕之后,执行以下命令:

aclocal
autoconf
autoheader
automake --add-missing
./configure
make

     结果如下:

原文地址:https://www.cnblogs.com/MenAngel/p/11592104.html

时间: 2024-11-14 18:16:00

(6)autotools工具的使用的相关文章

automake - 使用 autotools 工具集

一般而言,对于小项目或玩具程序,手动编写 Makefile 即可.但对于大型项目,手动编写维护 Makefile 成为一件费时费力的无聊工作. 本文介绍 autotools 工具集自动生成符合 Linux 规范的 Makefile 文件. 如果读者没有安装 autotools 工具集,安装命令如下, $ sudo apt-get install automake 安装完成之后,会有如下工具可用, aclocal      autoscan      autoconf      autoheade

Makefile自动生成(autotools工具的使用)

autotools是个系列工具,首先确认你的Ubuntu系统是否安装了以下工具(可以通过which命令查看): aclocal autoscan autoconf autoheader automake --------------------------------------------------------------------------------- 安装方法: [email protected]:~$ sudo apt-get install autoconf 装完后,用whic

Makefile 生成工具之autotools

一.安装autotools工具 sudo apt-get install automake sudo apt-get install autoconf 二.autotools是系列工具, 它主要由autoconf.automake.perl语言环境和m4等组成;所包含的命令有五个 : aclocal autoscan autoconf autoheader automake 1.autoscan 它会在给定目录及其子目录树中检查源文件,若没有给出目录,就在当前目录及其子目录树中进行检查.它会搜索

linux 商业项目 makefile 自动生成工具Autotools的使用

我们在平时的学习中要编译我们写的源代码生成可执行文件,大家都知道用gcc编译工具就可以完成任务,更复杂一点的,如果我们编写的文件比较多,那单纯在linux环境下写gcc命令进行编译就显得有点效率太低了,这时我们肯定想到写一个makefile来完成这样稍微复杂的编译过程,我想很多人也确实是是这样做的,所以我们回去学习makefile 的语法,其实如果编译 的文件量再多一些,文件之间的依赖关系更复杂一些,那么我们编写一个正确的,效率高的makefile也不是一件很容易的事情吧.其实我之前是有体验过这

Linux江湖23:使用Eclipse和Gnu Autotools管理C/C++项目

在我该系列的之前的所有随笔中,都是采用 Linux 发行版自带的包管理工具(如 apt-get.yum 等)进行软件的安装和卸载,从来没有向大家展示使用源代码自行编译安装软件的方法.但是长期混迹于 Unix/Linux 世界的童鞋们都知道,从源代码自行编译安装软件并不是那么的难,一般都是这样三个步骤: configure make make install 之所以能够把源代码的构建管理得如此简单,这得益于 Gnu 的 Autotools 工具链.在上面的三个命令中,configure 是一个脚本

Android系统开发(4)——Autotools

Autotools工具的构成 1.autoscan autoscan是用来扫描源代码目录生成configure.san文件的,configure.san包含了系统配置的基本选项,里面都是一些宏定义,我们需要将它的名字改为configure.in 2.aclocal aclocal是一个perl脚本程序.aclocal根据configure.in文件内容自动生成aclocal.m4文件,生成的aclocal.m4文件是宏展开文件. 3.autoconf autoconf是用来产生configure

使用autotools自动生成Makefile并在此之上使用dh-make生成可发布的deb程序包(详解)

转自:http://blog.csdn.net/longerzone/article/details/12705507 一.前言 本文将介绍如何使用autotools生成一个Makefile文件,并在此基础上使用dh-make和debuild生成一个可发布的deb程序包,这也是我们在Linux下开发应用程序以及想要发布应用程序需要做的. 无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令.不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或 make ins

linux下使用automake工具自动生成makefile文件

linux环境下,当项目工程很大的时候,编译的过程很复杂,所以需要使用make工具,自动进行编译安装,但是手写makefile文件比较复杂,所幸在GNU的计划中,设计出了一种叫做Autoconf/Automake的工具,用来自动生成makefile文件,为编译和安装程序提供了一个方便快捷的入口. 一.首先检查是否安装了autotools工具 使用which命令    aclocal    autoscan    autoconf    autoheader    automake 二.安装aut

GNU Autotools的研究(转)

最近对Linux下软件项目的构建过程研究了一番.Linux下的软件项目通常用Autotools工具集和make工具来构建,我们通常使用./configure.make.make install这样的命令来编译安装软件包,则这样的项目一般就是使用Autotools工具集来构建,再加上GNU make工具来编译安装.   使用Autotools的目的:  (1)构建可移植的软件包.在不同操作系统上(主要是不同的类Unix系统),可能同样功能函数名称的不同,同样功能的库的名字的不同,以及头文件的不同,