日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

软件开发工具——Make

發(fā)布時間:2024/2/2 综合教程 25 生活家
生活随笔 收集整理的這篇文章主要介紹了 软件开发工具——Make 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

掌握Makefile的使用方法和工作流程;

掌握make工具變量的相關(guān)知識,包括其引用、定義及分類等;

掌握Makefile常見的函數(shù)含義;

掌握Makefile與shell命令行的通信方法;

掌握Makefile的常見語法規(guī)則,包括顯式規(guī)則、隱式規(guī)則及靜態(tài)模式規(guī)則;

了解autotools的用法,了解autotools中常用的工具鏈以及如何使用工具鏈自動創(chuàng)建Makefile文件。

1、Make工具概述

  Makefile帶來的好處就是“自動化編譯”,一旦寫好,只需要在shell命令行中輸入一個make命令,整個工程完全自動編譯,可以極大提高軟件開發(fā)的效率。

  make是一個命令工具,它解釋Makefile中的語法規(guī)則。Makefile有自己的書寫格式、關(guān)鍵字和函數(shù),這個文件告訴make以何種方式編譯源代碼和鏈接程序。典型地,可執(zhí)行文件可由一些.o文件按照一定的順序編譯,如果在工程中已經(jīng)存在Makefile,當(dāng)對工程中的若干源文件修改以后,可自動根據(jù)修改情況完成源文件對應(yīng).o文件的更新、庫文件的更新、最終的可執(zhí)行程序的更新。

  那么如果來判斷一個大型工程中哪些文件發(fā)生了改變,哪些沒發(fā)生變化呢?

  Linun系統(tǒng)判斷工程中文件是否發(fā)生改變的方法,是判斷文件的建立和修改時間,即“文件時間戳”,Makefile文件就是基于這種“時間戳”來運(yùn)行的。如果系統(tǒng)判斷“文件時間戳”晚于上次編譯的“時間戳”,就表明此文件在上次編譯之后重新被修改過,需要重新編譯;如果時間戳同上次一樣沒有變化,就表明沒有修改,不需要重新編譯。

