1. 程式人生 > >教你如何使用automake生成Makefile檔案

教你如何使用automake生成Makefile檔案


1 引言

  眾所周知,Makefile主要用來組織原始碼的編譯,其語法在此不做闡述。經分析可發現,原始碼的組織結構通常有以下3種形式:

    1) flat:所有檔案都處在同一目錄

        所有原始檔、標頭檔案以及相關的庫檔案都處在當前的目錄中,不存在任何子目錄。

    2) shallow:主要原始碼處在頂層目錄,其他各部分處在子目錄

        主要原始檔在當前目錄中,而其它一些實現各部分功能的原始檔位於各自不同的目錄。

    3) deep:所有原始碼處在子目錄,頂層目錄存放配置資訊

        所有原始檔及自己寫的標頭檔案位於當前目錄的一個子目錄中,而當前目錄裡沒有任何原始檔。

    使用automake對以上3種原始碼組織結構的編譯過程在某些細節上存在一些差異,但是大概流程是一致的,如下圖所示:


圖1 生成Makefile的過程

2 建立過程

2.1 FLAT

  根據引言中對flat原始碼結構的描述“所有原始檔、標頭檔案以及相關的庫檔案都處在當前的目錄中,不存在任何子目錄可知其目錄結構如下圖所示:


圖2 flat原始碼結構
(注:將algo.c改為algo.h)
目錄說明:     add.c:實現加法運算 int my_add(int a, int b) { return (a + b); }
    sub.c:實現減法運算 int my_sub(int a, int b) { return (a - b); }     mul.c:實現乘法運算 intmy_mul(int a, int b) { return(a * b); }     div.c: 實現除法運算 intmy_div(int a, int b) { return(a / b); }     algo.h:標頭檔案宣告原始碼中實現的函式     test.c:在主函式中呼叫以上原始檔實現的函式,並展示運算結果 編譯步驟: 1) 執行autoscan     在目錄中執行autoscan命令,會生成檔案configure.scan,再將其重新命名為configure.in,最後還需要做如下修改。
    #autoscan     #mv configure.scan configure.in     #vim configure.in 修改過程:     ①、將AC_CONFIG_SRCDIR([sub.c])改為AC_CONFIG_SRCDIR([test.c]) - 注:使用有主函式main()的原始檔test.c取代sub.c     ②、將AC_CONFIG_HEADER([config.h])改為AM_CONFIG_HEADER([config.h])     ③、新增AM_INIT_AUTOMAKE(math, 1.0):其中math是希望生成的可執行程式的名字,1.0表示版本號     ④、將AC_OUTPUT改為AC_OUTPUT(Makefile):表示要建立的Makefile名
圖3 修改前後對比 2) 配置Makefile.am     在當前目錄中新建Makefile.am檔案,生成可執行檔案math,因此其配置內容為:
圖4 Makefile.am 3) 新建檔案     在當前目錄下新建檔案NEWS、README、ChangeLog、AUTHORS檔案,內容為空     #touch NEWS     #touch README     #touch ChangeLog     #touch AUTHORS 4) 生成configure     #aclocal   —— 該命令將以configure.in為輸入檔案,生成aclocal.m4     #autoconf  —— 該命令將以configure.in和aclocal.m4為輸入檔案,生成檔案configure     #autoheader 5) 生成Makefile.in     #automake -a (該命令將以configure.in和Makefile.am為輸入檔案,生成檔案Makefile.in) 6) 執行./configure     配置安裝程式,並生成Makefile 7) 編譯原始碼     經過以上步驟,已經生成了Makefile,此時只需執行make,便可以編譯原始碼,並生成可執行程式了; 8) 執行結果     完成以上所有操作之後,在當前目錄下就生成了可執行程式math,其最終的執行結果如下圖所示:
圖5 flat結果

2.2 SHALLOW

    根據引言中對shallow原始碼結構的描述“要原始檔在當前目錄中,而其它一些實現各部分功能的原始檔位於各自不同的目錄”可知其目錄結構如下圖所示:


圖6 shallow原始碼結構 目錄說明:     add/add.c:實現加法運算 int my_add(int a, int b) { return (a + b); }     sub/sub.c:實現減法運算 int my_sub(int a, int b) { return (a - b); }     mul/mul.c:實現乘法運算 int my_mul(int a, int b) { return (a * b); }     div/div.c: 實現除法運算 int my_div(int a, int b) { return (a / b); }     incl/algo.h:標頭檔案宣告原始碼中實現的函式     test.c:在主函式中呼叫以上原始檔實現的函式,並展示運算結果 編譯步驟: 1) 執行autoscan     在目錄中執行autoscan命令,會生成檔案configure.scan,再將其重新命名為configure.in,最後還需要做如下修改。     #autoscan     #mv configure.scan configure.in     #vim configure.in   修改過程:     ①、將AC_CONFIG_HEADER([config.h])改為AM_CONFIG_HEADER([config.h])     ②、新增AM_INIT_AUTOMAKE(math, 2.0):其中math是希望生成的可執行程式的名字,2.0表示版本號     ③、將AC_OUTPUT改為AC_OUTPUT([Makefile                                 ./add/Makeifle                                 ./sub/Makefile                                 ./mul/Makefile                                 ./div/Makefile]):表示要建立的Makefile名
圖7 修改前後對比 2) 配置Makefile.am     現在存在的目錄有頂層目錄math、add、sub、mul、div和incl,因此需要分別在對應新建Makefile.am檔案,一共6個。     1) 頂層目錄的Makefile.am
圖8 頂層目錄Makefile.am     配置說明:         ①、SUBDIRS:用來指明原始檔、庫檔案所在目錄         ②、CURRENTPATH:獲取當前程式碼所在目錄         ③、INCLUDES:指明標頭檔案所在目錄         ④、bin_PROGRAMS:指明生成的可執行檔案的名稱exec         ⑤、exec_SOURCES: 指明可執行程式依賴的原始檔         ⑥、exec_LDADD:指明連結時依賴的檔案         ⑦、exec_LDFLAGS:指明連結時需要的選項         ⑧、DEFS:指明編譯選項         ⑨、LIBS:指明程式還需要包含的庫     2) 原始檔目錄Makefile.am
圖9 子目錄add中的Makefile.am     這裡使用了欺騙手段,欺騙automake需要生成可執行程式add,讓它生成依賴檔案add.o和執行命令。所以當執行完automake命令後,需要修改對應目錄下的Makefile.in,刪除其中的LINK語句。     配置說明:         ①、noinst_PROGRAMS:指明需要生成的可執行程式的名稱,在此因為不要安裝,所以使用關鍵字noinst_PROGRAMS;如果需要安裝,則使用bin_PROGRAMS。         ②、exec_SOURCES:指明可執行程式依賴的檔名         ③、DEFS:指明編譯選項     因sub、mul以及div目錄的作用與add相似,因此,他們的Makefile.am配置是極其相似,只需將其中的add改為sub、mul或div即可,在此不再迭述。     3) 標頭檔案Makefile.am     將被原始碼使用的標頭檔案加入到對應的變數include_HEADERS中即可:
圖10 標頭檔案Makefile.am 3) 新建檔案     在當前目錄下新建檔案NEWS、README、ChangeLog、AUTHORS檔案,內容為空     #touch NEWS     #touch README     #touch ChangeLog     #touch AUTHORS 4) 生成configure     #aclocal    —— 該命令將以configure.in為輸入檔案,生成aclocal.m4     #autoconf   —— 該命令將以configure.in和aclocal.m4為輸入檔案,生成檔案configure     #autoheader 5) 生成Makefile.in     #automake -a  —— 該命令將以configure.in和Makefile.am為輸入檔案,生成檔案Makefile.in     因生成add.o、sub.o、mul.o和div.o使用了欺騙的手段,所以當執行完automake命令後,需要修改對應目錄下的Makefile.in,刪除其中的LINK語句
圖11 修改前後對比     因add、sub、mul與div的功能相似,所以其修改過程也是極其一致的,在此不再迭述。 6) 執行./configure     配置安裝程式,並生成Makefile 7) 編譯原始碼     #make     #make install     便可完成原始碼的編譯和程式的安裝; 8) 執行結果     完成以上所有操作之後,在當前目錄下就生成了可執行程式math,其最終的執行結果如下圖所示: 圖12 shallow編譯結果

