電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 117|回復(fù): 0
收起左側(cè)

Linux C自動(dòng)化編譯 | Autotools自動(dòng)構(gòu)建工程項(xiàng)目Makefile

[復(fù)制鏈接]

317

主題

317

帖子

3149

積分

四級(jí)會(huì)員

Rank: 4

積分
3149
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-11-21 11:26:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
前言GNU autotools 是一系列編程工具,可以輔助產(chǎn)生 Makefile,方便編譯整個(gè)工程項(xiàng)目。它是自由軟件基金會(huì)發(fā)起的GNU計(jì)劃的其中一項(xiàng),作為GNU建構(gòu)系統(tǒng)的一部分。autotools 所產(chǎn)生的 Makefile 符合GNU編程標(biāo)準(zhǔn)。
使用過開源 C/C++ 項(xiàng)目的同學(xué)們都知道,標(biāo)準(zhǔn)的編譯過程已經(jīng)變成了簡單的三部曲:configure/make/make install, 使用起來很方便,不像平時(shí)自己寫代碼,要手寫一堆復(fù)雜的 Makefile,而且換個(gè)編譯環(huán)境,Makefile 還需要修改。
Makefile 帶來的最大好處就是 “自動(dòng)化編譯”,一但編輯好文件,只需要一個(gè) make 命令,整個(gè)工程完全自動(dòng)編譯,極大的提高了軟件開發(fā)的效率。
如果工程項(xiàng)目比較小,那么可以直接手動(dòng)編輯該文件;不過一但工程項(xiàng)目比較大時(shí),手動(dòng)維護(hù)將變得極其復(fù)雜,為此,就可以使用 Autotools 或者 CMake 生成 Makefile 文件。本文主要講解 Autotools 生成Makefile 的方法。
一、Autotools構(gòu)成首先安裝autoTools工具集,Centos下可以使用如下命令在線安裝:
yum install autoconf automake libtool
autotools包含以下工具:
  • aclocal:perl 腳本程序,根據(jù)已經(jīng)安裝的宏、用戶定義宏和acinclude.m4文件中的宏將configure.ac文件所需要的宏集中定義到文件 aclocal.m4中;
  • autoscan:autoconf的輔助命令,掃描源代碼以搜尋普通的可移植性問題,比如檢查編譯器、庫、頭文件等,生成configure.scan,最終生成 configure.ac;
  • autoheader: autoconf的輔助命令,用于生成configure的模板頭文件config.h.in;
  • autoconf:基于configure.ac生成configure,需依賴 m4;
  • automake:基于Makefile.am和configure.ac生成Makefile,需依賴perl。
  • libtool:創(chuàng)建和使用可移植的共享(動(dòng)態(tài)鏈接)庫。二、構(gòu)建流程使用Autotools生成Makefile的流程總結(jié)如下:
  • 在源代碼的頂層目錄下執(zhí)行 autoscan 命令生成 configure.scan 文件。
  • 將 configure.scan 文件改名為 configure.ac(或configure.in),并對(duì)其默認(rèn)配置進(jìn)行修改。
  • 執(zhí)行 aclocal、autoconf、autoheader 三個(gè)命令,分別生成 aclocal.m4、configure 、config.h.in文件。
  • 在每個(gè)目錄下創(chuàng)建一個(gè)名為 Makefile.am 的文件,并輸入相應(yīng)的內(nèi)容。
  • 執(zhí)行 automake --add-missing,它根據(jù) Makefile.am 文件,生成 Makefile.in。(ps 此步驟只能在 aclocal、autoconf之后)
  • 執(zhí)行 ./configure 腳本文件,它根據(jù) Makefile.in 文件,生成最終的 Makefile 文件。
  • 生成 Makefile 之后,執(zhí)行make編譯工程并且生成可執(zhí)行程序。
    [/ol]根據(jù)上述流程,整理autotools自動(dòng)構(gòu)建流程圖如下:

    看到這里,你可能只是對(duì)于使用 autotools 創(chuàng)建 Makefile 的步驟有了一個(gè)模糊的認(rèn)識(shí),正所謂:“實(shí)踐才是檢驗(yàn)真理的唯一標(biāo)準(zhǔn)”,接下來讓我們從實(shí)際的例子入手帶你領(lǐng)略一下autotools 的精妙之處。
    三、Autotools編譯各類型文件首先,創(chuàng)建/tmp/myproject目錄,我們用它來存放各種編譯場(chǎng)景下的main程序及相關(guān)依賴文件。
    mkdir -p /tmp/myproject
    cd /tmp/myproject
    mkdir src
    mkdir include
    創(chuàng)建C源文件供后續(xù)各編譯場(chǎng)景下使用,具體如下:
    main.c源文件:
    #include
    #include"include/math.h"
    int main()
    {
            int a = 10;
            int b = 20;
            printf("max=%d
    ", max(a, b));
            printf("min=%d
    ", min(a, b));
    }
    math.h頭文件:
    #pragma once
    #ifndef MATH_H
    #define MATH_H
    int max(int x, int y);
    int min(int x, int y);
    #endif // !MATH_H
    math.c源文件:
    int max(int x, int y)
    {
         return x > y ? x : y;
    }
    int min(int x, int y)
    {
         return x 1、編譯可執(zhí)行程序(未依賴任何庫文件)(1)生成 configure.scan我們使用 autoscan 命令來幫助我們根據(jù)目錄下的源代碼生成一個(gè)configure.scan文件,它可以作為進(jìn)一步生成 configure的 configure.ac 文件的模板。
    [root@localhost myproject]# tree
    .
    ├── include
    │   └── math.h
    └── src
        ├── main.c
        └── math.c
    2 directories, 3 files
    [root@localhost myproject]# autoscan
    [root@localhost myproject]# tree
    .
    ├── autoscan.log
    ├── configure.scan
    ├── include
    │   └── math.h
    └── src
        ├── main.c
        └── math.c
    2 directories, 5 files
    執(zhí)行后在myproject目錄下會(huì)生成一個(gè)文件:configure.scan,我們可以拿它作為configure.in (早期使用.in后綴) 或者 configure.ac的藍(lán)本。
    (2)修改configure.ac當(dāng)利用autoscan工具生成confiugre.scan文件時(shí),configure.scan其實(shí)是一個(gè)模板文件,我們需要將文件confiugre.scan重命名為confiugre.ac。confiugre.ac調(diào)用一系列autoconf宏來測(cè)試程序需要的或用到的特性是否存在,以及這些特性的功能。
    下面我們就來目睹一下confiugre.scan的廬山真面目:
    #                                               -*- 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_CONFIG_SRCDIR([src/main.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_OUTPUT
    每個(gè)configure.scan文件都是以AC_INIT開頭,以AC_OUTPUT結(jié)束。我們不難從文件中看出confiugre.ac文件的一般布局:
    AC_INIT
    測(cè)試程序
    測(cè)試函數(shù)庫
    測(cè)試頭文件
    測(cè)試類型定義
    測(cè)試結(jié)構(gòu)
    測(cè)試編譯器特性
    測(cè)試庫函數(shù)
    測(cè)試系統(tǒng)調(diào)用
    AC_OUTPUT
    上面的調(diào)用次序只是建議性質(zhì)的,但我們還是強(qiáng)烈建議不要隨意改變對(duì)宏調(diào)用的次序。
    configure.ac 標(biāo)簽說明:
    標(biāo)簽說明AC_PREREQ確定autoconf版本,它是在AC_INIT前唯一使用的宏AC_INIT定義軟件名稱,版本號(hào),郵箱AM_INIT_AUTOMAKE必須要的,參數(shù)為軟件名和版本號(hào)AC_CONFIG_SRCDIR該宏用來偵測(cè)所指定的源碼文件是否存在,來確定源碼有效性AC_CONFIG_HEADER該宏用來生成config.h文件,以便autoheader命令使用AC_PROG_CC指定編譯器,默認(rèn)GCCAC_CONFIG_FILE生成相應(yīng)的Makefile文件,不同目錄下通過空格分隔AC_OUTPUT用來設(shè)定configure所要產(chǎn)生的文件,如果是makefile,config會(huì)把它檢查出來的結(jié)果帶入makefile.in文件,產(chǎn)生合適的makefile,如果只有一個(gè)Makefile, 也可改為AC_OUTPUT([Makefile])現(xiàn)在開始重命名該文件:
    [root@localhost myproject]# mv configure.scan configure.ac
    同時(shí)修改重命名后的configure.ac文件,修改后的結(jié)果如下:
    #                                               -*- 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(main, 1.0, linux106587@126.com) #新增一句描述,這里main是我源程序main.c的名字
    AM_INIT_AUTOMAKE(main, 1.0)   #新增一句,后面aclocal用到的
    AC_CONFIG_SRCDIR([src/main.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
    (3)生成 configure執(zhí)行命令aclocal和autoconf,分別會(huì)產(chǎn)生aclocal.m4及configure兩個(gè)文件:
    # 執(zhí)行aclocal,生成文件如下所示
    [root@localhost myproject]# aclocal
    [root@localhost myproject]# tree
    .
    ├── aclocal.m4
    ├── autom4te.cache
    │   ├── output.0
    │   ├── requests
    │   └── traces.0
    ├── autoscan.log
    ├── configure.ac
    ├── include
    │   └── math.h
    └── src
        ├── main.c
        └── math.c
    3 directories, 9 files
    # 執(zhí)行autoconf,生成文件如下:
    [root@localhost myproject]# autoconf
    [root@localhost myproject]# tree
    .
    ├── aclocal.m4
    ├── autom4te.cache
    │   ├── output.0
    │   ├── output.1
    │   ├── requests
    │   ├── traces.0
    │   └── traces.1
    ├── autoscan.log
    ├── configure
    ├── configure.ac
    ├── include
    │   └── math.h
    └── src
        ├── main.c
        └── math.c
    3 directories, 12 files
    (4)生成config.h.in執(zhí)行 autoheader,掃描configure.ac(configure.in)、acconfig.h(如果存在),生成config.h.in宏定義文件,里面主要是根據(jù)configure.ac中某些特定宏(如AC_DEFINE)生成的#define和#undefine宏,configure在將根據(jù)實(shí)際的探測(cè)結(jié)果決定這些宏是否定義。
    [root@localhost myproject]# autoheader
    [root@localhost myproject]# tree
    .
    ├── aclocal.m4
    ├── autom4te.cache
    │   ├── output.0
    │   ├── output.1
    │   ├── requests
    │   ├── traces.0
    │   └── traces.1
    ├── autoscan.log
    ├── config.h.in
    ├── configure
    ├── configure.ac
    ├── include
    │   └── math.h
    └── src
        ├── main.c
        └── math.c
    3 directories, 13 files
    (5)創(chuàng)建 Makefile.amMakefile.am 是一種比Makefile更高層次的規(guī)則。只需指定要生成什么目標(biāo),它由什么源文件生成,要安裝到什么目錄等構(gòu)成。
    圖一列出了可執(zhí)行文件、靜態(tài)庫、頭文件和數(shù)據(jù)文件,四種書寫Makefile.am文件的一般格式。

    對(duì)于可執(zhí)行文件和靜態(tài)庫類型,如果只想編譯,不想安裝到系統(tǒng)中,可以用 noinst_PROGRAMS 代替 bin_PROGRAMS,noinst_LIBRARIES 代替 lib_LIBRARIES。
    Makefile.am 還提供了一些全局變量供所有的目標(biāo)體使用:
    變量含義INCLUDES鏈接時(shí)所需要的頭文件LDADD鏈接時(shí)所需要的庫文件LDFLAGS鏈接時(shí)所需要的庫文件選項(xiàng)標(biāo)志EXTRA_DIST源程序和一些默認(rèn)的文件將自動(dòng)打入.tar.gz包,其它文件若要進(jìn)入.tar.gz包可以用這種辦法,比如配置文件、數(shù)據(jù)文件等等SUBDIRS在處理當(dāng)前目錄之前要遞歸處理指定的子目錄在 Makefile.am 中盡量使用相對(duì)路徑,系統(tǒng)預(yù)定義了兩個(gè)基本路徑:
    路徑變量含義$(top_srcdir)工程最頂層目錄,用于引用源程序$(top_builddir)定義了生成目標(biāo)文件最上層目錄,用于引用.o等編譯出來的目標(biāo)文件新建Makefile.am文件,命令:
    [root@localhost myproject]# vim Makefile.am
    [root@localhost myproject]# cat Makefile.am
    AUTOMAKE_OPTIONS=foreign
    bin_PROGRAMS=main
    main_SOURCES=src/main.c src/math.c
    include_HEADERS=include/math.h
    其中的AUTOMAKE_OPTIONS為設(shè)置automake的選項(xiàng)。由于GNU對(duì)自己發(fā)布的軟件有嚴(yán)格的規(guī)范,比如必須附帶許可證聲明文件COPYING等,否則automake執(zhí)行時(shí)會(huì)報(bào)錯(cuò)。automake提供了三種軟件等級(jí):foreign、gnu和gnits,讓用戶選擇采用,默認(rèn)等級(jí)為gnu。在本例使用foreign等級(jí),它只檢測(cè)必須的文件。
    執(zhí)行automake --add-missing會(huì)根據(jù)你寫的Makefile.am來自動(dòng)生成Makefile.in。
    Makefile.am中定義的宏和目標(biāo),會(huì)指導(dǎo)automake生成指定的代碼。例如,宏bin_PROGRAMS將導(dǎo)致編譯和連接的目標(biāo)被生成。automake會(huì)根據(jù)Makefile.am文件產(chǎn)生一些文件,包含最重要的Makefile.in。
    [root@localhost myproject]# automake --add-missing
    configure.ac:7: warning: AM_INIT_AUTOMAKE: two- and three-arguments forms are deprecated.  For more info, see:
    configure.ac:7: https://www.gnu.org/software/automake/manual/automake.html#Modernize-AM_005fINIT_005fAUTOMAKE-invocation
    configure.ac:12: installing './compile'
    configure.ac:7: installing './install-sh'
    configure.ac:7: installing './missing'
    Makefile.am:3: warning: source file 'src/main.c' is in a subdirectory,
    Makefile.am:3: but option 'subdir-objects' is disabled
    automake: warning: possible forward-incompatibility.
    automake: At least a source file is in a subdirectory, but the 'subdir-objects'
    automake: automake option hasn't been enabled.  For now, the corresponding output
    automake: object file(s) will be placed in the top-level directory.  However,
    automake: this behaviour will change in future Automake versions: they will
    automake: unconditionally cause object files to be placed in the same subdirectory
    automake: of the corresponding sources.
    automake: You are advised to start using 'subdir-objects' option throughout your
    automake: project, to avoid future incompatibilities.
    Makefile.am:3: warning: source file 'src/math.c' is in a subdirectory,
    Makefile.am:3: but option 'subdir-objects' is disabled
    Makefile.am: installing './depcomp'
    [root@localhost myproject]#
    [root@localhost myproject]# tree
    .
    ├── aclocal.m4
    ├── autom4te.cache
    │   ├── output.0
    │   ├── output.1
    │   ├── requests
    │   ├── traces.0
    │   └── traces.1
    ├── autoscan.log
    ├── compile -> /usr/share/automake-1.16/compile
    ├── config.h.in
    ├── configure
    ├── configure.ac
    ├── depcomp -> /usr/share/automake-1.16/depcomp
    ├── include
    │   └── math.h
    ├── install-sh -> /usr/share/automake-1.16/install-sh
    ├── Makefile.am
    ├── Makefile.in
    ├── missing -> /usr/share/automake-1.16/missing
    └── src
        ├── main.c
        └── math.c
    3 directories, 19 files
    (6)生成Makefile執(zhí)行 configure 腳本文件,它根據(jù) Makefile.in 文件,生成最終的 Makefile 文件。
    [root@localhost myproject]# ./configure
    checking for a BSD-compatible install... /usr/bin/install -c
    checking whether build environment is sane... yes
    checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
    checking for gawk... gawk
    checking whether make sets $(MAKE)... yes
    checking whether make supports nested variables... yes
    checking for gcc... gcc
    checking whether the C compiler works... yes
    checking for C compiler default output file name... a.out
    checking for suffix of executables...
    checking whether we are cross compiling... no
    checking for suffix of object files... o
    checking whether we are using the GNU C compiler... yes
    checking whether gcc accepts -g... yes
    checking for gcc option to accept ISO C89... none needed
    checking whether gcc understands -c and -o together... yes
    checking whether make supports the include directive... yes (GNU style)
    checking dependency style of gcc... gcc3
    checking that generated files are newer than configure... done
    configure: creating ./config.status
    config.status: creating Makefile
    config.status: creating config.h
    config.status: executing depfiles commands
    [root@localhost myproject]# tree
    .
    ├── aclocal.m4
    ├── autom4te.cache
    │   ├── output.0
    │   ├── output.1
    │   ├── requests
    │   ├── traces.0
    │   └── traces.1
    ├── autoscan.log
    ├── compile -> /usr/share/automake-1.16/compile
    ├── config.h
    ├── config.h.in
    ├── config.log
    ├── config.status
    ├── configure
    ├── configure.ac
    ├── depcomp -> /usr/share/automake-1.16/depcomp
    ├── include
    │   └── math.h
    ├── install-sh -> /usr/share/automake-1.16/install-sh
    ├── Makefile
    ├── Makefile.am
    ├── Makefile.in
    ├── missing -> /usr/share/automake-1.16/missing
    ├── src
    │   ├── main.c
    │   └── math.c
    └── stamp-h1
    3 directories, 24 files
    (7)make編譯工程生成 Makefile 之后,執(zhí)行make編譯工程并且生成可執(zhí)行程序。
    [root@localhost myproject]# make
    make  all-am
    make[1]: Entering directory '/tmp/myproject'
    gcc -DHAVE_CONFIG_H -I.     -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o `test -f 'src/main.c' || echo './'`src/main.c
    mv -f .deps/main.Tpo .deps/main.Po
    gcc -DHAVE_CONFIG_H -I.     -g -O2 -MT math.o -MD -MP -MF .deps/math.Tpo -c -o math.o `test -f 'src/math.c' || echo './'`src/math.c
    mv -f .deps/math.Tpo .deps/math.Po
    gcc  -g -O2   -o main main.o math.o
    make[1]: Leaving directory '/tmp/myproject'
    [root@localhost myproject]#
    [root@localhost myproject]# ls -l
    total 352
    -rw-r--r-- 1 root root  41888 Jul 28 13:21 aclocal.m4
    drwxr-xr-x 2 root root     86 Jul 28 13:42 autom4te.cache
    -rw-r--r-- 1 root root      0 Jul 28 13:05 autoscan.log
    lrwxrwxrwx 1 root root     32 Jul 28 13:42 compile -> /usr/share/automake-1.16/compile
    -rw-r--r-- 1 root root    761 Jul 28 13:44 config.h
    -rw-r--r-- 1 root root    625 Jul 28 13:27 config.h.in
    -rw-r--r-- 1 root root   9015 Jul 28 13:44 config.log
    -rwxr-xr-x 1 root root  32345 Jul 28 13:44 config.status
    -rwxr-xr-x 1 root root 145845 Jul 28 13:24 configure
    -rw-r--r-- 1 root root    671 Jul 28 13:21 configure.ac
    lrwxrwxrwx 1 root root     32 Jul 28 13:42 depcomp -> /usr/share/automake-1.16/depcomp
    drwxr-xr-x 2 root root     20 Jul 28 10:59 include
    lrwxrwxrwx 1 root root     35 Jul 28 13:42 install-sh -> /usr/share/automake-1.16/install-sh
    -rwxr-xr-x 1 root root  21416 Jul 28 13:46 main
    -rw-r--r-- 1 root root   6672 Jul 28 13:46 main.o
    -rw-r--r-- 1 root root  28783 Jul 28 13:44 Makefile
    -rw-r--r-- 1 root root    109 Jul 28 13:38 Makefile.am
    -rw-r--r-- 1 root root  29860 Jul 28 13:42 Makefile.in
    -rw-r--r-- 1 root root   2784 Jul 28 13:46 math.o
    lrwxrwxrwx 1 root root     32 Jul 28 13:42 missing -> /usr/share/automake-1.16/missing
    drwxr-xr-x 2 root root     34 Jul 28 11:17 src
    -rw-r--r-- 1 root root     23 Jul 28 13:44 stamp-h1
    (8)運(yùn)行驗(yàn)證運(yùn)行生成的main可執(zhí)行程序,執(zhí)行成功,結(jié)果如下:
    [root@localhost myproject]# ./main
    max=20
    min=10
    2、編譯可執(zhí)行程序(依賴靜態(tài)庫文件)上一節(jié)中所有源文件都在同一個(gè)目錄下,但在比較大的項(xiàng)目中,很少將所有文件放在一個(gè)目錄下的。下面將針對(duì)這種情況做個(gè)簡單介紹。
    多級(jí)目錄結(jié)構(gòu)的軟件,一般是單個(gè)程序、庫文件或模塊放在各自的目錄中。automake要求每個(gè)目錄都有自己的Makefile.am文件來編譯各自目錄 下的代碼。在頂級(jí)的目錄中,有一個(gè)Makefile.am文件,該文件通過SUBDIRS指明了這個(gè)目錄下有多少個(gè)直接下級(jí)目錄的代碼需要編譯。下級(jí)目錄的Makefile.am也指明自己需要編譯的下級(jí)目錄。通過這樣的層層遞歸,從而完成多級(jí)目錄結(jié)構(gòu)的編譯。
    本節(jié)使用上述創(chuàng)建的C源文件及相關(guān)目錄,并新建lib 目錄,查看各目錄下的結(jié)構(gòu):
    [root@localhost myproject]# mkdir lib
    [root@localhost myproject]# tree
    .
    ├── include
    │   └── math.h
    ├── lib
    │   └── math.c
    └── src
        └── main.c
    3 directories, 3 files
    (1)生成configure.scan在項(xiàng)目頂級(jí)目錄執(zhí)行autoscan命令生成configure.scan文件,執(zhí)行命令后項(xiàng)目目錄內(nèi)生成如下文件:
    [root@localhost myproject]# ls
    autoscan.log  configure.scan  include  lib  src
    (2)修改configure.ac將生成的configure.scan文件改名成configure.ac (早期使用configure.in現(xiàn)在常用configure.ac),查看configure.ac內(nèi)容如下:
    [root@localhost myproject]# mv configure.scan configure.ac
    [root@localhost myproject]# cat 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_CONFIG_SRCDIR([src/main.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_OUTPUT
    修改configure.ac文件內(nèi)容如下:
    [root@localhost myproject]# vi configure.ac
    [root@localhost myproject]# cat 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(main, 1.0, linux106587@126.com)
    AC_CONFIG_SRCDIR([src/main.c])
    AC_CONFIG_HEADERS([config.h])
    AM_INIT_AUTOMAKE(main, 1.0)
    AC_PROG_RANLIB               #使用了靜態(tài)庫編譯,需要此宏的定義
    # 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_OUTPUT(Makefile src/Makefile lib/Makefile)
    (3)生成 configure然后執(zhí)行命令aclocal和autoconf,分別會(huì)產(chǎn)生aclocal.m4及configure兩個(gè)文件:
    [root@localhost myproject]# ls
    aclocal.m4  autom4te.cache  autoscan.log  configure.ac  include  lib  src
    [root@localhost myproject]# ls
    aclocal.m4  autom4te.cache  autoscan.log  configure  configure.ac  include  lib  src
    (4)生成config.h.in執(zhí)行 autoheader,生成config.h.in宏定義文件。
    [root@localhost myproject]# ls
    aclocal.m4  autom4te.cache  autoscan.log  config.h.in  configure  configure.ac  include  lib  src
    (5)創(chuàng)建 Makefile.am頂級(jí)目錄下創(chuàng)建Makefile.am并編輯內(nèi)容如下:
    [root@localhost myproject]# vi Makefile.am
    [root@localhost myproject]# cat Makefile.am
    AUTOMAKE_OPTIONS=foreign
    SUBDIRS= lib src #表示本目錄的直接下級(jí)目錄需要編譯
    #注意:順序不能反,按照調(diào)用順序來寫。
    src目錄下創(chuàng)建Makefile.am文件
    [root@localhost src]# cat Makefile.am
    AUTOMAKE_OPTIONS=foreign
    bin_PROGRAMS=main #本目錄的文件編譯成可執(zhí)行文件main
    main_SOURCES=main.c
    main_LDADD=$(top_srcdir)/lib/libmath.a
    INCLUDES=-I$(top_srcdir)/include/
  • main_LDADD 指定main 程序需要的庫文件
  • INCLUDES 指定需要的頭文件
    lib目錄下創(chuàng)建Makefile.am文件
    [root@localhost lib]# cat Makefile.am
    AUTOMAKE_OPTIONS=foreign
    noinst_LIBRARIES=libmath.a
    libmath_a_SOURCES=math.c
    INCLUDES=-I$(top_srcdir)/include/
    (6)生成Makefile.in[root@localhost myproject]# automake --add-missing
    configure.ac:9: warning: AM_INIT_AUTOMAKE: two- and three-arguments forms are deprecated.  For more info, see:
    configure.ac:9: https://www.gnu.org/software/automake/manual/automake.html#Modernize-AM_005fINIT_005fAUTOMAKE-invocation
    configure.ac:13: installing './compile'
    configure.ac:9: installing './install-sh'
    configure.ac:9: installing './missing'
    lib/Makefile.am:7: warning: 'INCLUDES' is the old name for 'AM_CPPFLAGS' (or '*_CPPFLAGS')
    lib/Makefile.am: installing './depcomp'
    src/Makefile.am:9: warning: 'INCLUDES' is the old name for 'AM_CPPFLAGS' (or '*_CPPFLAGS')
    [root@localhost myproject]#
    [root@localhost myproject]# ls
    aclocal.m4      autoscan.log  config.h.in  configure.ac  include     lib          Makefile.in  src
    autom4te.cache  compile       configure    depcomp       install-sh  Makefile.am  missing
    (7)生成Makefile[root@localhost myproject]# ./configure
    checking for a BSD-compatible install... /usr/bin/install -c
    checking whether build environment is sane... yes
    checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
    checking for gawk... gawk
    checking whether make sets $(MAKE)... yes
    checking whether make supports nested variables... yes
    checking for ranlib... ranlib
    checking for gcc... gcc
    checking whether the C compiler works... yes
    checking for C compiler default output file name... a.out
    checking for suffix of executables...
    checking whether we are cross compiling... no
    checking for suffix of object files... o
    checking whether we are using the GNU C compiler... yes
    checking whether gcc accepts -g... yes
    checking for gcc option to accept ISO C89... none needed
    checking whether gcc understands -c and -o together... yes
    checking whether make supports the include directive... yes (GNU style)
    checking dependency style of gcc... gcc3
    checking that generated files are newer than configure... done
    configure: creating ./config.status
    config.status: creating Makefile
    config.status: creating src/Makefile
    config.status: creating lib/Makefile
    config.status: creating config.h
    config.status: executing depfiles commands
    [root@localhost myproject]# ls
    aclocal.m4      autoscan.log  config.h     config.log     configure     depcomp  install-sh  Makefile     Makefile.in  src
    autom4te.cache  compile       config.h.in  config.status  configure.ac  include  lib         Makefile.am  missing      stamp-h1
    (8)編譯運(yùn)行[root@localhost myproject]# make
    make  all-recursive
    make[1]: Entering directory '/tmp/myproject'
    Making all in lib
    make[2]: Entering directory '/tmp/myproject/lib'
    gcc -DHAVE_CONFIG_H -I. -I.. -I../include/    -g -O2 -MT math.o -MD -MP -MF .deps/math.Tpo -c -o math.o math.c
    mv -f .deps/math.Tpo .deps/math.Po
    rm -f libmath.a
    ar cru libmath.a math.o
    ranlib libmath.a
    make[2]: Leaving directory '/tmp/myproject/lib'
    Making all in src
    make[2]: Entering directory '/tmp/myproject/src'
    gcc -DHAVE_CONFIG_H -I. -I.. -I../include/    -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.c
    mv -f .deps/main.Tpo .deps/main.Po
    gcc  -g -O2   -o main main.o ../lib/libmath.a
    make[2]: Leaving directory '/tmp/myproject/src'
    make[2]: Entering directory '/tmp/myproject'
    make[2]: Leaving directory '/tmp/myproject'
    make[1]: Leaving directory '/tmp/myproject'
    [root@localhost myproject]# tree
    .
    ├── aclocal.m4
    ├── autom4te.cache
    │   ├── output.0
    │   ├── output.1
    │   ├── requests
    │   ├── traces.0
    │   └── traces.1
    ├── autoscan.log
    ├── compile -> /usr/share/automake-1.16/compile
    ├── config.h
    ├── config.h.in
    ├── config.log
    ├── config.status
    ├── configure
    ├── configure.ac
    ├── depcomp -> /usr/share/automake-1.16/depcomp
    ├── include
    │   └── math.h
    ├── install-sh -> /usr/share/automake-1.16/install-sh
    ├── lib
    │   ├── libmath.a
    │   ├── Makefile
    │   ├── Makefile.am
    │   ├── Makefile.in
    │   ├── math.c
    │   └── math.o
    ├── Makefile
    ├── Makefile.am
    ├── Makefile.in
    ├── missing -> /usr/share/automake-1.16/missing
    ├── src
    │   ├── main
    │   ├── main.c
    │   ├── main.o
    │   ├── Makefile
    │   ├── Makefile.am
    │   └── Makefile.in
    └── stamp-h1
    4 directories, 34 files
    [root@localhost src]# ./main
    max=20
    min=10
    [root@localhost myproject]# make install
    Making install in lib
    make[1]: Entering directory '/tmp/myproject/lib'
    make[2]: Entering directory '/tmp/myproject/lib'
    make[2]: Nothing to be done for 'install-exec-am'.
    make[2]: Nothing to be done for 'install-data-am'.
    make[2]: Leaving directory '/tmp/myproject/lib'
    make[1]: Leaving directory '/tmp/myproject/lib'
    Making install in src
    make[1]: Entering directory '/tmp/myproject/src'
    make[2]: Entering directory '/tmp/myproject/src'
    /usr/bin/mkdir -p '/usr/local/bin'
      /usr/bin/install -c main '/usr/local/bin'
    make[2]: Nothing to be done for 'install-data-am'.
    make[2]: Leaving directory '/tmp/myproject/src'
    make[1]: Leaving directory '/tmp/myproject/src'
    make[1]: Entering directory '/tmp/myproject'
    make[2]: Entering directory '/tmp/myproject'
    make[2]: Nothing to be done for 'install-exec-am'.
    make[2]: Nothing to be done for 'install-data-am'.
    make[2]: Leaving directory '/tmp/myproject'
    make[1]: Leaving directory '/tmp/myproject'
    [root@localhost myproject]# which main
    /usr/local/bin/main
    [root@localhost ~]# main
    max=20
    min=10
    3、編譯可執(zhí)行程序(依賴動(dòng)態(tài)庫文件)本節(jié)使用上述創(chuàng)建的C源文件并新創(chuàng)建相關(guān)目錄,查看各目錄下的結(jié)構(gòu)。
    [root@localhost 85]# tree
    .
    ├── include
    │   └── math.h
    ├── lib
    │   └── math.c
    └── src
        └── main.c
    3 directories, 3 files
    (1)生成configure.scan在項(xiàng)目頂級(jí)目錄執(zhí)行autoscan命令生成configure.scan文件,執(zhí)行命令后項(xiàng)目目錄內(nèi)生成如下文件:
    [root@localhost 85]# autoscan
    [root@localhost 85]# ls
    autoscan.log  configure.scan  include  lib  src
    (2)修改configure.ac將生成的configure.scan文件改名成configure.ac (早期使用configure.in現(xiàn)在常用configure.ac), 修改configure.ac文件內(nèi)容如下:
    [root@localhost 85]# mv configure.scan configure.ac
    [root@localhost 85]# vi configure.ac
    [root@localhost 85]# cat 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(main, 1.0, linux106587@126.com)
    AC_CONFIG_SRCDIR([src/main.c])
    AC_CONFIG_HEADERS([config.h])
    AM_INIT_AUTOMAKE(main, 1.0)
    AC_PROG_LIBTOOL               #使用了動(dòng)態(tài)庫編譯,需要此宏的定義
    # 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_OUTPUT(Makefile src/Makefile lib/Makefile)
    (3)生成 configure然后執(zhí)行命令aclocal、autoheader 和autoconf,分別會(huì)產(chǎn)生aclocal.m4、config.h.in及configure等文件:
    [root@localhost 85]# aclocal
    [root@localhost 85]# ls
    aclocal.m4  autom4te.cache  autoscan.log  configure.ac  include  lib  src
    [root@localhost 85]# autoheader
    [root@localhost 85]# ls -l
    total 376
    -rw-r--r-- 1 root root 372261 Aug  5 04:17 aclocal.m4
    drwxr-xr-x 2 root root     86 Aug  5 04:18 autom4te.cache
    -rw-r--r-- 1 root root      0 Aug  5 04:15 autoscan.log
    -rw-r--r-- 1 root root   1611 Aug  5 04:18 config.h.in
    -rw-r--r-- 1 root root    656 Aug  5 04:17 configure.ac
    drwxr-xr-x 2 root root     20 Aug  5 04:02 include
    drwxr-xr-x 3 root root     52 Aug  5 04:14 lib
    drwxr-xr-x 3 root root     52 Aug  5 04:15 src
    [root@localhost 85]#
    [root@localhost 85]# autoconf
    [root@localhost 85]# ls -l
    total 812
    -rw-r--r-- 1 root root 372261 Aug  5 04:17 aclocal.m4
    drwxr-xr-x 2 root root     86 Aug  5 04:18 autom4te.cache
    -rw-r--r-- 1 root root      0 Aug  5 04:15 autoscan.log
    -rw-r--r-- 1 root root   1611 Aug  5 04:18 config.h.in
    -rwxr-xr-x 1 root root 446104 Aug  5 04:18 configure
    -rw-r--r-- 1 root root    656 Aug  5 04:17 configure.ac
    drwxr-xr-x 2 root root     20 Aug  5 04:02 include
    drwxr-xr-x 3 root root     52 Aug  5 04:14 lib
    drwxr-xr-x 3 root root     52 Aug  5 04:15 src
    (4)libtoolize配置執(zhí)行l(wèi)ibtoolize -f -c命令,使用共享庫必須要執(zhí)行。
    [root@localhost 85]# libtoolize -f -c
    libtoolize: putting auxiliary files in '.'.
    libtoolize: copying file './ltmain.sh'
    libtoolize: Consider adding 'AC_CONFIG_MACRO_DIRS([m4])' to configure.ac,
    libtoolize: and rerunning libtoolize and aclocal.
    libtoolize: Consider adding '-I m4' to ACLOCAL_AMFLAGS in Makefile.am.
    (5)創(chuàng)建 Makefile.am頂級(jí)目錄下創(chuàng)建Makefile.am并編輯內(nèi)容如下:
    [root@localhost 85]# vi Makefile.am
    [root@localhost 85]# cat Makefile.am
    AUTOMAKE_OPTIONS=foreign
    SUBDIRS=lib src #表示本目錄的直接下級(jí)目錄需要編譯
    #注意:順序不能反,按照調(diào)用順序來寫。
    src目錄下創(chuàng)建Makefile.am文件
    [root@localhost src]# cat Makefile.am
    AUTOMAKE_OPTIONS=foreign
    bin_PROGRAMS=main #本目錄的文件編譯成可執(zhí)行文件main
    main_SOURCES=main.c
    main_LDADD=$(top_srcdir)/lib/libmath.la
    INCLUDES=-I$(top_srcdir)/include/
  • main_LDADD 指定main 程序需要的庫文件
  • INCLUDES 指定需要的頭文件
    lib目錄下創(chuàng)建Makefile.am文件
    [root@localhost lib]# cat Makefile.am
    AUTOMAKE_OPTIONS=foreign
    lib_LTLIBRARIES=libmath.la
    libmath_la_SOURCES=math.c
    INCLUDES=-I$(top_srcdir)/include/
    (6)生成Makefile.in[root@localhost 85]# automake --add-missing
    configure.ac:9: warning: AM_INIT_AUTOMAKE: two- and three-arguments forms are deprecated.  For more info, see:
    configure.ac:9: https://www.gnu.org/software/automake/manual/automake.html#Modernize-AM_005fINIT_005fAUTOMAKE-invocation
    configure.ac:10: installing './compile'
    configure.ac:10: installing './config.guess'
    configure.ac:10: installing './config.sub'
    configure.ac:9: installing './install-sh'
    configure.ac:9: installing './missing'
    lib/Makefile.am:7: warning: 'INCLUDES' is the old name for 'AM_CPPFLAGS' (or '*_CPPFLAGS')
    lib/Makefile.am: installing './depcomp'
    src/Makefile.am:9: warning: 'INCLUDES' is the old name for 'AM_CPPFLAGS' (or '*_CPPFLAGS')
    (7)生成Makefile[root@localhost 85]# ./configure
    checking for a BSD-compatible install... /usr/bin/install -c
    checking whether build environment is sane... yes
    checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
    checking for gawk... gawk
    checking whether make sets $(MAKE)... yes
    checking whether make supports nested variables... yes
    checking build system type... x86_64-pc-linux-gnu
    checking host system type... x86_64-pc-linux-gnu
    checking how to print strings... printf
    checking whether make supports the include directive... yes (GNU style)
    checking for gcc... gcc
    checking whether the C compiler works... yes
    checking for C compiler default output file name... a.out
    checking for suffix of executables...
    checking whether we are cross compiling... no
    checking for suffix of object files... o
    checking whether we are using the GNU C compiler... yes
    checking whether gcc accepts -g... yes
    checking for gcc option to accept ISO C89... none needed
    checking whether gcc understands -c and -o together... yes
    checking dependency style of gcc... gcc3
    checking for a sed that does not truncate output... /usr/bin/sed
    checking for grep that handles long lines and -e... /usr/bin/grep
    checking for egrep... /usr/bin/grep -E
    checking for fgrep... /usr/bin/grep -F
    checking for ld used by gcc... /usr/bin/ld
    checking if the linker (/usr/bin/ld) is GNU ld... yes
    checking for BSD- or MS-compatible name lister (nm)... /usr/bin/nm -B
    checking the name lister (/usr/bin/nm -B) interface... BSD nm
    checking whether ln -s works... yes
    checking the maximum length of command line arguments... 1572864
    checking how to convert x86_64-pc-linux-gnu file names to x86_64-pc-linux-gnu format... func_convert_file_noop
    checking how to convert x86_64-pc-linux-gnu file names to toolchain format... func_convert_file_noop
    checking for /usr/bin/ld option to reload object files... -r
    checking for objdump... objdump
    checking how to recognize dependent libraries... pass_all
    checking for dlltool... no
    checking how to associate runtime and link libraries... printf %s
    checking for ar... ar
    checking for archiver @FILE support... @
    checking for strip... strip
    checking for ranlib... ranlib
    checking command to parse /usr/bin/nm -B output from gcc object... ok
    checking for sysroot... no
    checking for a working dd... /usr/bin/dd
    checking how to truncate binary pipes... /usr/bin/dd bs=4096 count=1
    checking for mt... no
    checking if : is a manifest tool... no
    checking how to run the C preprocessor... gcc -E
    checking for ANSI C header files... yes
    checking for sys/types.h... yes
    checking for sys/stat.h... yes
    checking for stdlib.h... yes
    checking for string.h... yes
    checking for memory.h... yes
    checking for strings.h... yes
    checking for inttypes.h... yes
    checking for stdint.h... yes
    checking for unistd.h... yes
    checking for dlfcn.h... yes
    checking for objdir... .libs
    checking if gcc supports -fno-rtti -fno-exceptions... no
    checking for gcc option to produce PIC... -fPIC -DPIC
    checking if gcc PIC flag -fPIC -DPIC works... yes
    checking if gcc static flag -static works... no
    checking if gcc supports -c -o file.o... yes
    checking if gcc supports -c -o file.o... (cached) yes
    checking whether the gcc linker (/usr/bin/ld -m elf_x86_64) supports shared libraries... yes
    checking whether -lc should be explicitly linked in... no
    checking dynamic linker characteristics... GNU/Linux ld.so
    checking how to hardcode library paths into programs... immediate
    checking whether stripping libraries is possible... yes
    checking if libtool supports shared libraries... yes
    checking whether to build shared libraries... yes
    checking whether to build static libraries... yes
    checking for gcc... (cached) gcc
    checking whether we are using the GNU C compiler... (cached) yes
    checking whether gcc accepts -g... (cached) yes
    checking for gcc option to accept ISO C89... (cached) none needed
    checking whether gcc understands -c and -o together... (cached) yes
    checking dependency style of gcc... (cached) gcc3
    checking that generated files are newer than configure... done
    configure: creating ./config.status
    config.status: creating Makefile
    config.status: creating src/Makefile
    config.status: creating lib/Makefile
    config.status: creating config.h
    config.status: executing depfiles commands
    config.status: executing libtool commands
    [root@localhost 85]#
    [root@nj-localhost]# ls -l
    total 1728
    -rw-r--r-- 1 root root 372261 Aug  5 04:17 aclocal.m4
    drwxr-xr-x 2 root root     86 Aug  5 04:19 autom4te.cache
    -rw-r--r-- 1 root root      0 Aug  5 04:15 autoscan.log
    lrwxrwxrwx 1 root root     32 Aug  5 04:19 compile -> /usr/share/automake-1.16/compile
    lrwxrwxrwx 1 root root     37 Aug  5 04:19 config.guess -> /usr/share/automake-1.16/config.guess
    -rw-r--r-- 1 root root   1790 Aug  5 04:19 config.h
    -rw-r--r-- 1 root root   1611 Aug  5 04:18 config.h.in
    -rw-r--r-- 1 root root  23404 Aug  5 04:19 config.log
    -rwxr-xr-x 1 root root  57443 Aug  5 04:19 config.status
    lrwxrwxrwx 1 root root     35 Aug  5 04:19 config.sub -> /usr/share/automake-1.16/config.sub
    -rwxr-xr-x 1 root root 446104 Aug  5 04:18 configure
    -rw-r--r-- 1 root root    656 Aug  5 04:17 configure.ac
    lrwxrwxrwx 1 root root     32 Aug  5 04:19 depcomp -> /usr/share/automake-1.16/depcomp
    drwxr-xr-x 2 root root     20 Aug  5 04:02 include
    lrwxrwxrwx 1 root root     35 Aug  5 04:19 install-sh -> /usr/share/automake-1.16/install-sh
    drwxr-xr-x 3 root root     87 Aug  5 04:19 lib
    -rwxr-xr-x 1 root root 339146 Aug  5 04:19 libtool
    -rw-r--r-- 1 root root 324152 Aug  5 04:18 ltmain.sh
    -rw-r--r-- 1 root root  25193 Aug  5 04:19 Makefile
    -rw-r--r-- 1 root root    150 Aug  5 04:15 Makefile.am
    -rw-r--r-- 1 root root  25308 Aug  5 04:19 Makefile.in
    lrwxrwxrwx 1 root root     32 Aug  5 04:19 missing -> /usr/share/automake-1.16/missing
    drwxr-xr-x 3 root root     87 Aug  5 04:19 src
    -rw-r--r-- 1 root root     23 Aug  5 04:19 stamp-h1
    (8)編譯安裝[root@localhost 85]# make
    make  all-recursive
    make[1]: Entering directory '/tmp/85'
    Making all in lib
    make[2]: Entering directory '/tmp/85/lib'
    /bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include/    -g -O2 -MT math.lo -MD -MP -MF .deps/math.Tpo -c -o math.lo math.c
    libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include/ -g -O2 -MT math.lo -MD -MP -MF .deps/math.Tpo -c math.c  -fPIC -DPIC -o .libs/math.o
    libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include/ -g -O2 -MT math.lo -MD -MP -MF .deps/math.Tpo -c math.c -o math.o >/dev/null 2>&1
    mv -f .deps/math.Tpo .deps/math.Plo
    /bin/sh ../libtool  --tag=CC   --mode=link gcc  -g -O2   -o libmath.la -rpath /usr/local/lib math.lo
    libtool: link: gcc -shared  -fPIC -DPIC  .libs/math.o    -g -O2   -Wl,-soname -Wl,libmath.so.0 -o .libs/libmath.so.0.0.0
    libtool: link: (cd ".libs" && rm -f "libmath.so.0" && ln -s "libmath.so.0.0.0" "libmath.so.0")
    libtool: link: (cd ".libs" && rm -f "libmath.so" && ln -s "libmath.so.0.0.0" "libmath.so")
    libtool: link: ar cru .libs/libmath.a  math.o
    libtool: link: ranlib .libs/libmath.a
    libtool: link: ( cd ".libs" && rm -f "libmath.la" && ln -s "../libmath.la" "libmath.la" )
    make[2]: Leaving directory '/tmp/85/lib'
    Making all in src
    make[2]: Entering directory '/tmp/85/src'
    gcc -DHAVE_CONFIG_H -I. -I.. -I../include/    -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.c
    mv -f .deps/main.Tpo .deps/main.Po
    /bin/sh ../libtool  --tag=CC   --mode=link gcc  -g -O2   -o main main.o ../lib/libmath.la
    libtool: link: gcc -g -O2 -o .libs/main main.o  ../lib/.libs/libmath.so -Wl,-rpath -Wl,/usr/local/lib
    make[2]: Leaving directory '/tmp/85/src'
    make[2]: Entering directory '/tmp/85'
    make[2]: Leaving directory '/tmp/85'
    make[1]: Leaving directory '/tmp/85'
    [root@localhost 85]#
    [root@localhost 85]# tree
    .
    ├── aclocal.m4
    ├── autom4te.cache
    │   ├── output.0
    │   ├── output.1
    │   ├── requests
    │   ├── traces.0
    │   └── traces.1
    ├── autoscan.log
    ├── compile -> /usr/share/automake-1.16/compile
    ├── config.guess -> /usr/share/automake-1.16/config.guess
    ├── config.h
    ├── config.h.in
    ├── config.log
    ├── config.status
    ├── config.sub -> /usr/share/automake-1.16/config.sub
    ├── configure
    ├── configure.ac
    ├── depcomp -> /usr/share/automake-1.16/depcomp
    ├── include
    │   └── math.h
    ├── install-sh -> /usr/share/automake-1.16/install-sh
    ├── lib
    │   ├── libmath.la
    │   ├── Makefile
    │   ├── Makefile.am
    │   ├── Makefile.in
    │   ├── math.c
    │   ├── math.lo
    │   └── math.o
    ├── libtool
    ├── ltmain.sh
    ├── Makefile
    ├── Makefile.am
    ├── Makefile.in
    ├── missing -> /usr/share/automake-1.16/missing
    ├── src
    │   ├── main
    │   ├── main.c
    │   ├── main.o
    │   ├── Makefile
    │   ├── Makefile.am
    │   └── Makefile.in
    └── stamp-h1
    4 directories, 39 files
    [root@localhost src]# ./main
    max=20
    min=10
    [root@localhost 85]# make install
    Making install in lib
    make[1]: Entering directory '/tmp/85/lib'
    make[2]: Entering directory '/tmp/85/lib'
    /usr/bin/mkdir -p '/usr/local/lib'
    /bin/sh ../libtool   --mode=install /usr/bin/install -c   libmath.la '/usr/local/lib'
    libtool: install: /usr/bin/install -c .libs/libmath.so.0.0.0 /usr/local/lib/libmath.so.0.0.0
    libtool: install: (cd /usr/local/lib && { ln -s -f libmath.so.0.0.0 libmath.so.0 || { rm -f libmath.so.0 && ln -s libmath.so.0.0.0 libmath.so.0; }; })
    libtool: install: (cd /usr/local/lib && { ln -s -f libmath.so.0.0.0 libmath.so || { rm -f libmath.so && ln -s libmath.so.0.0.0 libmath.so; }; })
    libtool: install: /usr/bin/install -c .libs/libmath.lai /usr/local/lib/libmath.la
    libtool: install: /usr/bin/install -c .libs/libmath.a /usr/local/lib/libmath.a
    libtool: install: chmod 644 /usr/local/lib/libmath.a
    libtool: install: ranlib /usr/local/lib/libmath.a
    libtool: finish: PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/netronome/bin:/root/bin:/sbin" ldconfig -n /usr/local/lib
    ----------------------------------------------------------------------
    Libraries have been installed in:
       /usr/local/lib
    If you ever happen to want to link against installed libraries
    in a given directory, LIBDIR, you must either use libtool, and
    specify the full pathname of the library, or use the '-LLIBDIR'
    flag during linking and do at least one of the following:
       - add LIBDIR to the 'LD_LIBRARY_PATH' environment variable
         during execution
       - add LIBDIR to the 'LD_RUN_PATH' environment variable
         during linking
       - use the '-Wl,-rpath -Wl,LIBDIR' linker flag
       - have your system administrator add LIBDIR to '/etc/ld.so.conf'
    See any operating system documentation about shared libraries for
    more information, such as the ld(1) and ld.so(8) manual pages.
    ----------------------------------------------------------------------
    make[2]: Nothing to be done for 'install-data-am'.
    make[2]: Leaving directory '/tmp/85/lib'
    make[1]: Leaving directory '/tmp/85/lib'
    Making install in src
    make[1]: Entering directory '/tmp/85/src'
    make[2]: Entering directory '/tmp/85/src'
    /usr/bin/mkdir -p '/usr/local/bin'
      /bin/sh ../libtool   --mode=install /usr/bin/install -c main '/usr/local/bin'
    libtool: install: /usr/bin/install -c .libs/main /usr/local/bin/main
    make[2]: Nothing to be done for 'install-data-am'.
    make[2]: Leaving directory '/tmp/85/src'
    make[1]: Leaving directory '/tmp/85/src'
    make[1]: Entering directory '/tmp/85'
    make[2]: Entering directory '/tmp/85'
    make[2]: Nothing to be done for 'install-exec-am'.
    make[2]: Nothing to be done for 'install-data-am'.
    make[2]: Leaving directory '/tmp/85'
    make[1]: Leaving directory '/tmp/85'
    [root@localhost 85]#
    [root@localhost 85]# which main
    /usr/local/bin/main
    [root@localhost 85]# ls -l /usr/local/bin/main
    -rwxr-xr-x 1 root root 20968 Aug  5 10:33 /usr/local/bin/main
    [root@localhost 85]# ls -l /usr/local/lib/ | grep libmath.la
    -rwxr-xr-x 1 root root      916 Aug  5 10:33 libmath.la
    如果沒有指定安裝路徑,make install 會(huì)將可執(zhí)行程序以及庫文件安裝到默認(rèn)路徑下,可執(zhí)行文件默認(rèn)放在/usr/local/bin/,庫文件默認(rèn)放在/usr/local/lib,配置文件默認(rèn)放在/usr/local/etc,其它的資源文件放在/usr/local/share,比較分散。如果不想安裝在默認(rèn)路徑,而想自行指定安裝路徑,則可以通過執(zhí)行configure 時(shí)指定--prefix,這里--prefix選項(xiàng)表示配置安裝的路徑。為了便于集中管理某個(gè)軟件的各種文件,可以配置如:./configure --prefix=/usr/local,則會(huì)把所有資源文件放在/usr/local的路徑中,就不會(huì)分散了。
    [root@localhost 85]# make clean
    Making clean in lib
    make[1]: Entering directory '/tmp/85/lib'
    test -z "libmath.la" || rm -f libmath.la
    rm -f ./so_locations
    rm -rf .libs _libs
    rm -f *.o
    rm -f *.lo
    make[1]: Leaving directory '/tmp/85/lib'
    Making clean in src
    make[1]: Entering directory '/tmp/85/src'
    rm -f main
    rm -rf .libs _libs
    rm -f *.o
    rm -f *.lo
    make[1]: Leaving directory '/tmp/85/src'
    make[1]: Entering directory '/tmp/85'
    rm -rf .libs _libs
    rm -f *.lo
    make[1]: Leaving directory '/tmp/85'
    [root@localhost 85]# tree
    .
    ├── aclocal.m4
    ├── autom4te.cache
    │   ├── output.0
    │   ├── output.1
    │   ├── requests
    │   ├── traces.0
    │   └── traces.1
    ├── autoscan.log
    ├── compile -> /usr/share/automake-1.16/compile
    ├── config.guess -> /usr/share/automake-1.16/config.guess
    ├── config.h
    ├── config.h.in
    ├── config.log
    ├── config.status
    ├── config.sub -> /usr/share/automake-1.16/config.sub
    ├── configure
    ├── configure.ac
    ├── depcomp -> /usr/share/automake-1.16/depcomp
    ├── include
    │   └── math.h
    ├── install-sh -> /usr/share/automake-1.16/install-sh
    ├── lib
    │   ├── Makefile
    │   ├── Makefile.am
    │   ├── Makefile.in
    │   └── math.c
    ├── libtool
    ├── ltmain.sh
    ├── Makefile
    ├── Makefile.am
    ├── Makefile.in
    ├── missing -> /usr/share/automake-1.16/missing
    ├── src
    │   ├── main.c
    │   ├── Makefile
    │   ├── Makefile.am
    │   └── Makefile.in
    └── stamp-h1
    4 directories, 34 files
    [root@localhost 85]# ./configure --prefix=$PWD/_install
    checking for a BSD-compatible install... /usr/bin/install -c
    checking whether build environment is sane... yes
    checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
    checking for gawk... gawk
    checking whether make sets $(MAKE)... yes
    checking whether make supports nested variables... yes
    checking build system type... x86_64-pc-linux-gnu
    checking host system type... x86_64-pc-linux-gnu
    checking how to print strings... printf
    checking whether make supports the include directive... yes (GNU style)
    checking for gcc... gcc
    checking whether the C compiler works... yes
    checking for C compiler default output file name... a.out
    checking for suffix of executables...
    checking whether we are cross compiling... no
    checking for suffix of object files... o
    checking whether we are using the GNU C compiler... yes
    checking whether gcc accepts -g... yes
    checking for gcc option to accept ISO C89... none needed
    checking whether gcc understands -c and -o together... yes
    checking dependency style of gcc... gcc3
    checking for a sed that does not truncate output... /usr/bin/sed
    checking for grep that handles long lines and -e... /usr/bin/grep
    checking for egrep... /usr/bin/grep -E
    checking for fgrep... /usr/bin/grep -F
    checking for ld used by gcc... /usr/bin/ld
    checking if the linker (/usr/bin/ld) is GNU ld... yes
    checking for BSD- or MS-compatible name lister (nm)... /usr/bin/nm -B
    checking the name lister (/usr/bin/nm -B) interface... BSD nm
    checking whether ln -s works... yes
    checking the maximum length of command line arguments... 1572864
    checking how to convert x86_64-pc-linux-gnu file names to x86_64-pc-linux-gnu format... func_convert_file_noop
    checking how to convert x86_64-pc-linux-gnu file names to toolchain format... func_convert_file_noop
    checking for /usr/bin/ld option to reload object files... -r
    checking for objdump... objdump
    checking how to recognize dependent libraries... pass_all
    checking for dlltool... no
    checking how to associate runtime and link libraries... printf %s
    checking for ar... ar
    checking for archiver @FILE support... @
    checking for strip... strip
    checking for ranlib... ranlib
    checking command to parse /usr/bin/nm -B output from gcc object... ok
    checking for sysroot... no
    checking for a working dd... /usr/bin/dd
    checking how to truncate binary pipes... /usr/bin/dd bs=4096 count=1
    checking for mt... no
    checking if : is a manifest tool... no
    checking how to run the C preprocessor... gcc -E
    checking for ANSI C header files... yes
    checking for sys/types.h... yes
    checking for sys/stat.h... yes
    checking for stdlib.h... yes
    checking for string.h... yes
    checking for memory.h... yes
    checking for strings.h... yes
    checking for inttypes.h... yes
    checking for stdint.h... yes
    checking for unistd.h... yes
    checking for dlfcn.h... yes
    checking for objdir... .libs
    checking if gcc supports -fno-rtti -fno-exceptions... no
    checking for gcc option to produce PIC... -fPIC -DPIC
    checking if gcc PIC flag -fPIC -DPIC works... yes
    checking if gcc static flag -static works... no
    checking if gcc supports -c -o file.o... yes
    checking if gcc supports -c -o file.o... (cached) yes
    checking whether the gcc linker (/usr/bin/ld -m elf_x86_64) supports shared libraries... yes
    checking whether -lc should be explicitly linked in... no
    checking dynamic linker characteristics... GNU/Linux ld.so
    checking how to hardcode library paths into programs... immediate
    checking whether stripping libraries is possible... yes
    checking if libtool supports shared libraries... yes
    checking whether to build shared libraries... yes
    checking whether to build static libraries... yes
    checking for gcc... (cached) gcc
    checking whether we are using the GNU C compiler... (cached) yes
    checking whether gcc accepts -g... (cached) yes
    checking for gcc option to accept ISO C89... (cached) none needed
    checking whether gcc understands -c and -o together... (cached) yes
    checking dependency style of gcc... (cached) gcc3
    checking that generated files are newer than configure... done
    configure: creating ./config.status
    config.status: creating Makefile
    config.status: creating src/Makefile
    config.status: creating lib/Makefile
    config.status: creating config.h
    config.status: config.h is unchanged
    config.status: executing depfiles commands
    config.status: executing libtool commands
    [root@localhost 85]# ls -l
    total 1728
    -rw-r--r-- 1 root root 372261 Aug  5 04:17 aclocal.m4
    drwxr-xr-x 2 root root     86 Aug  5 04:19 autom4te.cache
    -rw-r--r-- 1 root root      0 Aug  5 04:15 autoscan.log
    lrwxrwxrwx 1 root root     32 Aug  5 04:19 compile -> /usr/share/automake-1.16/compile
    lrwxrwxrwx 1 root root     37 Aug  5 04:19 config.guess -> /usr/share/automake-1.16/config.guess
    -rw-r--r-- 1 root root   1790 Aug  5 04:19 config.h
    -rw-r--r-- 1 root root   1611 Aug  5 04:18 config.h.in
    -rw-r--r-- 1 root root  23522 Aug  5 04:22 config.log
    -rwxr-xr-x 1 root root  57504 Aug  5 04:22 config.status
    lrwxrwxrwx 1 root root     35 Aug  5 04:19 config.sub -> /usr/share/automake-1.16/config.sub
    -rwxr-xr-x 1 root root 446104 Aug  5 04:18 configure
    -rw-r--r-- 1 root root    656 Aug  5 04:17 configure.ac
    lrwxrwxrwx 1 root root     32 Aug  5 04:19 depcomp -> /usr/share/automake-1.16/depcomp
    drwxr-xr-x 2 root root     20 Aug  5 04:02 include
    lrwxrwxrwx 1 root root     35 Aug  5 04:19 install-sh -> /usr/share/automake-1.16/install-sh
    drwxr-xr-x 3 root root     87 Aug  5 04:22 lib
    -rwxr-xr-x 1 root root 339146 Aug  5 04:22 libtool
    -rw-r--r-- 1 root root 324152 Aug  5 04:18 ltmain.sh
    -rw-r--r-- 1 root root  25199 Aug  5 04:22 Makefile
    -rw-r--r-- 1 root root    150 Aug  5 04:15 Makefile.am
    -rw-r--r-- 1 root root  25308 Aug  5 04:19 Makefile.in
    lrwxrwxrwx 1 root root     32 Aug  5 04:19 missing -> /usr/share/automake-1.16/missing
    drwxr-xr-x 3 root root     87 Aug  5 04:22 src
    -rw-r--r-- 1 root root     23 Aug  5 04:22 stamp-h1
    [root@localhost 85]# make
    make  all-recursive
    make[1]: Entering directory '/tmp/85'
    Making all in lib
    make[2]: Entering directory '/tmp/85/lib'
    /bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include/    -g -O2 -MT math.lo -MD -MP -MF .deps/math.Tpo -c -o math.lo math.c
    libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include/ -g -O2 -MT math.lo -MD -MP -MF .deps/math.Tpo -c math.c  -fPIC -DPIC -o .libs/math.o
    libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include/ -g -O2 -MT math.lo -MD -MP -MF .deps/math.Tpo -c math.c -o math.o >/dev/null 2>&1
    mv -f .deps/math.Tpo .deps/math.Plo
    /bin/sh ../libtool  --tag=CC   --mode=link gcc  -g -O2   -o libmath.la -rpath /tmp/85/_install/lib math.lo
    libtool: link: gcc -shared  -fPIC -DPIC  .libs/math.o    -g -O2   -Wl,-soname -Wl,libmath.so.0 -o .libs/libmath.so.0.0.0
    libtool: link: (cd ".libs" && rm -f "libmath.so.0" && ln -s "libmath.so.0.0.0" "libmath.so.0")
    libtool: link: (cd ".libs" && rm -f "libmath.so" && ln -s "libmath.so.0.0.0" "libmath.so")
    libtool: link: ar cru .libs/libmath.a  math.o
    libtool: link: ranlib .libs/libmath.a
    libtool: link: ( cd ".libs" && rm -f "libmath.la" && ln -s "../libmath.la" "libmath.la" )
    make[2]: Leaving directory '/tmp/85/lib'
    Making all in src
    make[2]: Entering directory '/tmp/85/src'
    gcc -DHAVE_CONFIG_H -I. -I.. -I../include/    -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.c
    mv -f .deps/main.Tpo .deps/main.Po
    /bin/sh ../libtool  --tag=CC   --mode=link gcc  -g -O2   -o main main.o ../lib/libmath.la
    libtool: link: gcc -g -O2 -o .libs/main main.o  ../lib/.libs/libmath.so -Wl,-rpath -Wl,/tmp/85/_install/lib
    make[2]: Leaving directory '/tmp/85/src'
    make[2]: Entering directory '/tmp/85'
    make[2]: Leaving directory '/tmp/85'
    make[1]: Leaving directory '/tmp/85'
    [root@localhost 85]# ls -l
    total 1728
    -rw-r--r-- 1 root root 372261 Aug  5 04:17 aclocal.m4
    drwxr-xr-x 2 root root     86 Aug  5 04:19 autom4te.cache
    -rw-r--r-- 1 root root      0 Aug  5 04:15 autoscan.log
    lrwxrwxrwx 1 root root     32 Aug  5 04:19 compile -> /usr/share/automake-1.16/compile
    lrwxrwxrwx 1 root root     37 Aug  5 04:19 config.guess -> /usr/share/automake-1.16/config.guess
    -rw-r--r-- 1 root root   1790 Aug  5 04:19 config.h
    -rw-r--r-- 1 root root   1611 Aug  5 04:18 config.h.in
    -rw-r--r-- 1 root root  23522 Aug  5 04:22 config.log
    -rwxr-xr-x 1 root root  57504 Aug  5 04:22 config.status
    lrwxrwxrwx 1 root root     35 Aug  5 04:19 config.sub -> /usr/share/automake-1.16/config.sub
    -rwxr-xr-x 1 root root 446104 Aug  5 04:18 configure
    -rw-r--r-- 1 root root    656 Aug  5 04:17 configure.ac
    lrwxrwxrwx 1 root root     32 Aug  5 04:19 depcomp -> /usr/share/automake-1.16/depcomp
    drwxr-xr-x 2 root root     20 Aug  5 04:02 include
    lrwxrwxrwx 1 root root     35 Aug  5 04:19 install-sh -> /usr/share/automake-1.16/install-sh
    drwxr-xr-x 4 root root    147 Aug  5 04:22 lib
    -rwxr-xr-x 1 root root 339146 Aug  5 04:22 libtool
    -rw-r--r-- 1 root root 324152 Aug  5 04:18 ltmain.sh
    -rw-r--r-- 1 root root  25199 Aug  5 04:22 Makefile
    -rw-r--r-- 1 root root    150 Aug  5 04:15 Makefile.am
    -rw-r--r-- 1 root root  25308 Aug  5 04:19 Makefile.in
    lrwxrwxrwx 1 root root     32 Aug  5 04:19 missing -> /usr/share/automake-1.16/missing
    drwxr-xr-x 4 root root    126 Aug  5 04:22 src
    -rw-r--r-- 1 root root     23 Aug  5 04:22 stamp-h1
    [root@localhost 85]# make install
    Making install in lib
    make[1]: Entering directory '/tmp/85/lib'
    make[2]: Entering directory '/tmp/85/lib'
    /usr/bin/mkdir -p '/tmp/85/_install/lib'
    /bin/sh ../libtool   --mode=install /usr/bin/install -c   libmath.la '/tmp/85/_install/lib'
    libtool: install: /usr/bin/install -c .libs/libmath.so.0.0.0 /tmp/85/_install/lib/libmath.so.0.0.0
    libtool: install: (cd /tmp/85/_install/lib && { ln -s -f libmath.so.0.0.0 libmath.so.0 || { rm -f libmath.so.0 && ln -s libmath.so.0.0.0 libmath.so.0; }; })
    libtool: install: (cd /tmp/85/_install/lib && { ln -s -f libmath.so.0.0.0 libmath.so || { rm -f libmath.so && ln -s libmath.so.0.0.0 libmath.so; }; })
    libtool: install: /usr/bin/install -c .libs/libmath.lai /tmp/85/_install/lib/libmath.la
    libtool: install: /usr/bin/install -c .libs/libmath.a /tmp/85/_install/lib/libmath.a
    libtool: install: chmod 644 /tmp/85/_install/lib/libmath.a
    libtool: install: ranlib /tmp/85/_install/lib/libmath.a
    libtool: finish: PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/netronome/bin:/root/bin:/sbin" ldconfig -n /tmp/85/_install/lib
    ----------------------------------------------------------------------
    Libraries have been installed in:
       /tmp/85/_install/lib
    If you ever happen to want to link against installed libraries
    in a given directory, LIBDIR, you must either use libtool, and
    specify the full pathname of the library, or use the '-LLIBDIR'
    flag during linking and do at least one of the following:
       - add LIBDIR to the 'LD_LIBRARY_PATH' environment variable
         during execution
       - add LIBDIR to the 'LD_RUN_PATH' environment variable
         during linking
       - use the '-Wl,-rpath -Wl,LIBDIR' linker flag
       - have your system administrator add LIBDIR to '/etc/ld.so.conf'
    See any operating system documentation about shared libraries for
    more information, such as the ld(1) and ld.so(8) manual pages.
    ----------------------------------------------------------------------
    make[2]: Nothing to be done for 'install-data-am'.
    make[2]: Leaving directory '/tmp/85/lib'
    make[1]: Leaving directory '/tmp/85/lib'
    Making install in src
    make[1]: Entering directory '/tmp/85/src'
    make[2]: Entering directory '/tmp/85/src'
    /usr/bin/mkdir -p '/tmp/85/_install/bin'
      /bin/sh ../libtool   --mode=install /usr/bin/install -c main '/tmp/85/_install/bin'
    libtool: install: /usr/bin/install -c .libs/main /tmp/85/_install/bin/main
    make[2]: Nothing to be done for 'install-data-am'.
    make[2]: Leaving directory '/tmp/85/src'
    make[1]: Leaving directory '/tmp/85/src'
    make[1]: Entering directory '/tmp/85'
    make[2]: Entering directory '/tmp/85'
    make[2]: Nothing to be done for 'install-exec-am'.
    make[2]: Nothing to be done for 'install-data-am'.
    make[2]: Leaving directory '/tmp/85'
    make[1]: Leaving directory '/tmp/85'
    [root@localhost 85]# which main
    /usr/local/bin/main
    [root@localhost 85]# ls -l /usr/local/bin/main
    -rwxr-xr-x 1 root root 21424 Aug  3 04:16 /usr/local/bin/main
    [root@localhost 85]# ls
    aclocal.m4      compile       config.h.in    config.sub    depcomp   install-sh  ltmain.sh    Makefile.in  stamp-h1
    autom4te.cache  config.guess  config.log     configure     include   lib         Makefile     missing
    autoscan.log    config.h      config.status  configure.ac  _install  libtool     Makefile.am  src
    [root@localhost 85]# cd _install/
    [root@localhost _install]# tree .
    .
    ├── bin
    │   └── main
    └── lib
        ├── libmath.a
        ├── libmath.la
        ├── libmath.so -> libmath.so.0.0.0
        ├── libmath.so.0 -> libmath.so.0.0.0
        └── libmath.so.0.0.0
    2 directories, 6 files
    [root@localhost 85]# ls
    aclocal.m4      compile       config.h.in    config.sub    depcomp   install-sh  ltmain.sh    Makefile.in  stamp-h1
    autom4te.cache  config.guess  config.log     configure     include   lib         Makefile     missing
    autoscan.log    config.h      config.status  configure.ac  _install  libtool     Makefile.am  src
    這里我們通過--prefix選項(xiàng)將可執(zhí)行文件和庫文件安裝到自定義路徑_install。通過make install編譯安裝過后,我們發(fā)現(xiàn)在_install路徑下確實(shí)含有編譯生成的可執(zhí)行程序以及動(dòng)態(tài)庫文件。
    另外,在確?蓤(zhí)行程序運(yùn)行正常后,我們也可以通過命令make dist將項(xiàng)目源文件整體打包發(fā)布,極其方便。
    [root@localhost 85]# make dist
    make  dist-gzip am__post_remove_distdir='@:'
    make[1]: Entering directory '/tmp/85'
    make  distdir-am
    make[2]: Entering directory '/tmp/85'
    if test -d "main-1.0"; then find "main-1.0" -type d ! -perm -200 -exec chmod u+w {} ';' && rm -rf "main-1.0" || { sleep 5 && rm -rf "main-1.0"; }; else :; fi
    test -d "main-1.0" || mkdir "main-1.0"
    (cd lib && make  top_distdir=../main-1.0 distdir=../main-1.0/lib \
         am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)
    make[3]: Entering directory '/tmp/85/lib'
    make  distdir-am
    make[4]: Entering directory '/tmp/85/lib'
    make[4]: Leaving directory '/tmp/85/lib'
    make[3]: Leaving directory '/tmp/85/lib'
    (cd src && make  top_distdir=../main-1.0 distdir=../main-1.0/src \
         am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)
    make[3]: Entering directory '/tmp/85/src'
    make  distdir-am
    make[4]: Entering directory '/tmp/85/src'
    make[4]: Leaving directory '/tmp/85/src'
    make[3]: Leaving directory '/tmp/85/src'
    test -n "" \
    || find "main-1.0" -type d ! -perm -755 \
            -exec chmod u+rwx,go+rx {} \; -o \
      ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
      ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
      ! -type d ! -perm -444 -exec /bin/sh /tmp/85/install-sh -c -m a+r {} {} \; \
    || chmod -R a+r "main-1.0"
    make[2]: Leaving directory '/tmp/85'
    tardir=main-1.0 && ${TAR-tar} chof - "$tardir" | eval GZIP= gzip --best -c >main-1.0.tar.gz
    make[1]: Leaving directory '/tmp/85'
    if test -d "main-1.0"; then find "main-1.0" -type d ! -perm -200 -exec chmod u+w {} ';' && rm -rf "main-1.0" || { sleep 5 && rm -rf "main-1.0"; }; else :; fi
    [root@localhost 85]# ls -l
    total 1936
    -rw-r--r-- 1 root root 372261 Aug  5 04:17 aclocal.m4
    drwxr-xr-x 2 root root     86 Aug  5 04:19 autom4te.cache
    -rw-r--r-- 1 root root      0 Aug  5 04:15 autoscan.log
    lrwxrwxrwx 1 root root     32 Aug  5 04:19 compile -> /usr/share/automake-1.16/compile
    lrwxrwxrwx 1 root root     37 Aug  5 04:19 config.guess -> /usr/share/automake-1.16/config.guess
    -rw-r--r-- 1 root root   1790 Aug  5 04:19 config.h
    -rw-r--r-- 1 root root   1611 Aug  5 04:18 config.h.in
    -rw-r--r-- 1 root root  23522 Aug  5 10:48 config.log
    -rwxr-xr-x 1 root root  57504 Aug  5 10:48 config.status
    lrwxrwxrwx 1 root root     35 Aug  5 04:19 config.sub -> /usr/share/automake-1.16/config.sub
    -rwxr-xr-x 1 root root 446104 Aug  5 04:18 configure
    -rw-r--r-- 1 root root    656 Aug  5 04:17 configure.ac
    lrwxrwxrwx 1 root root     32 Aug  5 04:19 depcomp -> /usr/share/automake-1.16/depcomp
    drwxr-xr-x 2 root root     20 Aug  5 04:02 include
    drwxr-xr-x 4 root root     28 Aug  5 04:25 _install
    lrwxrwxrwx 1 root root     35 Aug  5 04:19 install-sh -> /usr/share/automake-1.16/install-sh
    drwxr-xr-x 4 root root    147 Aug  5 10:49 lib
    -rwxr-xr-x 1 root root 339146 Aug  5 10:48 libtool
    -rw-r--r-- 1 root root 324152 Aug  5 04:18 ltmain.sh
    -rw-r--r-- 1 root root 331481 Aug  5 13:03 main-1.0.tar.gz
    -rw-r--r-- 1 root root  25199 Aug  5 10:48 Makefile
    -rw-r--r-- 1 root root    150 Aug  5 04:15 Makefile.am
    -rw-r--r-- 1 root root  25308 Aug  5 04:19 Makefile.in
    lrwxrwxrwx 1 root root     32 Aug  5 04:19 missing -> /usr/share/automake-1.16/missing
    drwxr-xr-x 4 root root    126 Aug  5 10:49 src
    -rw-r--r-- 1 root root     23 Aug  5 10:48 stamp-h1
    [root@nj-localhost]# cp main-1.0.tar.gz ../
    [root@nj-raclocalhostcd ..
    [root@nj-rack02localhostr -zxvf main-1.0.tar.gz
    main-1.0/
    main-1.0/Makefile.am
    main-1.0/configure
    main-1.0/configure.ac
    main-1.0/aclocal.m4
    main-1.0/Makefile.in
    main-1.0/config.h.in
    main-1.0/compile
    main-1.0/config.guess
    main-1.0/config.sub
    main-1.0/install-sh
    main-1.0/ltmain.sh
    main-1.0/missing
    main-1.0/lib/
    main-1.0/lib/Makefile.am
    main-1.0/lib/Makefile.in
    main-1.0/lib/math.c
    main-1.0/depcomp
    main-1.0/src/
    main-1.0/src/Makefile.am
    main-1.0/src/Makefile.in
    main-1.0/src/main.c
    [root@localhostlocalhost
    total 384
    drwxr-xr-x 2 root root     20 Jul 28 09:01 717
    drwxr-xr-x 2 root root     23 Jul 28 09:01 722
    drwxr-xr-x 5 root root   4096 Jul 28 08:49 724
    drwxr-xr-x 2 root root      6 Jul 17 13:36 77
    drwxr-xr-x 8 root root   4096 Aug  5 13:03 85
    drwxr-xr-x 6 root root    137 Aug  1 14:57 example
    -rw-r--r-- 1 root root  12510 Jul 28 03:53 gcc_micro
    drwxr-xr-x 4 root root   4096 Aug  5 13:03 main-1.0
    -rw-r--r-- 1 root root 331481 Aug  5 13:03 main-1.0.tar.gz
    -rw-r--r-- 1 root root    252 Jul 24 13:43 Makefile
    drwxr-xr-x 7 root root   4096 Aug  5 04:02 myproject
    drwx------ 3 root root     17 Jun  8 15:34 systemd-private-ef1fd2fdd12d442c8b6a8d3d0cdc1c54-chronyd.service-BS2qcS
    -rwxr-xr-x 1 root root  18096 Jul 27 02:48 test
    -rw-r--r-- 1 root root    162 Jul 27 02:48 test.c
    [root@nj-localhostlocalhost1.0/
    [root@nj-raclocalhostlocalhostocal.m4  config.guess  config.sub  configure.ac  install-sh  ltmain.sh    Makefile.in  src
    compile     config.h.in   configure   depcomp       lib         Makefile.am  missing
    [root@nj-rack02localhostlocalhost─ aclocal.m4
    ├── compile
    ├── config.guess
    ├── config.h.in
    ├── config.sub
    ├── configure
    ├── configure.ac
    ├── depcomp
    ├── install-sh
    ├── lib
    │   ├── Makefile.am
    │   ├── Makefile.in
    │   └── math.c
    ├── ltmain.sh
    ├── Makefile.am
    ├── Makefile.in
    ├── missing
    └── src
        ├── main.c
        ├── Makefile.am
        └── Makefile.in
    2 directories, 19 files
    四、總結(jié)本文從Autotools工具的構(gòu)成、構(gòu)建工程項(xiàng)目流程、以及實(shí)戰(zhàn)構(gòu)建各類程序三個(gè)方面,簡單的介紹了Autotools工具的原理和使用方法,為我們?cè)谌粘W(xué)習(xí)和工作中構(gòu)建復(fù)雜的工程項(xiàng)目提供一定的參考,姑且作為拋磚引玉之作。但是由于篇幅所限,無法在一篇文章中將Autotools工具的方方面面都詳細(xì)的總結(jié)出來,后續(xù)小編會(huì)陸續(xù)推出針對(duì)Autotools工具的一些細(xì)節(jié)內(nèi)容總結(jié)的推文,敬請(qǐng)期待。
    end

    一口Linux

    關(guān)注,回復(fù)【1024】海量Linux資料贈(zèng)送
    精彩文章合集
    文章推薦
    ?【專輯】ARM?【專輯】粉絲問答?【專輯】所有原創(chuàng)?【專輯】linux入門?【專輯】計(jì)算機(jī)網(wǎng)絡(luò)?【專輯】Linux驅(qū)動(dòng)?【干貨】嵌入式驅(qū)動(dòng)工程師學(xué)習(xí)路線?【干貨】Linux嵌入式所有知識(shí)點(diǎn)-思維導(dǎo)圖
  • 發(fā)表回復(fù)

    本版積分規(guī)則


    聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表