2、Makefile起步

  我們的規(guī)則是:

  (1)如果工程沒有編譯過,那么所有C文件都要編譯并被鏈接;

  (2)如果工程的某幾個C文件被修改,那么只編譯被修改的C文件,并鏈接目標(biāo)工程;

  (3)如果工程的頭文件被改變了,那么需要編譯引用了這幾個頭文件的C文件,并鏈接目標(biāo)程序。

  Makefile的大致結(jié)構(gòu):

  TRAGET: Dependency file

  <TAB> COMMAND

  TRAGET: Dependency file

  <TAB> COMMAND

  ......

  TRAGET: Dependency file

  <TAB> COMMAND

  在Makefile結(jié)構(gòu)中,TARGET、Dependency file、COMMAND是相互關(guān)聯(lián)、密切聯(lián)系的3部分。

  TARGET:表示make工具創(chuàng)建的目標(biāo)體,通常是最后需要生成的文件名或者為了實(shí)現(xiàn)這個目的而必需的中間過程文件名。可以是.o文件,也可以是最后的可執(zhí)行程序的文件名等。

  Dependency file:表示要創(chuàng)建目標(biāo)體需要的依賴文件,通常一個目標(biāo)依賴于一個或者多個文件。如果其中一個文件比目標(biāo)文件的“時間戳”新,這個目標(biāo)就認(rèn)為是“過時的”,需要重新編譯生成。

  COMMAND:表示創(chuàng)建目標(biāo)體時需要運(yùn)行的命令,它限定了make執(zhí)行這條規(guī)則時需要的動作,通常可由一行或者多行命令組成。如果COMMAND不與“TARGET: Dependency ifle”在一行,那么它必須以[TAB]字符作為本行的開頭,[TAB]字符告訴make此行是一個命令行;如果與"TARGET: Dependency file“在一行,那么可以使用分號作為分隔符,如果COMMAND命令太長,可使用反斜杠()作為換行符。

  注:Makefile中“#”字符后的內(nèi)容被當(dāng)作是注釋內(nèi)容。如果此行的第一個非空字符為“#”,表示此行為注釋行。當(dāng)在Makefile中使用真實(shí)的字符“#”時,可以使用反斜杠加“#”(#)來實(shí)現(xiàn),它表示將“#”作為一個普通字符而不是注釋的開始標(biāo)志。

  Makefile的一般工作過程描述:

  (1)讀取Makefile。根據(jù)make的執(zhí)行選項(xiàng),查找當(dāng)前的目錄或者其他目錄要執(zhí)行的Makefile。

  (2)初始化Makefile。將制定的Makefile中的變量進(jìn)行替換,如果該Makefile中包含其他的文件,則將其加載。

  (3)解釋規(guī)則。將Makefile中的執(zhí)行規(guī)則進(jìn)行解析,同時推導(dǎo)文件中的隱藏規(guī)則,其次,查找文件中目標(biāo)、依賴、命令之間的關(guān)系,為創(chuàng)建目標(biāo)建立關(guān)系鏈。

  (4)分析變更。根據(jù)依賴關(guān)系和“時間戳”,判斷是否有依賴文件發(fā)生變化,如果有變化,則進(jìn)行重新編譯;如果沒有變化,當(dāng)前的目標(biāo)不需要重新編譯。

  (5)執(zhí)行。執(zhí)行Makefile中的命令。

  Makefile編寫完畢,就可以執(zhí)行make命令進(jìn)行編譯操作。make的執(zhí)行同其他命令一樣,也有豐富的選項(xiàng)供用戶選擇,可以完成不同的功能。make工具的常用選項(xiàng):

  -f file  將指定當(dāng)前目錄下的file作為Makefile

  -I dir  將dir作為被包含的Makefile所在目錄

  -C dir  將指定目錄下的file作為Makefile

  -i    忽略所有命令執(zhí)行錯誤

  -j    輸出規(guī)則中命令的詳細(xì)信息

  -n    只打印要執(zhí)行的命令,但不執(zhí)行這些命令

  -s    在執(zhí)行命令時不顯示命令

  -d    除打印正常的操作信息外,還打印調(diào)試信息

  一個目標(biāo)可以沒有依賴文件,只有命令,比如Makefile中的偽命令“clean“表示刪除make過程中的中間文件,它就沒有依賴,只有命令。偽命令是為其他命令服務(wù)的,不是強(qiáng)制性的。偽命令一般包括clean(刪除中間文件)、install(安裝編譯好的程序)、uninstall(卸載已安裝的程序)以及print(輸出發(fā)生改變的源文件)等。

