GNU编译工具链介绍---Antoconf

  大家在下载很多自由软件的源码下来编译的时候,都要用到configure这个命令,然后make,make install等等,这里我们就浅显地介绍一下什么是autoconf:

  1. 基本介绍

  autoconf就是一个生成shell脚本(或者其他操作系统上的可解释脚本或程序)的程序,生成的shell脚本用来根据所在的编译环境对源码进行配置。举个很简单的例子,比如我在Linux和Mac上面编译同样一份源码,编译出的程序可能一个显示Linux版本信息,一个显示Mac的版本信息,这就是autoconf起到的作用,收集环境信息,大大方便了用户(可以想象一下,每次在系统下安装一个软件,都要自己配置系统信息,编译器版本会是一件多么麻烦的事情)。

  2. Automake

  介绍autoconf就必须介绍automake,作为GNU家族中不可分割的两个工具,二者大多数情况下也是相辅相成的,make所作的工具无非就是编译链接最后生成目标文件,如果你只是写一个hello world,那么用make就足矣(其实连make都不用),可以直接写一个Makefile如下:

hello:hello.c
    gcc hello -o hello.c 

  很简单是吧,但是在一个大的C/C++工程中,会有很多模块,需要引入很多头文件,库文件等等,如果这样一个个写依赖,不仅仅效率低下,也是非常不易于管理的。因此作为make的辅助工具,autoconf应运而生,它往往起到这些作用:搜索系统中是否有工程依赖的库,如果有,路径又是什么?默认的编译器和其版本等等。

  3. 生成configure脚本

  configure脚本由autoconf程序生成,autoconf在源码路径下运行该程序的时候,该程序会搜索该路径下是否有configure.ac这个配置文件,还可以自己添加一个测试配置文件如aclocal.m4和acsite.m4,这些文件的具体作用可以自行Google,这里就不详细介绍。 

  下面的图介绍了如何生成配置文件的过程

your source filles --> [autoscan*] --> [configure.scan] --> configure

configure.ac --.----×
                       | *--------------> autoconf* ---------> configure
[aclocal.m4]   +-------+                       |
[acsite.m4] --------× * --------------> [autoheader*] -----> [config.h.in]

Makefile.in

  如果我们用Automake,下面的文件将会起到作用。

[acinclude.m4] ----,                   | [local macros]  ---+ --> aclocal* ---> aclocal.m4                   |configure.ac   ----,

configure.ac ------.                   +---> automake* --> Makefile.inMakefile.am  ------,

  配置软件过程中所用到的所有配置文件

                                 *----------------> [config.cache]configure* ----------------------+---------------->config.log                                 |[config.h.in] -.                 V                 .-> [config.h] -.               + ----->  config.status*   ------+               +-----> make*Makefile.in ---,                                    ‘-> Makefile ---

  我们可以看出,最后的make只需要Makefile和config.h两个文件,那么之前的那些文件都是有什么用的呢,一个很简单的理解方式是之前的Makefile.in是Makefile的模板,configure配置之后将配置宏写到Makefile.in中就形成最后可执行的Makefile配置文件。

  那么,如何编写configure.ac呢?

  我们需要了解的是configure无非就是读取各种环境中的信息,autoconf已经提供了很多宏用来读取这些信息。这里插上一句,之前后缀为in的是configure程序处理的配置文件,而现在,更加推荐以ac作为后缀的命名方式。

  autoconf是一个非常健壮的程序,可以兼容各种操作系统的不同,而我们不需要关心这一点,只需要用autoconf的方式来编写配置文件即可,考虑到大多数的configure环境都是在类Unix环境中,所以你可能会说,为什么不直接用shell呢,反正也是读取各种环境变量,理论上是肯定可以的,如果不用autoconf,就可以用shell进行配置信息的初始化,而实际情况是autoconf避免了我们重复造轮子,已经为我们写好了一些shell function读取环境参数,效率比写自己写shell更高,而且很少出错。其实细心的人都知道,autoconf也是将configure.ac编译成configure,用编辑器打开configure就会发现里面是shell命令。

  3.1 autoconf配置语言

  autoconf中都是使用各种宏命令来编写的,下面就来介绍写这些宏命令的规范:

  1. 当宏命令有参数的时候,宏名称和括号中不能有空格

AC_INIT ([oops], [1,0]) # incorrectAC_INIT([hello], [1,0]) # correct

  2. 一般情况下,Macro需要用中括号,除非已知不是Macro命令可以不加中括号,看下面示例

AC_CHECK_HEADER([stdio.h],           [AC_DEFINE([HAVE_STDIO_H], [1],           [Define to 1 if you have <stdio.h>.])],           [AC_MSG_ERROR([sorry, can’t do anything for you])])AC_CHECK_HEADER([stdio.h],           [AC_DEFINE([HAVE_STDIO_H], 1,           [Define to 1 if you have <stdio.h>.])],           [AC_MSG_ERROR([sorry, can’t do anything for you])])

  因为1不可能包括宏命令,所以可以不用中括号,上面的写法是一种非常保守小心的写法,这常常会让用户比较反感,总是要加中括号,现在大多数人推崇的写法如下。

AC_CHECK_HEADER(stdio.h,           [AC_DEFINE(HAVE_STDIO_H, 1,           [Define to 1 if you have <stdio.h>.])],           [AC_MSG_ERROR([sorry, can’t do anything for you])])

  我们可以看出,stdio.h和HAVE_STDIO_H没有加入中括号,但这也是比较安全的(只要你没有定义这些名字的宏,就不会被错误地解释),再给大家写一种错误危险的写法:

