自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Linux Makefile介紹自動(dòng)編譯和鏈接

運(yùn)維 系統(tǒng)運(yùn)維
Linux Makefile是用于自動(dòng)編譯和鏈接的,一個(gè)工程有很多文件組成,每一個(gè)文件的改變都會(huì)導(dǎo)致工程的重新鏈接,但是不是所有的文件都需要重新編譯,Makefile中紀(jì)錄有文件的信息,在make時(shí)會(huì)決定在鏈接的時(shí)候需要重新編譯哪些文件。

特別值得一提的是Linux Makefile有很多值得學(xué)習(xí)的地方,這里我們主要介紹Linux Makefile,包括介紹Linux Makefile等方面。作為L(zhǎng)inux下的程序開(kāi)發(fā)人員,大家一定都遇到過(guò)Linux Makefile,用make命令來(lái)編譯自己寫(xiě)的程序確實(shí)是很方便。一般情況下,大家都是手工寫(xiě)一個(gè)簡(jiǎn)單Makefile,如果要想寫(xiě)出一個(gè)符合自由軟件慣例的Makefile就不那么容易了。

在本文中,將給大家介紹如何使用autoconf和automake兩個(gè)工具來(lái)幫助我們自動(dòng)地生成符合自由軟件慣例的Makefile,這樣就可以象常見(jiàn)的GNU程序一樣,只要使用“./configure”,“make”,“make instal”就可以把程序安裝到Linux系統(tǒng)中去了。這將特別適合想做開(kāi)放源代碼軟件的程序開(kāi)發(fā)人員,又或如果你只是自己寫(xiě)些小的Toy程序,那么這個(gè)文章對(duì)你也會(huì)有很大的幫助。

一、Linux Makefile介紹

Linux Makefile是用于自動(dòng)編譯和鏈接的,一個(gè)工程有很多文件組成,每一個(gè)文件的改變都會(huì)導(dǎo)致工程的重新鏈接,但是不是所有的文件都需要重新編譯,Makefile中紀(jì)錄有文件的信息,在make時(shí)會(huì)決定在鏈接的時(shí)候需要重新編譯哪些文件。

Linux Makefile的宗旨就是:讓編譯器知道要編譯一個(gè)文件需要依賴(lài)其他的哪些文件。當(dāng)那些依賴(lài)文件有了改變,編譯器會(huì)自動(dòng)的發(fā)現(xiàn)最終的生成文件已經(jīng)過(guò)時(shí),而重新編譯相應(yīng)的模塊。

Linux Makefile的基本結(jié)構(gòu)不是很復(fù)雜,但當(dāng)一個(gè)程序開(kāi)發(fā)人員開(kāi)始寫(xiě)Linux Makefile時(shí),經(jīng)常會(huì)懷疑自己寫(xiě)的是否符合慣例,而且自己寫(xiě)的 Makefile經(jīng)常和自己的開(kāi)發(fā)環(huán)境相關(guān)聯(lián),當(dāng)系統(tǒng)環(huán)境變量或路徑發(fā)生了變化后,Linux Makefile可能還 判薷?。这疡W斐閃聳止な樾碝akefile的諸多問(wèn)題,automake恰好能很好地幫助我們解決這些問(wèn)題。

使用automake,程序開(kāi)發(fā)人員只需要寫(xiě)一些簡(jiǎn)單的含有預(yù)定義宏的文件,由autoconf根據(jù)一個(gè)宏文件生成configure,由automake根據(jù)另一個(gè)宏文件生成 Makefile.in,再使用configure依據(jù)Makefile.in來(lái)生成一個(gè)符合慣例的Linux Makefile。下面我們將詳細(xì)介紹Linux Makefile的automake生成方法。

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

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

三、從helloworld入手

我們從大家最常使用的例子程序helloworld開(kāi)始。下面的過(guò)程如果簡(jiǎn)單地說(shuō)來(lái)就是:新建三個(gè)文件:

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

然后執(zhí)行:aclocal; autoconf; automake --add-missing; ./configure; make; ./helloworld 就可以看到Linux Makefile被產(chǎn)生出來(lái),而且可以將helloworld.c編譯通過(guò)。很簡(jiǎn)單吧,幾條命令就可以做出一個(gè)符合慣例的Linux Makefile,感覺(jué)如何呀。