3、Makefile變量

  在Makefile中,變量是一個名字,它不僅可以代表一個文本字符串,而且可以用來代表文件名、編譯選項(xiàng)、程序運(yùn)行的選項(xiàng)參數(shù)、搜索源文件的目錄,以及編譯輸出的目錄。在Makefile的目標(biāo)、依賴、命令中任意引用變量的地方,在執(zhí)行make命令后,都會被變量定義的值所取代。

  在Makefile中變量有以下幾個特征:

  (1)Makefile中變量和函數(shù)的展開(除規(guī)則命令行中的變量和函數(shù)以外),是在make讀取Makefile文件時進(jìn)行的,這里的變量不僅包括使用“=”定義的變量,而且包含使用指示符“define”定義的。

  (2)變量的命名可以包含字符、數(shù)字、下劃線,但絕對不可以使用含有“:”、“#”、“=”或是空字符(空格、回車等)的字符,同時變量中字母、數(shù)字以及下劃線以外的字符,用戶應(yīng)盡量避免使用,因?yàn)樗鼈兛赡苜x予其他特別的含義。

  (3)變量中的大小寫也是非常敏感的。推薦的方法是對于內(nèi)部定義的一般 變量使用小寫方式,而對于一些參數(shù)列表(例如:編譯選項(xiàng)CFLAGS)采用大寫方式。

  (4)有一些變量名只包含一個或者很少的幾個特殊字符,稱它們?yōu)樽詣踊兞俊O?ldquo;$”、“$@”、“$?”、“$*”等,這些變量用戶在定義中也不可以使用。

  當(dāng)定義了一個變量后,就可以在Makefile的很多地方使用這個變量。變量的引用方式是:

  $(VARIABLE_ANME) 或者 ${VARIABLE_NAME}

  美元符號“$”在Makefile中有特殊的含義,所有在命令或者文件中使用“$”時需要用兩個美元符號“$$”來表示。

  在Makefile中對一些簡單變量的引用,也可以不使用“()”和“{}”來標(biāo)記變量,而直接使用“$x”的格式來實(shí)現(xiàn),此種用法僅限于變量名為單字符的情況。

  Makefile文件在進(jìn)行變量定義時通常可以采用兩種方式,第一種是遞歸展開定義法,另一種是直接展開定義法。兩者雖然都可以對需要的變量進(jìn)行定義,但是也存在一些差異,主要的不同在于定義的方式和展開的時機(jī)不同,遞歸展開定義法可以使用之前沒有定義過的變量,而直接展開定義法不允許引用變量之后定義過的變量。

  (1)遞歸展開定義

  這種變量定義法是通過“=”或者指示符“define”來定義變量。其格式如下:

  Var=variable

  其中,Var是變量名,variable是賦予變量Var的值。

  對使用遞歸展開定義的變量,其引用的地方是嚴(yán)格的文本替換過程。變量將會原樣地被字符串替代。如果此變量定義中存在對其他變量的引用,那么被引用的變量會在此變量被展開的同時被展開。

  (2)直接展開定義

  為避免“遞歸展開法”定義變量出現(xiàn)的死循環(huán)和效率低的問題,Makefile中可使用另外一種變量定義的方式,稱為直接展開定義。這種方式使用“:=”定義變量。其格式如下:

  Var := variable

  同遞歸定義法不同,直接展開定義法在調(diào)用變量時,變量值對另外變量的引用在定義時被展開。所以在變量被定義后就是一個實(shí)際所需要定義的文本串,不再包含任何其他變量的引用。其次,需要注意的是,使用直接定義法定義變量時,不能對其后定義的變量進(jìn)行引用。

  一般而言,在復(fù)雜的Makefile中,推薦使用直接展開式變量,因?yàn)檫@種變量的使用方式和大多數(shù)編程語言中的變量使用方式基本相同。它可以使一個比較復(fù)雜的Makefile在一定程度上具有可預(yù)測性,而且這種變量允許用戶利用之前定義的值來重新定義。因此,在Makefile變量定義時,應(yīng)盡量避免和減少遞歸方式的使用。

  (3)變量嵌套定義

  在Makefile中還有一種變量高級使用方法,稱為“變量嵌套定義”。它表示在一個變量中可以包含對其他變量的引用。

  例如:

  variable1 = variable2

  varialbe2 = variable3

  w := $($(variable1))

  (4)替換引用定義

  對于一個已經(jīng)定義的變量,可以使用“替換引用”將其值中的后綴字符(串)使用指定的字符(串)替換。格式是:

  $(VAR:A=B) 或者 ${VAR:A=B}

  意思是,替換變量VAR中所有A字符結(jié)尾的字為B結(jié)尾的字。“結(jié)尾”的含義是空格之前(變量值多個字之間使用空格分開)。而對于變量其他部分的“A"字符不進(jìn)行替換。例如:

  foo := a.o b.o c.o

  bar := $(foo:.o=.c)

  變量分類:

  除用戶自己定義的變量(稱為自定義變量)外,Makefile文件中還存在3中重要的變量,它們分別是:預(yù)定義變量、自動變量和環(huán)境變量。這3中變量是系統(tǒng)級變量,都有其默認(rèn)值,用戶一般不需要在Makefile中重新定義,可在Makefile中直接引用(也可根據(jù)需要替換其默認(rèn)值)。

  (1)預(yù)定義變量

  預(yù)定義變量是進(jìn)行程序預(yù)編譯時經(jīng)常使用的變量。有時候使用GCC進(jìn)行程序預(yù)編譯時,通常對某些編譯的選項(xiàng)多次使用,預(yù)編譯變量使復(fù)雜的編譯選項(xiàng)能夠 更條理、更直觀。

  AR  庫文件維護(hù)程序的名稱,默認(rèn)值為ar

  AS  匯編程序的名稱,默認(rèn)值為as  

  CC  c編譯器的名稱

  CPP  c預(yù)編譯器的名稱,默認(rèn)值為$(CC) -E

  CXX  c++編譯器的名稱,默認(rèn)值為g++

  PC  Pascal編譯器的名稱

  FC  Fortran編譯器的名稱,默認(rèn)值為f77

  RM  文件刪除程序的名稱,默認(rèn)值為rm -f

  ARFLAGS  庫文件維護(hù)程序的選項(xiàng),無默認(rèn)值

  ASFLAGS  匯編程序的選項(xiàng),無默認(rèn)值

  CFLAGS  c編譯器的選項(xiàng),無默認(rèn)值

  CPPFLAGS  c預(yù)編譯的選項(xiàng),無默認(rèn)值

  CXXFLAGS  c++編譯器的選項(xiàng),無默認(rèn)值

  FFLAGS  Fortran編譯器的選項(xiàng),無默認(rèn)值

  其中,最重要也是最經(jīng)常使用的變量是CC和CFLAGS。由于CC沒有默認(rèn)值,因此經(jīng)常要把“CC=gcc”、“CC=arm-linux-gcc”等放到變量定義中。

  (2)自動變量

  為了簡化Makefile的編寫,Makefile引入自動變量,自動變量可以代表編譯語句中出現(xiàn)的目標(biāo)文件和依賴文件等。使用自動變量可以為Makefile的編寫提供方便。

  $@  表示當(dāng)前規(guī)則中的完整目標(biāo)文件名

  $?  新修改過的依賴文件列表,即所有時間戳比目標(biāo)文件晚的依賴文件,并以空格分開

  $*  不包含擴(kuò)展名的目標(biāo)文件名

  $<  當(dāng)前規(guī)則中的第一個依賴文件名

  $%  當(dāng)目標(biāo)文件為庫文件時,該變量為庫文件名

  $^  所有依賴文件,以空格分開,不包含重復(fù)的依賴文件

  $+  所有依賴文件,以空格分開,并以出現(xiàn)的先后為序,可能包含重復(fù)的依賴文件

  (3)環(huán)境變量

  make命令在運(yùn)行時,系統(tǒng)中所有的環(huán)境變量對它都是可見的。在Makefile中,可以引用任何已定義的系統(tǒng)環(huán)境變量。(這里我們區(qū)分系統(tǒng)環(huán)境變量和make環(huán)境變量,系統(tǒng)環(huán)境變量是這個系統(tǒng)所有用戶所擁有的,而make的環(huán)境變量只是對于make的一次執(zhí)行過程有效。)

  Makefile中最常見的環(huán)境變量是VPATH。通常在一些大的工程中,有大量的源文件,并放在不同的目錄中。所以,當(dāng)make需要尋找文件依賴關(guān)系時,就要在文件前加上路徑。Makefile文件中的環(huán)境變量“VPATH”就是完成添加路徑的功能,如果沒有指明這個變量,make只會在當(dāng)前目錄下尋找依賴關(guān)系和目標(biāo)文件。如果定義了“VPATH”變量make就會在在當(dāng)前目錄下找不到所需文件的情況下,到指定的目錄中尋找文件。這有點(diǎn)類似gcc的目錄選項(xiàng)中的“-I”和“-L“選項(xiàng)。如果要添加多個目錄,一般使用“:”作為分隔。 

