青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-167  評論-8  文章-0  trackbacks-0

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

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

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

一.Makefile介紹

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

二.使用的 環(huán)境

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

  

三.從helloworld入手

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

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

  新建三個文件:

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

  然后執(zhí)行:

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

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

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

  現(xiàn)在 開始介紹詳細(xì)的 過程:

  1.建目錄

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

  1. $ mkdir helloword
  2. $ cd helloworld

  2. helloworld.c

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

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

  完成后保存退出.
  現(xiàn)在 在 helloworld目錄下就應(yīng)該有一個你自己寫的 helloworld.c了.

  3.生成configure

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

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

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

  1. ==========================configure.in內(nèi)容開始=========================================
  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內(nèi)容結(jié)束=========================================

  然后執(zhí)行命令aclocal和autoconf,分別會產(chǎn)生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內(nèi)容是 一些宏定義,這些宏經(jīng)autoconf處理后會變成檢查系統(tǒng)特性.環(huán)境變量.軟件必須的 參數(shù)的 shell腳本.

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

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

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

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

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

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

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

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

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

  Makefile.am中定義的 宏和目標(biāo),會指導(dǎo)automake生成指定的 代碼.例如,宏bin_PROGRAMS將導(dǎo)致編譯和連接的 目標(biāo)被生成.
  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會根據(jù)Makefile.am文件產(chǎn)生一些文件,包含最重要的 Makefile.in.

  6.執(zhí)行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已經(jīng)產(chǎn)生出來了.

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

四.深入淺出

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

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