2.3 DEEP

    根據引言中對deep原始碼結構的描述“所有原始檔都放在子目錄中,頂層目錄只放配置資訊”可知其目錄結構如下圖所示:


圖13 deep原始碼結構 目錄說明:     add/add.c:實現加法運算 int my_add(int a, int b) { return (a + b); }     sub/sub.c:實現減法運算 int my_sub(int a, int b) { return (a - b); }     mul/mul.c:實現乘法運算 int my_mul(int a, int b) { return (a * b); }     div/div.c: 實現除法運算 int my_div(int a, int b) { return (a / b); }     incl/algo.h:標頭檔案宣告原始碼中實現的函式     main/test.c:在主函式中呼叫以上原始檔實現的函式,並展示運算結果 編譯步驟: 1) 執行autoscan     在目錄中執行autoscan命令,會生成檔案configure.scan,再將其重新命名為configure.in,最後還需要做如下修改。     #autoscan     #mv configure.scan configure.in     #vim configure.in 修改過程:     ①、將AC_CONFIG_SRCDIR([mul/mul.c])改為AC_CONFIG_SRCDIR([main/test.c])     ②、將AC_CONFIG_HEADER([config.h])改為AM_CONFIG_HEADER([config.h])     ③、新增AM_INIT_AUTOMAKE(math, 3.0):其中math是希望生成的可執行程式的名字,2.0表示版本號     ④、在AC_CONFIG_FILES([add/Makefile ...])中再新增一行main/Makefile     ⑤、將AC_OUTPUT改為AC_OUTPUT([Makefile])
圖14 修改前後對比 2) 配置Makefile.am     現在存在的目錄有頂層目錄math、add、sub、mul、div、main和incl,因此需要分別在對應新建Makefile.am檔案,一共7個。     1) 頂層目錄的Makefile.am
圖15 頂層目錄Makefile.am     配置說明:         ①、SUBDIRS:用來指明原始檔、庫檔案所在目錄         ②、CURRENTPATH:獲取當前程式碼所在目錄         ③、INCLUDES:指明標頭檔案所在目錄     2) 原始檔目錄Makefile.am
圖16 子目錄add中的Makefile.am     這裡使用了欺騙手段,欺騙automake需要生成可執行程式add,讓它生成依賴檔案add.o和執行命令。所以當執行完automake命令後,需要修改對應目錄下的Makefile.in,刪除其中的LINK語句。     配置說明:         ①、noinst_PROGRAMS:指明需要生成的可執行程式的名稱,在此因為不要安裝,所以使用關鍵字noinst_PROGRAMS;如果需要安裝,則使用bin_PROGRAMS。         ②、exec_SOURCES:指明可執行程式依賴的檔名         ③、DEFS:指明編譯選項     因sub、mul、div目錄的作用與add相似,因此,他們的Makefile.am配置是極其相似,只需將其中的add改為sub、mul或div即可,在此不再迭述。     3) 主函式中的Makefile.am
圖17 子目錄main中的Makefile.am     配置說明:         ①、bin_PROGRAMS:指明生成的可執行檔案的名稱exec         ②、exec_SOURCES: 指明可執行程式依賴的原始檔         ③、exec_LDADD:指明連結時依賴的檔案         ④、exec_LDFLAGS:指明連結時需要的選項         ⑤、DEFS:指明編譯選項         ⑥、LIBS:指明程式還需要包含的庫     4) 標頭檔案Makefile.am     將被原始碼使用的標頭檔案加入到對應的變數include_HEADERS中即可:
圖18 標頭檔案Makefile.am 3) 新建檔案     在當前目錄下新建檔案NEWS、README、ChangeLog、AUTHORS檔案,內容為空     #touch NEWS     #touch README     #touch ChangeLog     #touch AUTHORS 4) 生成configure     #aclocal    —— 該命令將以configure.in為輸入檔案,生成aclocal.m4     #autoconf   —— 該命令將以configure.in和aclocal.m4為輸入檔案,生成檔案configure     #autoheader 5) 生成Makefile.in     #automake -a  —— 該命令將以configure.in和Makefile.am為輸入檔案,生成檔案Makefile.in     因生成add.o、sub.o、mul.o和div.o使用了欺騙的手段,所以當執行完automake命令後,需要修改對應目錄下的Makefile.in,刪除其中的LINK語句
圖19 修改前後對比     因add、sub、mul與div的功能相似,所以其修改過程也是極其一致的,在此不再迭述。[注:main下的不用修改] 6) 執行./configure     完成安裝路徑的配置和Makefile的生成; 7) 編譯原始碼     #make     #make install     便可完成原始碼的編譯和程式的安裝; 8) 執行結果     完成以上所有操作之後,在當前目錄下就生成了可執行程式math,其最終的執行結果如下圖所示:
圖20 deep編譯結果