現(xiàn)在開(kāi)始介紹詳細(xì)的過(guò)程:

1、建目錄

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

  1. $ mkdir helloword  
  2. $ cd helloworld  

2、 helloworld.c

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

  1. int main(int argc, char** argv)  
  2. {  
  3. printf("Hello, Linux World!\n");  
  4. return 0;  
  5. }  

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

3、生成configure

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

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

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

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

然后執(zhí)行命令aclocal和autoconf,分別會(huì)產(chǎn)生aclocal.m4及configure兩個(gè)文件:

  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處理后會(huì)變成檢查系統(tǒng)特性、環(huán)境變量、軟件必須的參數(shù)的shell腳本。autoconf 是用來(lái)生成自動(dòng)配置軟件源代碼腳本(configure)的工具。configure腳本能獨(dú)立于autoconf運(yùn)行,且在運(yùn)行的過(guò)程中,不需要用戶(hù)的干預(yù)。

要生成configure文件,你必須告訴autoconf如何找到你所用的宏。方式是使用aclocal程序來(lái)生成你的aclocal.m4。aclocal根據(jù)configure.in文件的內(nèi)容,自動(dòng)生成aclocal.m4文件。aclocal是一個(gè)perl 腳本程序,它的定義是:“aclocal - create aclocal.m4 by scanning configure.ac”。

autoconf從configure.in這個(gè)列舉編譯軟件時(shí)所需要各種參數(shù)的模板文件中創(chuàng)建configure。autoconf需要GNU m4宏處理器來(lái)處理aclocal.m4,生成configure腳本。m4是一個(gè)宏處理器。

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

4、新建Linux Makefile.am新建Makefile.am文件,命令:$ vi Makefile.am 內(nèi)容如下:

  1. AUTOMAKE_OPTIONS=foreign 
  2. bin_PROGRAMS=helloworld 
  3. helloworldhelloworld_SOURCES=helloworld.c  

automake會(huì)根據(jù)你寫(xiě)的Linux Makefilee.am來(lái)自動(dòng)生成Makefile.in。Makefile.am中定義的宏和目標(biāo),會(huì)指導(dǎo)automake生成指定的代碼。例如,宏bin_PROGRAMS將導(dǎo)致編譯和連接的目標(biāo)被生成。

5、運(yùn)行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會(huì)根據(jù)Linux 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  

你可以看到,此時(shí)Linux Makefile已經(jīng)產(chǎn)生出來(lái)了。

7、使用Linux Makefile編譯代碼

  1. $ make if gcc -DPACKAGE_NAME="" -DPACKAGE_TARNAME="" -DPACKAGE_VERSION="" -  
  2. DPACKAGE_STRING="" -DPACKAGE_BUGREPORT="" -DPACKAGE="helloworld" -DVERSION="1.0"   
  3. -I. -I. -g -O2 -MT helloworld.o -MD -MP -MF ".deps/helloworld.Tpo" \  
  4. -c -o helloworld.o `test -f 'helloworld.c' || echo './'`helloworld.c; \  
  5. then mv -f ".deps/helloworld.Tpo" ".deps/helloworld.Po"; \  
  6. else rm -f ".deps/helloworld.Tpo"; exit 1; \  
  7. fi  
  8. gcc -g -O2 -o helloworld helloworld.o    
  9.  
  10. 運(yùn)行helloworld  
  11.  
  12. $ ./helloworld   
  13. Hello, Linux World!   

這樣helloworld就編譯出來(lái)了,你如果按上面的步驟來(lái)做的話(huà),應(yīng)該也會(huì)很容易地編譯出正確的helloworld文件。你還可以試著使用一些其他的make命令,如make clean,make install,make dist,看看它們會(huì)給你什么樣的效果。感覺(jué)如何?自己也能寫(xiě)出這么專(zhuān)業(yè)的Linux Makefile,老板一定會(huì)對(duì)你刮目相看。

四、深入淺出

