• 如何使用autotools制作Makefile


    本文将通过一个例子介绍如何使用autotools制作Makefile,最终运行可执行文件
    本例子中使用的源代码a.c如下。

    #include "stdio.h"
    void main()
    {
            int a,b;
            int c;
            printf("请输入两个数:\n");
            scanf("%d %d",&a,&b);
            c=a+b;
            printf("a=%d,b=%d,a+b=%d\n",a,b,c);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在使用之前先确保系统已经安装了autoconf等工具。
    一开始文件夹下只有源文件a.c,首先使用下面的命令。

    autoscan

    autoscan命令会在给定目录及其子目录树中检查源文件,若没有给出目录,就在当前目录及其子目录树中进行检查,它会搜索源文件以寻找一般的移植性问题并创建一个文件“configure.scan”,该文件就是接下来autoconf要用到的“configure.ac”原型。
    使用该命令后在生成了文件autoscan.log和configure.scan,如下图所示。
    在这里插入图片描述
    configure.scan文件的内容如下图所示。
    在这里插入图片描述
    其中,以“#”号开始的行为注释。
    AC_PREREQ 宏声明本文件要求的autoconf版本,如本例使用的版本2.69。
    AC_INIT宏用来定义软件的名称和版本等信息,BUG-REPORT-ADDRESS一般为作者的E-mail。
    AC_CONFIG_SRCDIR宏用来侦测所指定的源文件是否存在,来确定源目录的有效性,此处为当前目录下的a.c。
    AC_CONFIG_HEADER宏用于生成config.h文件,以便autoheader使用。
    接下来使用下面的命令将configure.scan文件更名为configure.ac。

    mv configure.scan configure.ac

    然后打开configure.ac文件并添加如下内容。

    #                                               -*- Autoconf -*-
    # Process this file with autoconf to produce a configure script.
    
    AC_PREREQ([2.69])
    #AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
    AC_INIT(a,1.0)
    AM_INIT_AUTOMAKE(a,1.0)
    AC_CONFIG_SRCDIR([a.c])
    AC_CONFIG_HEADERS([config.h])
    
    # Checks for programs.
    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
    # AC_OUTPUT(Makefile)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    相比于之前的configure.scan,configure.ac所做改变的地方如下图所示。
    在这里插入图片描述
    AM_INIT_AUTOMAKE是需要自己另加的,它是automake所必备的宏,也同前面一样,PACKAGE-NAME是所要产生软件套件的名称,VERSION是版本编号。
    AC_CONFIG_FILES宏用于生成相应的Makefile文件。
    也可以不加AC_CONFIG_FILES这一行,直接用AC_OUTPUT(Makefile)代替。
    依次使用下面的命令生成相应的文件。

    aclocal
    autoconf
    autoheader

    使用aclocal命令会生成aclocal.m4文件和autom4te.cache文件。
    使用autoconf命令生成configure文件。
    使用autoheader命令生成config.h.in文件,该工具通常会从“acconfig.h”文件中复制用户附加的符号定义。
    在这里插入图片描述
    接下来在该目录下新建一个Makefile.am文件,并在其中键入下面的代码。

    AUTOMAKE_OPTIONS = foreign
    bin_PROGRAMS = a
    a_SOURCES = a.c
    
    • 1
    • 2
    • 3

    AUTOMAKE_OPTIONS为设置automake的选项,由于GNU对自己发布的软件有严格的规范,比如必须附带许可证声明文件COPYING等,否则automake执行时会报错。automake提供了3种软件等级:foreign、gnu和gnits,让用户选择采用,默认等级为gnu。本例使用foreign等级,它只检测必须的文件。
    bin_PROGRAMS定义要生成的可执行程序的文件名,如果要产生多个执行文件,每个文件名用空格隔开。
    a_SOURCES定义“a”这个执行程序所需要的原始文件,如果“a”这个程序是由多个原始文件所产生的,则必须把它所用到的所有原始文件都列出来,并用空格隔开。要注意的是,如果要定义生成多个可执行文件,则对每个执行程序都要定义相应的file_SOURCES。
    接下来使用automake命令。

    automake --add-missing

    这里使用选项“–adding-missing”可以让automake自动添加有一些必需的脚本文件,生成了Makefile.in文件,如下图所示。
    在这里插入图片描述
    然后运行可执行程序,把Makefile.in变成最终的Makefile。

    ./configure

    可以看到,运行上面的命令之后Makefile文件就生成了。
    在这里插入图片描述
    然后使用make命令,就生成了下面的a可执行文件,然后运行该文件。
    在这里插入图片描述

    make 默认是make all
    make install 把该程序安装到系统目录中去,此时直接运行可执行文件,也能出现正确的结果
    make clean 清除之前编译产生的可执行文件以及目标文件
    make dist 将程序和相关的文档打包为一个压缩文档

    使用autotools制作Makefile文件尤其适合包含许多文件的项目,我们只需要在Makefile.am文件中输入目标文件、依赖文件、文件目录等就可以轻松地生成Makefile了。
    使用autotools制作Makefile文件的指令汇总:

    autoscan
    mv configure.scan configure.ac
    修改configure.ac中的内容
    aclocal
    autoconf
    autoheader
    新建Makefile.am文件键入代码
    automake --add-missing
    ./configure
    make
    ./a
    Makefile也可以用makefile代替,但是前后要保持名称一致

    以上就是使用autotools制作Makefile文件的所有内容了,希望对你有用!

  • 相关阅读:
    HP魔法觉醒自动抢协作和自动社团答题的半成品
    【十分钟】manim安装 2022
    安卓APP:有读写权限,却读取不到照片的怪事
    医学YOLOv8 | 脑肿瘤检测 Accuracy 99%
    一文读懂物联网中无线通信主要技术
    大一,小小练习题--含答案
    [蓝桥杯-610]分数
    如何用 C++ 部署深度学习模型?
    NLP对话系统面试总结,从阿里 百度 滴滴一轮游到最终拿下40万offer
    多线程学习笔记-2.final关键字和不变性
  • 原文地址:https://blog.csdn.net/weixin_42570192/article/details/132732845