4、Makefile常用函數(shù)

  $(subst A, B, text)  將文本text中的每個A字符用B字符替換

  $(patsubst A, B, text)  將文本text中符合格式為A的字符,用格式B替換。

  $(strip text)  將text中多余的空格進(jìn)行壓縮(包括前導(dǎo)或者結(jié)尾的空格字符),并將多個空格變?yōu)閱蝹€空格

  $(findstring A, text)  在text中查找字符串A,如果找到返回值為A,否則為空

  $(sort text)  將text中的字按字母順序排序,并去掉其中重復(fù)的單詞。其輸出為單個空格隔開的單詞列表。如果第一個字母相同則比較第二個,依此類推

  $(word N, text)  將text中第N個單詞取出,并返回這個單詞。如果不存在第N個單詞,則返回值為空

  $(wordlist N1, N2, text)  取出text中第N1到第N2個單詞,其中N1,N2表示單詞在text的位置數(shù)字

  $(words text)  此函數(shù)表示統(tǒng)計(jì)text中的單詞數(shù)目

  $(filter A..., text)  在text中尋找由空格隔開并且匹配格式為A的字,去除不符合格式A的字符

  $(filter-out A..., text)  返回由空格隔開的 并且不匹配格式為A的字符,除去格式為A的字符

  $(dir text)  取出text中每個文件的路徑部分

  $(notdir text)  取出text中的每個文件名

  $(addsuffix A, text)  將text中每個文件名后添加后綴“A”

  $(addprefix A, text)  將text中每個文件名后添加前綴“A”

  $(if A, B, C)  判斷A,對變量A展開后,如果A的結(jié)果非空,則條件為真,同時將B作為函數(shù)的表達(dá)式;如果條件為假,則將C作為函數(shù)的表達(dá)式 