針對(duì)上面提到的各個(gè)命令,我們?cè)僮鲂┰敿?xì)的介紹。

1、 autoscan

autoscan是用來(lái)掃描源代碼目錄生成configure.scan文件的。autoscan可以用目錄名做為參數(shù),但如果你不使用參數(shù)的話(huà),那么 autoscan將認(rèn)為使用的是當(dāng)前目錄。autoscan將掃描你所指定目錄中的源文件,并創(chuàng)建configure.scan文件。

2、 configure.scan

configure.scan包含了系統(tǒng)配置的基本選項(xiàng),里面都是一些宏定義。我們需要將它改名為configure.in

3、 aclocal

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

4、 autoconf

autoconf是用來(lái)產(chǎn)生configure文件的。configure是一個(gè)腳本,它能設(shè)置源程序來(lái)適應(yīng)各種不同的操作系統(tǒng)平臺(tái),并且根據(jù)不同的系統(tǒng)來(lái)產(chǎn)生合適的Makefile,從而可以使你的源代碼能在不同的操作系統(tǒng)平臺(tái)上被編譯出來(lái)。

configure.in文件的內(nèi)容是一些宏,這些宏經(jīng)過(guò)autoconf 處理后會(huì)變成檢查系統(tǒng)特性、環(huán)境變量、軟件必須的參數(shù)的shell腳本。configure.in文件中的宏的順序并沒(méi)有規(guī)定,但是你必須在所有宏的最前面和最后面分別加上AC_INIT宏和AC_OUTPUT宏。

在configure.ini中:#號(hào)表示注釋?zhuān)@個(gè)宏后面的內(nèi)容將被忽略。AC_INIT(FILE) 這個(gè)宏用來(lái)檢查源代碼所在的路徑。AM_INIT_AUTOMAKE(PACKAGE, VERSION) 這個(gè)宏是必須的,它描述了我們將要生成的軟件包的名字及其版本號(hào):

PACKAGE是軟件包的名字,VERSION是版本號(hào)。當(dāng)你使用make dist命令時(shí),它會(huì)給你生成一個(gè)類(lèi)似helloworld-1.0.tar.gz的軟件發(fā)行包,其中就有對(duì)應(yīng)的軟件包的名字和版本號(hào)。
AC_PROG_CC這個(gè)宏將檢查系統(tǒng)所用的C編譯器。

 AC_OUTPUT(FILE)這個(gè)宏是我們要輸出的Makefile的名字。我們?cè)谑褂胊utomake時(shí),實(shí)際上還需要用到其他的一些宏,但我們可以用aclocal 來(lái)幫我們自動(dòng)產(chǎn)生。執(zhí)行aclocal后我們會(huì)得到aclocal.m4文件。產(chǎn)生了configure.in和aclocal.m4 兩個(gè)宏文件后,我們就可以使用autoconf來(lái)產(chǎn)生configure文件了。

5、 Makefile.am

Linux Makefile.am是用來(lái)生成Linux Makefile.in的,需要你手工書(shū)寫(xiě)。Linux Makefile.am中定義了一些內(nèi)容:AUTOMAKE_OPTIONS 這個(gè)是automake的選項(xiàng)。在執(zhí)行automake時(shí),它會(huì)檢查目錄下是否存在標(biāo)準(zhǔn)GNU軟件包中應(yīng)具備的各種文件,例如AUTHORS、ChangeLog、NEWS等文件。我們將其設(shè)置成foreign時(shí),automake會(huì)改用一般軟件包的標(biāo)準(zhǔn)來(lái)檢查。

bin_PROGRAMS這個(gè)是指定我們所要產(chǎn)生的可執(zhí)行文件的文件名。如果你要產(chǎn)生多個(gè)可執(zhí)行文件,那么在各個(gè)名字間用空格隔開(kāi)。 helloworld_SOURCES 這個(gè)是指定產(chǎn)生“helloworld”時(shí)所需要的源代碼。

如果它用到了多個(gè)源文件,那么請(qǐng)使用空格符號(hào)將它們隔開(kāi)。比如需要 helloworld.h,helloworld.c那么請(qǐng)寫(xiě)成helloworld_SOURCES= helloworld.h helloworld.c。如果你在bin_PROGRAMS定義了多個(gè)可執(zhí)行文件,則對(duì)應(yīng)每個(gè)可執(zhí)行文件都要定義相對(duì)的filename_SOURCES。