相關推薦

如何使用automake生成Makefile檔案

作者:鄒祁峰 郵箱:[email protected] 日期:2014.02.21 轉載請註明來自"祁峰"的CSDN部落格 1 引言   眾所周知,Makefile主要用來組織原始碼的編

例解 autoconf 和 automake 生成 Makefile 檔案

引子 無論是在Linux還是在Unix環境中,make都是一個非常重要的編譯命令。不管是自己進行專案開發還是安裝應用軟體,我們都經常要用到make或 make install。利用make工具,我們可以將大型的開發專案分解成為多個更易於管理的模組,對於一個包括幾百個原始檔的

automake自動生成makefile檔案

 Linux下程式設計時,為了方便編譯,往往使用Makefile檔案自動完成編譯,但是Makefile檔案本身的書寫十分複雜,規則很多。好在Linux為我們提供了自動生成功能完善的Makefile檔案的工具autoconf/automake。本文講述如何使用它們生成Make

一步步實現windows版ijkplayer系列文章之五——使用automake生成makefile

一步步實現windows版ijkplayer系列文章之一——Windows10平臺編譯ffmpeg 4.0.2,生成ffplay 一步步實現windows版ijkplayer系列文章之二——Ijkplayer播放器原始碼分析之音視訊輸出——視訊篇 一步步實現windows版ijkplayer系列文章之三——I

手把手利用前端字型檔案(.ttf)混淆數字來阻止爬蟲爬取網站資料

先上一張效果圖 假如 正確的數字是321456 這時候使用者看到的就是對的 而爬蟲在抓取資料的時候 抓到得是123456 混淆了數字 怎麼實現呢? 工具: 1、FontCreator (中文漢化破解版) 當然英語好或者土豪的可以無視 2、做好的字型圖片 步

如何使用Makefile編譯工程程式碼

                作者:鄒祁峰郵箱:[email protected]日期:2012.11.23轉載請註明來自"祁峰"的CSDN部落格1 前言概述  《跟我一起學Makefile》是一篇全面學習編寫Makefile基本規則的很好的文章,初學者應該好好理解裡面的知識要點。但是很多人學完之

如何將pdf檔案轉成ppt學習文件

大家都知道在我們從網路上下載的PDF是不能編輯複製的。怎樣將PDF轉換成ppt呢?這是我們首要處理的問題。還有,免費的PDF轉換器有嗎?pdf轉ppt會不會花很長時間?相信大家在使用軟體之前這些問題是避免不了的吧。關於PDF轉成ppt一些細節,我一直接用北斗PDF轉換器軟體的PDF轉換成ex