5、Makefile與shell 

  Makefile文件通過shell函數(shù)與外部進(jìn)行通信。它實(shí)現(xiàn)的功能同shell中的引用(``)類似,其返回結(jié)果是該命令在shell中執(zhí)行的結(jié)果。Make命令僅對它的返回值當(dāng)作字符串對待,如果函數(shù)返回結(jié)果中存在換行符,那么將其替換為空格,并去掉末尾的回車符號。在大多數(shù)情況下,make命令時在讀取解析Makefile時完成對函數(shù)shell的展開。

  shell函數(shù)的格式如下:

  $(shell shell-command)

  此函數(shù)的作用是在Makefile中執(zhí)行shell-command命令,并將它的執(zhí)行結(jié)果返回Makefile。  

6、Makefile規(guī)則語法

  Makefile中常見的規(guī)則包括顯示規(guī)則、隱式規(guī)則以及靜態(tài)模式規(guī)則3類。

  (1)顯示規(guī)則

  顯示規(guī)則描述了如何將“依賴文件”轉(zhuǎn)變?yōu)?ldquo;目標(biāo)文件”,書寫這種規(guī)則的Makefile需要用戶明確地給出目標(biāo)文件、目標(biāo)依賴文件的列表,以及更新目標(biāo)文件所需要的命令。

  (2)隱式規(guī)則

  隱式規(guī)則就像其名,它會把一部分規(guī)則“隱藏”,不要求用戶將所有的規(guī)則列出,也不需要詳細(xì)指定編譯的具體細(xì)節(jié),甚至有時候不需要任何規(guī)則,系統(tǒng)會根據(jù)要產(chǎn)生的可執(zhí)行文件及其依賴文件(典型的是根據(jù)文件名的后綴),自動推導(dǎo)出其依賴文件時如何使用默認(rèn)命令編寫規(guī)則的。例如:典型地,make命令對c文件的編譯過程是由.c源文件編譯成.o目標(biāo)文件。

  另外,在make命令執(zhí)行時,根據(jù)需要也可能用多個隱含規(guī)則。比如:make命令將從一個.y文件生成對應(yīng)的.c文件,再生成最終的.o文件。也就是說,只要目標(biāo)文件名中除后綴以外的其他部分相同,make命令就能夠使用若干個隱含規(guī)則來最終產(chǎn)生這個目標(biāo)文件(當(dāng)然,最原始的那個文件必須存在)。

  在Makefile中常見的隱式規(guī)則:

  c編譯:將file.c變?yōu)閒ile.o  $(CC)$(CPPFLAGS)$(CFLAGS) -c file.c -o file.o

  c++編譯:將file.cc變?yōu)閒ile.o  $(CXX)$(CPPFLAGS) -c file.cc -o file.o

  Pascal編譯:將file.p變?yōu)閒ile.o  $(CP)$(PFLAGS) -c file.p -o file.o

  Fortran編譯:將file.r變?yōu)閒ile.o  $(CP)$(FFLAGS) -c file.r -o file.o

  注:以上file均表示任意文件名

  (3)靜態(tài)模式規(guī)則

  模式規(guī)則是用來定義具有相同處理規(guī)則的多個文件。

  模式規(guī)則類似于普通規(guī)則,只是在模式規(guī)則中,目標(biāo)名需要包含模式字符“%”,該模式字符“%”被用來匹配一個文件名,可以匹配任何非空字符串在依賴文件中同樣可以使用“%”,依賴文件中的模式字符“%”的取值由目標(biāo)中的“%”來決定。例如:對于模式規(guī)則“%.o:%.c”,它表示的含義是:所有的.o文件依賴于對應(yīng)的.c文件,“%.c"可以匹配到所有以.c結(jié)尾的文件,“s%.c"可以匹配到所有第一個字母為“s”,而且必須以.c結(jié)尾的文件。

  要注意的是:模式字符“%”的匹配和替換發(fā)生在規(guī)則中所有變量和函數(shù)引用展開之后,變量和函數(shù)的展開一般發(fā)生在make讀取Makefile時,而模式規(guī)則中“%”的匹配和替換則發(fā)生在make執(zhí)行時。

  c語言的模式規(guī)則一般可描述為:

  %.o : %.c

    COMMAND

  這個模式規(guī)則指定了所有的文件“.c"都用來創(chuàng)建文件“.o",文件“.c"應(yīng)該是已存在的或者可被創(chuàng)建的。

  模式規(guī)則中的依賴文件也可以不包含模式字符“%”。當(dāng)依賴文件名中不包含模式字符“%”時,其含義是所有符合目標(biāo)模式的目標(biāo)文件都依賴于一個指定的文件(例如:“%.o : debug.h ”表示所有的".o"文件都依賴于頭文件"debug.h")。這樣的模式規(guī)則在很多場合是非常有用的。

  注:

  (1)在使用模式規(guī)則時,指定的目標(biāo)必須和目標(biāo)模式相匹配,否則執(zhí)行make時將會得到一個錯誤提示。

  (2)相比隱式規(guī)則,模式規(guī)則更能體現(xiàn)其優(yōu)點(diǎn)。對于無法確定工作目錄內(nèi)容或者不能確定是否存在無關(guān)文件,使用隱含規(guī)則可能會導(dǎo)致make命令失敗。其次,當(dāng)存在多個適合此文件的隱含規(guī)則時,系統(tǒng)將不能正確判斷使用何種規(guī)則也可能導(dǎo)致make失敗。在這兩種情況下使用模式規(guī)則,就可以避免這些不確定因素,因?yàn)殪o態(tài)模式中,指定的目標(biāo)文件有明確的規(guī)則描述其依賴關(guān)系。

  除了以上3中規(guī)則外,Makefile中還存在一些基礎(chǔ)規(guī)則,包括:

  (1)在Makefile文件中,除“終極目標(biāo)”所在的規(guī)則外,其余規(guī)則的順序在Makefile中沒有意義(終極目標(biāo)是指Makefile文件第一個規(guī)則的目標(biāo),一般是執(zhí)行make后生成的可執(zhí)行文件)。如果在Makefile中第一個規(guī)則有多個目標(biāo)的話,那么多個目標(biāo)中的第一個將會被作為make的“終極目標(biāo)”

  (2)規(guī)則的命令部分有兩種書寫方式,一種是把命令和依賴文件放在一行,中間使用分號(:)隔開,另一種是命令在依賴文件的下一行。當(dāng)作獨(dú)立的命令行時,此行必須以Tab開始。

  (3)對于Makefile中一個較長的行,我們可以使用反斜杠“”將其書寫到幾個獨(dú)立的行上。 