6、 automake

我們使用automake --add-missing來(lái)產(chǎn)生Linux Makefile.in。選項(xiàng)--add-missing的定義是“add missing standard files to package”,它會(huì)讓automake加入一個(gè)標(biāo)準(zhǔn)的軟件包所必須的一些文件。我們用automake產(chǎn)生出來(lái)的Linux Makefile.in文件是符合GNU Makefile慣例的,接下來(lái)我們只要執(zhí)行configure這個(gè)shell 腳本就可以產(chǎn)生合適的 Makefile 文件了。

7、 Linux 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)。這個(gè)命令將會(huì)將可執(zhí)行文件及相關(guān)文件打包成一個(gè)tar.gz壓縮的文件用來(lái)作為發(fā)布軟件的軟件包。

它會(huì)在當(dāng)前目錄下生成一個(gè)名字類(lèi)似“PACKAGE-VERSION.tar.gz”的文件。PACKAGE和VERSION,是我們?cè)赾onfigure.in中定義的AM_INIT_AUTOMAKE(PACKAGE, VERSION)。make distcheck生成發(fā)布軟件包并對(duì)其進(jìn)行測(cè)試檢查,以確定發(fā)布包的正確性。

這個(gè)操作將自動(dòng)把壓縮包文件解開(kāi),然后執(zhí)行configure命令,并且執(zhí)行make,來(lái)確認(rèn)編譯不出現(xiàn)錯(cuò)誤,最后提示你軟件包已經(jīng)準(zhǔn)備好,可以發(fā)布了。

  1. ===============================================  
  2. helloworld-1.0.tar.gz is ready for distribution 
  3. ===============================================  
  4. make distclean  

類(lèi)似make clean,但同時(shí)也將configure生成的文件全部刪除掉,包括Linux Makefile。

五、結(jié)束語(yǔ)

通過(guò)上面的介紹,你應(yīng)該可以很容易地生成一個(gè)你自己的符合GNU慣例的Linux Makefile文件及對(duì)應(yīng)的項(xiàng)目文件。如果你想寫(xiě)出更復(fù)雜的且符合慣例的Makefile,你可以參考一些開(kāi)放代碼的項(xiàng)目中的configure.in和Makefile.am文件,比如:嵌入式數(shù)據(jù)庫(kù)sqlite,單元測(cè)試cppunit。

【編輯推薦】

  1. Linux Makefile自動(dòng)編譯和鏈接使用的環(huán)境
  2. Linux Makefile介紹使用的環(huán)境深入淺出
  3. 闡述Linux Makefile文件概念
  4. Linux Makefile由淺入深剖析
  5. linux makefile文件心得筆記
責(zé)任編輯:佚名 來(lái)源: CSDN
相關(guān)推薦

2010-03-01 16:40:40

Linux Makef

2010-02-24 16:01:39

Linux Makef

2010-06-22 17:09:52

Linux Autom

2010-03-01 09:57:55

Linux Makef

2010-02-26 10:47:30

Linux Makef

2010-06-22 15:24:11

autoconf安裝

2010-06-22 15:13:32

autoconf安裝

2010-06-22 15:26:58

autoconf安裝

2013-11-14 11:38:20

Linux Kerne編譯

2010-02-24 14:55:35

Linux Makef

2009-12-23 10:33:52

Linux操作系統(tǒng)

2009-12-23 16:28:13

Linux GCC

2009-12-24 10:04:38

Linux進(jìn)行C編譯

2017-09-12 09:22:51

LinuxMakefileautoconf工具

2022-02-28 09:44:09

Linux硬鏈接軟鏈接

2017-01-15 15:27:51

Linux軟連接和硬鏈接

2023-11-15 08:27:46

Linux系統(tǒng)

2009-10-26 13:45:39

linux Makef

2009-12-08 12:22:05

內(nèi)核Makefile軟鏈接

2010-05-28 14:55:17

Linux編程工具
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)