• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-167  評論-8  文章-0  trackbacks-0

            作為Linux下的程序開發人員,大家一定都遇到過Makefile,用make命令來編譯自己寫的程序確實是很方便.一般情況下,大家都是手工寫一個簡單Makefile,如果要想寫出一個符合自由軟件慣例的Makefile就不那么容易了.

            在本文中,將給大家介紹如何使用autoconf和automake兩個工具來幫助我們自動地生成符合自由軟件慣例的 Makefile,這樣就可以象常見的 GNU程序一樣,只要使用”./configure”,”make”,”make instal”就可以把程序安裝到Linux系統中去了.

            這將特別適合想做開放源代碼軟件的程序開發人員,又或如果你只是自己寫些小的Toy程序,那么這個文章對你也會有很大的幫助.
             

            一.Makefile介紹

              Makefile是用于自動編譯和鏈接的 ,一個工程有很多文件組成,每一個文件的改變都會導致工程的重新鏈接,但是不是 所有的文件都需要重新編譯,Makefile中紀錄有文件的信息,在 make時會決定在鏈接的時候需要重新編譯哪些文件.
             
              Makefile的宗旨就是 :讓編譯器知道要編譯一個文件需要依賴其他的 哪些文件.當那些依賴文件有了改變,編譯器會自動的發現最終的生成文件已經過時,而重新編譯相應的 模塊.
              
            Makefile的 基本結構不是 很復雜,但當一個程序開發人員開始寫Makefile時,經常會懷疑自己寫的 是 否符合慣例,而且自己寫的 Makefile經常和自己的 開發環境相關聯,當系統環境變量或路徑發生了變化后,Makefile可能還要跟著修改.這樣就造成了手工書寫Makefile的 諸多問題,automake恰好能很好地幫助我們解決這些問題.
              
            使用automake,程序開發人員只需要寫一些簡單的 含有預定義宏的 文件,由autoconf根據一個宏文件生成configure,由automake根據另一個宏文件生成Makefile.in,再使用configure依據Makefile.in來生成一個符合慣例的 Makefile.下面我們將詳細介紹Makefile的 automake生成方法.
              

            二.使用的 環境

              本文所提到的 程序是 基于Linux發行版本:Fedora Core release 1,它包含了我們要用到的 autoconf,automake.

              

            三.從helloworld入手

              我們從大家最常使用的 例子程序helloworld開始.

              下面的 過程如果簡單地說來就是 :

              新建三個文件:

            1.    helloworld.c
            2.    configure.in
            3.    Makefile.am

              然后執行:

            1. aclocal; autoconf; automake --add-missing; ./configure; make; ./helloworld

              就可以看到Makefile被產生出來,而且可以將helloworld.c編譯通過.

              很簡單吧,幾條命令就可以做出一個符合慣例的 Makefile,感覺如何呀.

              現在 開始介紹詳細的 過程:

              1.建目錄

              在 你的 工作目錄下建一個helloworld目錄,我們用它來存放helloworld程序及相關文件,如在 /home/my/build下:

            1. $ mkdir helloword
            2. $ cd helloworld

              2. helloworld.c

              然后用你自己最喜歡的 編輯器寫一個hellowrold.c文件,如命令:vi helloworld.c.使用下面的 代碼作為helloworld.c的 內容.

            1. #include <stdio.h>
            2. int main(int argc, char** argv){
            3.      printf("%s", 'Hello, Linux World!\n");
            4.      return 0;
            5. }

              完成后保存退出.
              現在 在 helloworld目錄下就應該有一個你自己寫的 helloworld.c了.

              3.生成configure

              我們使用autoscan命令來幫助我們根據目錄下的 源代碼生成一個configure.in的 模板文件.
              命令:

            1. $ autoscan
            2. $ ls
            3. configure.scan helloworld.c

              執行后在 hellowrold目錄下會生成一個文件:configure.scan,我們可以拿它作為configure.in的 藍本.
              現在 將configure.scan改名為configure.in,并且編輯它,按下面的 內容修改,去掉無關的 語句:

            1. ==========================configure.in內容開始=========================================
            2. # -*- Autoconf -*-
            3. # Process this file with autoconf to produce a configure script.
            4. AC_INIT(helloworld.c)
            5. AM_INIT_AUTOMAKE(helloworld, 1.0)
            6. # Checks for programs.
            7. AC_PROG_CC
            8. # Checks for libraries.
            9. # Checks for header files.
            10. # Checks for typedefs, structures, and compiler characteristics.
            11. # Checks for library functions.
            12. AC_OUTPUT(Makefile)
            13. ==========================configure.in內容結束=========================================

              然后執行命令aclocal和autoconf,分別會產生aclocal.m4及configure兩個文件:

            1. $ aclocal
            2. $ls
            3. aclocal.m4 configure.in helloworld.c
            4. $ autoconf
            5. $ ls
            6. aclocal.m4 autom4te.cache configure configure.in helloworld.c

              大家可以看到configure.in內容是 一些宏定義,這些宏經autoconf處理后會變成檢查系統特性.環境變量.軟件必須的 參數的 shell腳本.

              autoconf 是 用來生成自動配置軟件源代碼腳本(configure)的 工具.configure腳本能獨立于autoconf運行,且在 運行的 過程中,不需要用戶的 干預.

              要生成configure文件,你必須告訴autoconf如何找到你所用的 宏.方式是 使用aclocal程序來生成你的 aclocal.m4.

              aclocal根據configure.in文件的 內容,自動生成aclocal.m4文件.aclocal是 一個perl 腳本程序,它的 定義是 :”aclocal – create aclocal.m4 by scanning configure.ac”.

              autoconf從configure.in這個列舉編譯軟件時所需要各種參數的 模板文件中創建configure.

              autoconf需要GNU m4宏處理器來處理aclocal.m4,生成configure腳本.

              m4是 一個宏處理器.將輸入拷貝到輸出,同時將宏展開.宏可以是 內嵌的 ,也可以是 用戶定義的 .除了可以展開宏,m4還有一些內建的 函數,用來引用文件,執行命令,整數運算,文本操作,循環等.m4既可以作為編譯器的 前端,也可以單獨作為一個宏處理器.

            4.新建Makefile.am
              新建Makefile.am文件,命令:

            1. $ vi Makefile.am
            2.   內容如下:
            3. AUTOMAKE_OPTIONS=foreign
            4. bin_PROGRAMS=helloworld
            5. helloworld_SOURCES=helloworld.c

              automake會根據你寫的 Makefile.am來自動生成Makefile.in.

              Makefile.am中定義的 宏和目標,會指導automake生成指定的 代碼.例如,宏bin_PROGRAMS將導致編譯和連接的 目標被生成.
              5.運行automake:

            1. $ automake --add-missing
            2. configure.in: installing `./install-sh'
            3. configure.in: installing `./mkinstalldirs'
            4. configure.in: installing `./missing'
            5. Makefile.am: installing `./depcomp'

              automake會根據Makefile.am文件產生一些文件,包含最重要的 Makefile.in.

              6.執行configure生成Makefile

            1. $./configure
            2. checking for a BSD-compatible install... /usr/bin/install -c
            3. checking whether build environment is sane... yes
            4. checking for gawk... gawk
            5. checking whether make sets $(MAKE)... yes
            6. checking for gcc... gcc
            7. checking for C compiler default output... a.out
            8. checking whether the C compiler works... yes
            9. checking whether we are cross compiling... no
            10. checking for suffix of executables...
            11. checking for suffix of object files... o
            12. checking whether we are using the GNU C compiler... yes
            13. checking whether gcc accepts -g... yes
            14. checking for gcc option to accept ANSI C... none needed
            15. checking for style of include used by make... GNU
            16. checking dependency style of gcc... gcc3
            17. configure: creating ./config.status
            18. config.status: creating Makefile
            19. config.status: executing depfiles commands
            20. $ ls -l Makefile
            21. -rw-rw-r-- 1 yutao yutao 15035 Oct 15 10:40 Makefile

            你可以看到,此時Makefile已經產生出來了.

            7.使用Makefile編譯代碼

            1. $make
            2. if gcc -DPACKAGE_NAME=\"FULL-PACKAGE-NAME\" -DPACKAGE_TARNAME=\"full-package-name\" -DPACKAGE_VERSION=\"VERSION\" -DPACKAGE_STRING=\"FULL-PACKAGE-NAME\ VERSION\" -DPACKAGE_BUGREPORT=\"BUG-REPORT-ADDRESS\" -DPACKAGE=\"helloworld\" -DVERSION=\"1.0\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_STDLIB_H=1 -I. -I. -g -O2 -MT helloworld.o -MD -MP -MF ".deps/helloworld.Tpo" -c -o helloworld.o helloworld.c; \
            3. then mv -f ".deps/helloworld.Tpo" ".deps/helloworld.Po"; else rm -f ".deps/helloworld.Tpo"; exit 1; fi
            4. gcc -g -O2 -o helloworld helloworld.o

              運行helloworld

            1. $ ./helloworld
            2. Hello, Linux World!

              這樣helloworld就編譯出來了,你如果按上面的 步驟來做的 話,應該也會很容易地編譯出正確的 helloworld文件.你還可以試著使用一些其他的 make命令,如make clean,make install,make dist,看看它們會給你什么樣的 效果.感覺如何?自己也能寫出這么專業的 Makefile,老板一定會對你刮目相看.

            四.深入淺出

              針對上面提到的 各個命令,我們再做些詳細的 介紹.

              1. autoscan   autoscan是 用來掃描源代碼目錄生成configure.scan文件的 .autoscan 可以用目錄名做為參數,但如果你不使用參數的 話,那么autoscan將認為使用的是當前目錄. autoscan將掃描你所指定目錄中的 源文件,并創建configure.scan文件.   2. configure.scan   configure.scan包含了系統配置的 基本選項,里面都是 一些宏定義.我們需要將它改名為 configure.in   3. aclocal   aclocal是 一個perl 腳本程序.aclocal根據configure.in文件的 內容 ,自動生成aclocal.m4文件.aclocal的 定義是 :"aclocal - create aclocal.m4 by scanning configure.ac".   4. autoconf   autoconf是 用來產生configure文件的 .configure是 一個腳本,它能設置 源程序來適應各種不同的操作系統平臺,并且根據不同的 系統來產生合適的 Makefile,從而可以使 你的源代碼能在不同的操作系統平臺上被編譯出來.   configure.in文件的 內容是 一些宏,這些宏經過autoconf 處理后會變成檢查系統 特性.環境變量.軟件必須的 參數的 shell腳本.configure.in文件中的 宏的 順序并沒 有規定,但是 你必須在 所有宏的 最前面和最后面分別加上AC_INIT宏和AC_OUTPUT宏.   在 configure.ini中:   #號表示注釋,這個宏后面的 內容將被忽略.   AC_INIT(FILE)   這個宏用來檢查源代碼所在 的 路徑. AM_INIT_AUTOMAKE(PACKAGE, VERSION)    這個宏是 必須的 ,它描述了我們將要生成的 軟件包的 名字及其版本號:PACKAGE是軟件包 的名字,VERSION是 版本號.當你使用make dist命令時,它會給你生成一個類似 helloworld-1.0.tar.gz的 軟件發行包,其中就有對應的 軟件包的 名字和版本號. AC_PROG_CC   這個宏將檢查系統所用的 C編譯器. AC_OUTPUT(FILE)   這個宏是 我們要輸出的 Makefile的 名字.   我們在 使用automake時,實際上還需要用到其他的 一些宏,但我們可以用aclocal 來幫 我們自動產生.執行aclocal后我們會得到aclocal.m4文件.   產生了configure.in和aclocal.m4 兩個宏文件后,我們就可以使用autocon f來產生configure文件了.   5. Makefile.am   Makefile.am是 用來生成Makefile.in的 ,需要你手工書寫.Makefile. am中定義了一些內容: AUTOMAKE_OPTIONS   這個是 automake的 選項.在 執行automake時,它會檢查目錄下是 否存在 標準 GNU軟件包中應具備的各種文件,例如AUTHORS.ChangeLog.NEWS等文件. 我們將其設置成foreign時,automake會改用一般軟件包的 標準來檢查. bin_PROGRAMS   這個是 指定我們所要產生的 可執行文件的 文件名.如果你要產生多個可執行文件, 那么在各個名字間用空格隔開. helloworld_SOURCES   這個是 指定產生"helloworld"時所需要的 源代碼.如果它用到了多個源文件, 那么請使用空格符號將它們隔開.比如需要helloworld.h,helloworld.c那么請寫成: helloworld_SOURCES= helloworld.h helloworld.c.   如果你在 bin_PROGRAMS定義了多個可執行文件,則對應每個可執行文件都要定義相對的 filename_SOURCES.   6. automake   我們使用automake --add-missing來產生Makefile.in.   選項--add-missing的 定義是 "add missing standard files  to package",它會讓automake加入一個標準的 軟件包所必須的 一些文件.   我們用automake產生出來的 Makefile.in文件是 符合GNU Makefile慣例 的 ,接下來我們只要執行configure這個shell 腳本就可以產生合適的 Makefile 文 件了.   7. Makefile   在 符合GNU Makefiel慣例的 Makefile中,包含了一些基本的 預先定義的 操作:  make   根據Makefile編譯源代碼,連接,生成目標文件,可執行文件. make clean   清除上次的 make命令所產生的 object文件(后綴為".o"的 文件)及可執行文件. make install   將編譯成功的 可執行文件安裝到系統目錄中,一般為/usr/local/bin目錄. make dist   產生發布軟件包文件(即distribution package).這個命令將會將可執行文件及相關 文件打包成一個tar.gz壓縮的 文件用來作為發布軟件的 軟件包.   它會在 當前目錄下生成一個名字類似"PACKAGE-VERSION.tar.gz"的 文件.PA CKAGE和VERSION,是 我們在 configure.in中定義的 AM_INIT_AUTOM AKE(PACKAGE, VERSION). make distcheck   生成發布軟件包并對其進行測試檢查,以確定發布包的正確性. 

            posted on 2012-09-21 11:31 老馬驛站 閱讀(459) 評論(0)  編輯 收藏 引用 所屬分類: linux
            丁香五月网久久综合| 久久精品国产男包| 日韩精品久久无码中文字幕| 日本久久中文字幕| 久久久久亚洲av成人无码电影| 7国产欧美日韩综合天堂中文久久久久| 欧美亚洲色综久久精品国产| 久久夜色精品国产网站| 亚洲国产精品一区二区久久hs| 一本久道久久综合狠狠爱| 囯产极品美女高潮无套久久久| 人妻丰满AV无码久久不卡| 久久精品中文无码资源站| 久久婷婷综合中文字幕| 久久国产福利免费| 一本久久a久久精品亚洲| 精品一二三区久久aaa片| 99国产欧美久久久精品蜜芽| 亚洲国产成人久久综合碰碰动漫3d | 久久精品人妻一区二区三区| 久久久精品人妻无码专区不卡| 久久精品国产男包| 国产成年无码久久久久毛片| 超级碰久久免费公开视频| 亚洲人成无码www久久久| 久久亚洲精品成人AV| 久久久久亚洲精品无码网址| 亚洲国产精品无码久久一区二区 | 久久国产色AV免费观看| 国产国产成人久久精品| 亚洲午夜久久久久久噜噜噜| 久久精品国产69国产精品亚洲| 久久综合日本熟妇| 国产一区二区精品久久| 亚洲国产小视频精品久久久三级 | 中文字幕无码精品亚洲资源网久久 | 蜜臀av性久久久久蜜臀aⅴ| 久久精品国产福利国产秒| 欧美精品九九99久久在观看| 国产国产成人精品久久| 欧美伊人久久大香线蕉综合|