7、Makefile自動編寫工具

  autotool工具是當(dāng)今Linux世界中比較常用的Makefile自動生成工具。autotool是一系列工具,主要包括autoscan、autoconf、aclocal、autoheader、automake等。

  下面用一個簡單的程序exautomake.c來講述autotool編寫Makefile文件的方法。該文件的代碼如下:

  #include <stdio.h>

  int main()

  {

    printf( "this is the first automake example!" );
  }

  第一步:autoscan

  autoscan工具用來掃描當(dāng)前目錄下是否有生成Makefile的源文件(configure.scan、autoscan.log),如果沒有這兩個文件,系統(tǒng)會自動生成configure.scan、autoscan.log這兩個文件。

  因此,在命令行下輸入:

  #autoscan

  autom4te: configure.ac: no such file or directory
  autoscan: /usr/bin/autom4te failed with exit status: 1

  #ls

  autoscan.log configure.scan exautomake.c exautomake.c~

  其中,configure.scan是configure.in的原型,(configure.in是autoconf的腳步配置文件),所以下一步工作就是要對configure.scan進(jìn)行修改,將其轉(zhuǎn)化為configure.in。

  第二步:aclocal、autoconf及autoheader

  使用編輯器打開configure.scan文件,其內(nèi)容如下:

  # -*- Autoconf -*-
  # Process this file with autoconf to produce a configure script.

  AC_PREREQ(2.59)                           #命令行1
  AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)   #命令行2
  AC_CONFIG_SRCDIR([exautomake.c])                  #命令行3
  AC_CONFIG_HEADER([config.h])                    #命令行4

  # 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                              #命令行5

  命令行1中,AC_PREREQ用來聲明本文件要求的autoconf版本

  命令行2,用來定義軟件的名稱和版本等信息

  命令行3,AC_CONFIG_SRCDIR用來檢查所指定的源碼文件是否存在,來確定源碼目錄的有效性。這個參數(shù)一般不需要修改

  命令行4,AC_CONFIG_HEADER用于生成config.h文件,以便autoheader使用

  將configure.scan文件修改為configure.in,修改的地方共有4處:

  第一,將命令行2注釋掉,并在命令行2后添加一新行,并鍵入"AC_INIT(exautomake,1.0)",表示編寫該程序的名字及版本信息。

  第二,在命令行3前添加新行,并鍵入"AM_INIT_AUTOMAKE(exautomake,1.0)",這是automake必備的一行,同前面一樣,"exautomake"是所要產(chǎn)生的軟件的名字,"1.0"表示版本號,一般而言,第一次編寫版本號都可定為"1.0".

  第三,將命令行4修改為"AM_CONFIG_HEADER([config.h])".(實(shí)踐證明:改此處或者不改都可以)

  修改完畢后,將configure.scan在當(dāng)前目錄下另存為configure.in。接下來要運(yùn)行aclocal,系統(tǒng)會自動生成一個aclocal.m4文件,該文件的主要作用是處理當(dāng)前的定義行;隨后運(yùn)行autoconf命令,該命令同樣會在當(dāng)前目錄下生成一個名為configure的文件;最后執(zhí)行autoheader,它負(fù)責(zé)生成config.h.in文件。

  第四,將命令行5修改為"AC_OUTPUT([Makefile])".

  #aclocal

  #autoconf

  #autoheader

  第三步:automake

  automake的執(zhí)行至關(guān)重要。automake需要使用腳本配置文件Makefile.am,對于這個文件用戶需要自己創(chuàng)建。

  使用編輯器編寫程序Makefile.am如下:

  AUTOMAKE_OPTIONS=foreign          #命令行1

  bin_PROGRAMS=exautomake          #命令行2

  exautomake_SOURCES=exautomake.c     #命令行3

  其中,命令行1中,AUTOMAKE_OPTIONS表示為automake進(jìn)行設(shè)置的選項(xiàng)。automake提供了3種軟件等級:foreign、gnu、gnits,讓用戶選擇使用,默認(rèn)等級是gnu,在本例中使用foreign等級,只檢查必須的文件。

  命令行2中,bin_PROGRAMS表示要產(chǎn)生的可執(zhí)行文件名。如果要產(chǎn)生多個可執(zhí)行文件,每個文件名用空格隔開。

  命令行3中的exautomake_SOURCES是用來定義exautomake這個執(zhí)行程序的依賴文件。如果文件需要多個源文件,就要在后面添加生成它的源文件。例如:若生成的exautomake除需要exautomake.c外,還需要wth.c、wang.c,就要使用多個源文件定義方法"exautomake_SOURCES=exautomake.c wth.c wang.c".

  接下來就是使用automake生成configure.in文件,一般而言,在執(zhí)行automake時,要在后面添加選項(xiàng)"--add-missing",表示讓automake自動添加一些必要的腳步文件。

  #automake --add-missing

  第四步:運(yùn)行configure

  通過運(yùn)行configure,就可以把Makefile變成最終的Makefile

  #./configure

  到此為止,makefile就可以自動生成了。

  第五步:執(zhí)行make

  執(zhí)行make命令將默認(rèn)執(zhí)行make all,即編譯所有目標(biāo)體,執(zhí)行完畢,會在當(dāng)前目錄下生成exautomake的可執(zhí)行文件。

  使用autotools工具除生成exautomake目標(biāo)之外,還默認(rèn)生成install(安裝該程序到系統(tǒng)中),clean(清楚之前編譯的所有可執(zhí)行文件及目標(biāo)文件)等目標(biāo)文件。

  

  

  

總結(jié)

以上是生活随笔為你收集整理的软件开发工具——Make的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。