qmake使用方法(自動生成Makefile檔案

下面是qmake的簡單介紹和使用要領,更為詳細的資訊請參閱手冊qmake的介紹 手寫Makefile是比較困難並且容易出錯的,尤其是需要給不同的平臺和編譯器組合寫幾個Makefile。使用qmake,開發者建立一個簡單的“專案”檔案並且執行qmake生成適當的Makefile。qmake會注意所有的編譯器和平

automake 生成 makefile 簡單介紹

本文轉自:http://www.ibm.com,作者:楊 小華  蘇 春豔 本文介紹了在 linux 系統中,通過 Gnu autoconf 和 automake 生成 Makefile 的方法。主要探討了生成 Makefile 的來龍去脈及其機理,接著詳細介紹了配置 Co

如何生成一個簡潔又美觀的html報告及其簡單分析(三)

如何生成一個簡潔又美觀的html報告? 步驟一: 按照前面所講的,新建執行緒組,http請求等,設定各種場景和負載值,包括多少個執行緒,多少個使用者,迴圈多少次。 步驟二: 設定好了儲存,然後用命令列去啟動效能測試,檢視相關測試結果。 在cmd中輸入 (生成的報告我選擇建在D

windows下面用git for windows 分分鐘怎麼上傳檔案到github

怎麼上傳檔案到github          剛才重新整理了下csdn,看到我竟然有排名了,19372名,我插,好興奮,終於不是千里之外了,看到了這個數字,我要繼續加油,下一個目標衝刺到前一萬名去,題外話。         上傳檔案到github,前提得有github的賬

手把手如何把本地檔案傳到伺服器,如何對映[圖解]

步驟1:開啟遠端連線(可以點左下角開始>執行>輸入mstsc回車) 步驟2:點選項在出來的視窗中點“本地連線”,再點詳細資訊,然後在出來的視窗中的驅動器勾選一個你的對映到伺服器上的盤比如E盤。然後確定,再連線就可以了。  

工程專案利用AutoMake生成Makefile實戰

前一段時間突然心血來潮,準備在linux下玩玩介面,就想起把uCGUI移植到linux下,在移植的過程中遇到makefile的編寫,筆者是菜鳥,找了一些資料但還是沒弄清,不能運用自如,參考網上的但大多數是比較簡單的模型,離實際工程還有一段距離,很早就知道有automake這

由configure檔案生成Makefile檔案簡單介紹

跟我一起,10分鐘搞懂configure檔案自動生成Makefile檔案簡單步驟.1.準備原始碼 hello.c func1.c func1.h func2.c func2.c hello.c: #include <func1.h> void main() {

autoconf和automake生成makefile

用autoconf和automake生成makefile lautoconf 的輸入檔案是 configure.in lautomake的輸入檔案是 Makefile.am 1.用autoscan掃描原始碼目錄,為你生成configure.scan模板。 2.把con

Ubuntu下使用cmake結合CmakeLists.txt生成makefile檔案並進行編譯

1.CMake編譯原理CMake是一種跨平臺編譯工具,比make更為高階,使用起來要方便得多。CMake主要是編寫CMakeLists.txt檔案,然後用cmake命令將CMakeLists.txt檔案轉化為make所需要的makefile檔案,最後用make命令編譯原始碼生成可執行程式或共享庫(so(sha

三招快速檔案批量重新命名方法

在我們的工作生活中,不管是程式設計師還是非程式設計師,我們都會遇到過一個需求,那就是對一堆的檔案進行重新命名。在Windows下有很多優秀的軟體可以幫助我們完成這個需求,而在Linux環境下,我們可以簡單敲一些程式碼就可以完成這個需求。 本文良許將介紹三種最基本的檔案重新命名方法,因為比較基本,所以老司機可

手把手使用Android studio生成正式簽名的APK檔案

首先,成功編譯和執行程式: 專案code 執行效果圖 點選Android studio 右側工具欄的Gradle → 專案名 → :app → Tasks →android, 雙擊signingReport: 結果如圖所示: 也就是說,我們

三張圖生成一個Android jar 庫。

教程 water b2c 是把 eas mod div log 第三方 我看到非常多教人使用第三方開源組件的Android教程。都是在教基於源代碼project的庫導入,個人覺得非常不妥,覺得最恰當的方式是把源代碼project生成一個jar再導入到目標project上

一個簡單的執行程序的GNU automake自動生成Makefile的方法及案例

rect -o 創建 otool 其中 ner markdown ted head 一個簡單的執行程序的GNU automake自動生成Makefile的方法及案例 在GNU的世界裏,存在Automake這樣的工具進行自動生成Makefile文件,automake是由Per