posted on 2012-09-21 11:31 老馬驛站 閱讀(484) 評論(0)  編輯 收藏 引用 所屬分類: linux
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美一区二区在线播放| 欧美a级一区| 欧美电影免费网站| 99精品国产在热久久下载| 久久精品动漫| 亚洲国产裸拍裸体视频在线观看乱了中文 | 亚洲美女av黄| 毛片av中文字幕一区二区| 欧美在线视频一区二区三区| 日韩视频永久免费| 影音先锋久久久| 好看不卡的中文字幕| 欧美日韩在线视频一区| 欧美va亚洲va国产综合| 亚洲欧美国产日韩天堂区| 一区二区亚洲精品| 亚洲天堂av在线免费观看| 免费成人av在线| 一本一本久久a久久精品牛牛影视| 老司机精品福利视频| 欧美国产精品人人做人人爱| 奶水喷射视频一区| 亚洲精品国产视频| 国产日韩欧美综合在线| 欧美日韩国产123| 欧美精品一区二区三区在线看午夜 | 伊人精品视频| 亚洲精品资源| 久久视频在线看| 久久综合一区| 亚洲国产另类精品专区| 99在线精品视频在线观看| 久久se精品一区二区| 欧美韩国在线| 日韩小视频在线观看| 久久久久88色偷偷免费| 久久久夜夜夜| 欧美激情免费观看| 91久久综合亚洲鲁鲁五月天| 亚洲无玛一区| 日韩视频在线免费观看| 日韩午夜电影| 国产精品a久久久久久| 亚洲国产日韩一级| 午夜精品久久久久久久久久久久久| 亚洲欧洲日本国产| 狠狠色狠狠色综合人人| 欧美在线影院| 亚洲一区在线观看视频| 欧美精品激情在线| 亚洲视频福利| 欧美日韩一级片在线观看| 欧美国产丝袜视频| 亚洲欧美激情一区| 国产精品一级久久久| 亚洲综合电影一区二区三区| 亚洲综合电影| 亚洲精品国产精品乱码不99按摩| 狼人社综合社区| 国产精品入口66mio| 一本色道久久88精品综合| 久久久亚洲国产天美传媒修理工| 亚洲天堂成人| 亚洲国产精品一区二区第四页av| 久久久久网址| 老司机午夜精品| 亚洲欧美中文另类| 亚洲三级视频| 亚洲国产导航| 一本大道久久精品懂色aⅴ| 欧美国产视频一区二区| 一区二区亚洲精品| 亚洲一区观看| 国产亚洲欧美日韩一区二区| 亚洲黄色毛片| 欧美激情视频一区二区三区不卡| 亚洲国产欧美在线| 亚洲一区欧美一区| 亚洲欧美日韩爽爽影院| 欧美国产三区| 亚洲国产精品悠悠久久琪琪| 亚洲日本中文字幕| 久久久亚洲一区| 欧美二区在线播放| 国产一区二区日韩| 亚洲国产合集| 国产一区二区三区在线播放免费观看 | 国产精品午夜av在线| 亚洲精品在线一区二区| 91久久久亚洲精品| 伊人成综合网伊人222| 欧美激情黄色片| 国内精品视频在线播放| 久久久久www| 欧美有码在线视频| 欧美性久久久| 欧美成人精品一区二区三区| 红桃视频一区| 欧美国产日韩在线| 99re8这里有精品热视频免费 | 亚洲电影免费| 欧美日韩三级| 欧美一区视频| 午夜精品视频网站| 国产精品乱码人人做人人爱| 亚洲人成艺术| 欧美在线观看一区| 伊人精品在线| 国产女人水真多18毛片18精品视频| 久久久综合精品| 亚洲国产一区二区三区在线播| 亚洲欧美日韩精品久久亚洲区| 国产精品成人一区| 久久久噜噜噜久噜久久| 玖玖玖免费嫩草在线影院一区| 欧美国产综合| 国产精品综合视频| 亚洲影院色无极综合| 亚洲一区激情| 一区二区三区回区在观看免费视频| 欧美淫片网站| 欧美一级午夜免费电影| 最新高清无码专区| 国产一区二区三区四区在线观看| 一本色道久久88精品综合| 久久av一区| 午夜电影亚洲| 国产精品久久久久三级| 99国产一区二区三精品乱码| 亚洲美女精品久久| 免费在线播放第一区高清av| 免费成人高清在线视频| 激情综合五月天| 欧美激情一二三区| 亚洲精品乱码久久久久久黑人| 国产精品主播| 亚洲免费观看| 99热这里只有精品8| 欧美粗暴jizz性欧美20| 欧美韩日一区二区| 亚洲破处大片| 欧美乱妇高清无乱码| 亚洲黄色视屏| 99re6热只有精品免费观看 | 欧美mv日韩mv亚洲| 欧美国产成人在线| 亚洲七七久久综合桃花剧情介绍| 欧美成人免费一级人片100| 亚洲国产三级| 亚洲调教视频在线观看| 亚洲永久免费av| 欧美一区二区黄| 国产精品日韩久久久久| 亚洲欧美国产视频| 久久在线视频| 亚洲人成网站999久久久综合| 欧美激情综合在线| 在线午夜精品| 久久综合电影| 一区二区高清在线观看| 国产精品婷婷| 香蕉精品999视频一区二区| 一区二区三区四区五区精品视频| 亚洲免费在线视频| 极品日韩久久| 欧美日韩日日骚| 国产自产2019最新不卡| 欧美在线观看视频一区二区| 国产一区二区三区精品久久久| 久久香蕉精品| 一区二区三区欧美视频| 久久综合九色九九| 在线一区亚洲| 玉米视频成人免费看| 欧美日韩蜜桃| 久久久亚洲成人| 一本色道久久加勒比88综合| 久久蜜桃av一区精品变态类天堂| 亚洲欧洲在线一区| 国产日韩av在线播放| 亚洲精品国产精品国产自| 欧美一级一区| 99re6这里只有精品视频在线观看| 国产精品亚洲产品| 欧美二区在线看| 久久精品电影| 亚洲素人在线| 亚洲国内自拍| 麻豆久久精品| 欧美在线中文字幕| 国产精品99久久不卡二区| 久久精品国产亚洲一区二区| 久久久久国产精品厨房| 亚洲经典在线| 久久综合99re88久久爱| 久久成人综合视频| 亚洲欧美日韩一区二区在线 | 最新中文字幕一区二区三区| 国产精品高清在线| 欧美激情精品久久久久久免费印度|