天天看點

.configure/make/make install的作用

1、make

根據makefile制定的規則,将c\c++檔案編譯成*.o檔案,然後進一步生成可執行檔案。

2、make clean

删除源代碼(C\C++ code)生成的執行檔案和所有的中間目标檔案。

3、make depend

一種makefile的規則,通過掃描整個目錄下的所有C\C++ 代碼,判斷檔案之間的依賴關系,如a.cc檔案中調用了b.h(如以形式include<b.h>),如果之後a.cc檔案被改動,那麼隻需要重新編譯a.cc檔案,不需要編譯b.h檔案。否則所有的檔案都需要重新編譯。

補充:

  一般來說,make其實是make all的省略;make後面跟的是target,即你要編譯的目标,在makefile裡面會列出這個target依賴于哪幾個别的target,别的target又依賴于另外的target,如此“遞歸”,最終會到依賴的源檔案和頭檔案;當然,也有可能這個target後面直接就是源檔案和頭檔案(最簡單的情況)。make all和make depend沒有本質差別,都是生成某個目标,隻是目标名稱不同而已;至于編譯的結果,就取決于makefile的寫法,如果makefile中目标all和目标depend的依賴一樣,那麼結果也将是相同的。你完全可以修改makefile,把他們的功能完全弄反。現階段,很多軟體已經不需要或者不支援make depend了,比如編譯linux 2.6的時候,根本不需要make depend,而早期的linux 2.4,則一般需要make depend這一步。總之,make的目标和功能完全由makefile決定。make 可以取代make depend.

一般順序:./configure;make clean;make depend;make重新編譯後使用make install或者./install安裝即可。

./configure && make && make install

./configure是用來檢測你的安裝平台的目标特征的。比如它會檢測你是不是有CC或GCC(cc是gcc的連接配接.gcc是編譯器.),并不是需要CC或GCC,它是個shell腳本。

make是用來編譯的,它從Makefile中讀取指令,然後編譯。

make install是用來安裝的,它也從Makefile中讀取指令,安裝到指定的位置。install 不是make的參數,而是再makefile(Makefile)中型如:install:的語句。如果用make install,那麼就執行install:後面的語句。

在linux安裝軟體會用到諸如configure/make/make install的指令,這些都是典型的使用GNU的AUTOCONF和AUTOMAKE産生的程式的安裝步驟。

  • ./configure是用來檢測你的安裝平台的目标特征的。比如它會檢測你是不是有CC或GCC,并不是需要CC或GCC,它是個shell腳本。
  • make是用來編譯的,它從Makefile中讀取指令,然後編譯。
  • make install是用來安裝的,它也從Makefile中讀取指令,安裝到指定的位置。

AUTOMAKE和AUTOCONF是非常有用的用來釋出C程式的東西。如果你也寫程式想使用AUTOMAKE和AUTOCONF,可以參考CNGNU.ORG上的相關文章。

1、configure,這一步一般用來生成 Makefile,為下一步的編譯做準備,你可以通過在 configure 後加上參數來對安裝進行控制,比如

代碼:./configure –prefix=/usr

   上面的意思是将該軟體安裝在 /usr 下面,執行檔案就會安裝在 /usr/bin (而不是預設的 /usr/local/bin),資源檔案就會安裝在 /usr/share(而不是預設的/usr/local/share)。同時一些軟體的配置檔案你可以通過指定 –sys-config= 參數進行設定。有一些軟體還可以加上 –with、–enable、–without、–disable 等等參數對編譯加以控制,你可以通過允許 ./configure –help 察看詳細的說明幫助。

    2、make ,這一步就是編譯,大多數的源代碼包都經過這一步進行編譯(當然有些perl或python編寫的軟體需要調用perl或python來進行編譯)。如果 在 make 過程中出現 error ,你就要記下錯誤代碼(注意不僅僅是最後一行),然後你可以向開發者送出 bugreport(一般在 INSTALL 裡有送出位址),或者你的系統少了一些依賴庫等,這些需要自己仔細研究錯誤代碼。

    3、make insatll,這條指令來進行安裝(當然有些軟體需要先運作 make check 或 make test 來進行一些測試),這一步一般需要你有 root 權限(因為要向系統寫入檔案)。

  **************************************************************************************************************************************

其實,Linux為我們想得比較周全,在Linux系統上的autoxxx系列腳本能協助我們輕松完成軟體包的制作過程,下面請先看一下這一系列工具之間的關系和制作軟體包的流程圖:

.configure/make/make install的作用

是不是被上圖吓着了?有些煩瑣,事實也确實是這個樣子,不過沒有辦法,要想包袱正規,且易于移植,忍一下無所謂的(如果你真的覺得有所謂,就不要再看下去了,等我給你寫的腳本吧!),哈哈!

簡單分析上圖,可以發現實際的入口之有兩個:source和Makefile.am,其他的隻是執行一些指令而已。每個指令的輸入輸出在上圖已經标得很清楚了,不再贅述。

簡單介紹一下每個檔案的作用:

  • configure.in: 這個檔案定義一些安裝此軟體系統需要具備的一些條件,如c編譯器,某個特定庫,諸如此類的東西。另外,他還定義一些編譯時可能用到的環境變量和源碼可能需要用到的一些宏。
  • Makefile.am: 這個檔案定義了make程式需要在此目錄所做的一些工作,比如說編譯某個可執行程式,編譯某個庫檔案啦!不過這個檔案的撰寫還是相對于Makefile要簡便的,不信就接着往下看!
  • config.h.in:是config.h的模闆了。
  • configure: 這個腳本可就功能強大了(BTW:體積也很大,動辄幾萬行),他會檢查系統目前編譯此軟體的條件是否充分,并動态定義一些宏和環境變量,并最終生成Makefile。
  • Makefile.in: 是Makefile的藍本。(是不是發現一個規律,autoxxx中的藍本檔案似乎都是以xxx.in指令的,不過奇怪的是為什麼不以諸如xxx.template的形式命名呢?我是不是問題多了點兒,whatever,不關大要的,不管了,如果了解為輸入檔案也就容易了解了,希望不是曲解!嘿嘿!)
  • config.h: 這個檔案比較重要了,一些關鍵的源碼中可能用到的宏都有可能位于這裡哦!
  • Makefile: 沒什麼好解釋的,用過的都知道他是用來build源碼的(還是羅嗦了)。