AC_CHECK_HEADER(stdio.h,           AC_DEFINE(HAVE_STDIO_H, 1, Define to 1 if you have .),           AC_MSG_ERROR([sorry, can’t do anything for you]))

  为什么上面的写法就是错误危险的呢?因为

  

  

时间: 2024-12-25 23:15:58

GNU编译工具链介绍---Antoconf的相关文章

Linux上安装编译工具链

在Linux上安装编译工具链,安装它会依赖dpkg-dev,g++,libc6-dev,make等,所以安装之后这些依赖的工具也都会被安装.ubuntu软件库中这么描述 Informational list of build-essential packages If you do not plan to build Debian packages, you don't need this package. Starting with dpkg (>= 1.14.18) this package

交叉编译工具链介绍《Building Embedded Linux Systems》

1.前言 配置和编译一个合适的GNU工具链是相对复杂的并且需要很精细的操作,包括你需要对不同软件库之间的依赖关系.它们的各自的任务,不同软件库版本情况都有比较好的了解,编译工具链是一个乏味的工作. 2.制作之前需要了解的一些术语与名称 1)build:你编译你的工具链时所使用的编译系统. 2)host:交叉编译工具链运行在的主机系统. 3)target:你的交叉编译工具链所生成的可执行文件所要运行的目标系统. 在一些通用非嵌入式的使用,以上三个必须是一样的.但是大部分嵌入式开发中,build跟h

编译工具链

GCC命令: 格式:gcc -[命令选项]  文件名(这里指需要编译的文件名) 一个C语言程序需要经过这几个过程才能进行一个可以执行的文件 例如hello.c这个源文件 Hello.c--> hello.i-->hello.s-->hello.o-->hello -E          -S        -C 将一个汇编文件编译成一个可以烧写到开发板中二进制文件的步骤 (1)执行命令arm-linux-gcc -c -g  XXX.S (注意最后的扩展名是大写) (2)执行命令a

编译工具链,生成各个平台的ffmpeg版本的库

1.在开始动手编译ffmpeg之前我们来梳理一下几个概念,gcc.g++.msvc.mingw.clang.cmake.make.qmake 作为一个windows软件工程师,以为长时间浸淫在各种强大的IDE的世界里,对编译的过程和相关的工具链还是相当陌生的.上面举出来的几个词语是自己在要编译各种平台的库的时候遇到的,因为Qt是跨平台的,所以要求相关的库也要跨平台: gcc/g++ 是c和c++对应的编译器,完成代码的编译和链接过程,clang也可以用来编译c++ oc,编译oc的时候效率是gc

ARM64编译工具链下载

下面是自制的用于编译ARMv8指令的交叉编译工具链: 1.运行在PC上,支持SVE指令,不支持SVE ACLE,版本GCC9.2 https://pan.baidu.com/s/1_NnwajWCelT3rRUuM-yl6Q 2.运行在Qemu+Ubuntu18.04+ARM64,支持SVE ACLE,版本GCC9.0 https://pan.baidu.com/s/1qHeKnH5MiTCw_v9GnRJwJg 3.运行在Firefly RK3399 + Ubuntu16.04,支持SVE A

嵌入式交叉工具链编译

读者可能会有疑问,为什么要用交叉编译器?交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序,比如在PC平台 (X86 CPU)上编译出能运行在以ARM为内核的CPU平台上的程序,编译得到的程序在X86 CPU平台上是不能运行的,必须放到ARM CPU平台上才能运行,虽然两个平台用的都是Linux系统.这种方法在异平台移植和嵌入式开发时非常有用.相对与交叉编译,平常做的编译叫本地编译,也 就是在当前平台编译,编译得到的程序也是在本地执行.用来编译这种跨平台程序的编译器就

Ubuntu 编译 ARM-Linux-Gcc 工具链 -- 通过crosstool-NG制作工具链

1.手动下载制作过程中所需要的包,节省时间 所用包如下(不同版本所有包版本有所不同) libtool-2.4.6 linux-3.2.87 gmp-6.1.2 mpfr-3.1.5 isl-0.16.1 mpc-1.0.3 libelf-0.8.13 expat-2.2.0 ncurses-6.0 libiconv-1.15 gettext-0.19.8.1 binutils-2.28 gcc-5.4.0 glibc-2.25 duma_2_5_15 gdb-7.12.1 ltrace-0.7.

Linux下获取arm的交叉编译工具链

转载请注明文章:Linux下获取arm的交叉编译工具链 出处:多客博图 这里介绍,Linux下获取arm的交叉编译工具链,比如arm-linux-gnueabihf-gcc.arm-linux-gneabihf-gcc等. 前言 这里有一个专门的说法: “arm-linux-gnueabihf-gcc是由 Linaro 公司基于GCC推出的的ARM交叉编译工具.可用于交叉编译ARM系统中所有环节的代码,包括裸机程序.u-boot.Linux kernel.filesystem和App应用程序.使

Android开发实践:Android交叉编译工具链的使用

前面2篇文章分别介绍了Android NDK编译的命令行参数,以及如何在任意目录使用Android.mk来编译本地c/c++代码,Andriod.mk和ndk-build只不过是Android官方提供了一套封装过的Android交叉编译环境而已,其实,你可以不用它,而直接通过传统的Makefile文件来编译你的c/c++代码的,本文即介绍如何直接通过传统的Makefile文件来编译可用于Android平台的库文件. 经常搞嵌入式开发的朋友对于交叉编译环境应该并不陌生,说白了,就是一组运行在x86