首頁 後端開發 php教程 linux下使用autoconf和automake產生Makefile原理詳解

linux下使用autoconf和automake產生Makefile原理詳解

Nov 25, 2016 pm 03:43 PM
Automake linux makefile

身為Linux下的程式開發人員,一定都遇過Makefile,用make指令來編譯自己寫的程式確實是很方便。一般情況下,大家都是手寫一個簡單Makefile,如果要想寫出一個符合自由軟體慣例的Makefile就不那麼容易了. 在本文中,將介紹如何使用autoconf和automake兩個工具來幫助我們自動地產生符合自由軟體慣例的Makefile,這樣就可以像常見的GNU程式一樣,只要使用“./configure”,“make”,“make instal”就可以把程式安裝到Linux系統中去了。這將特別適合想做開放原始碼軟體的程式開發人員,又或如果你只是自己寫些小的Toy程序,那麼這篇文章對你也會有很大的幫助。

一、Makefile介紹

Makefile是用於自動編譯和鏈接的,一個工程有很多文件組成,每一個文件的改變都會導致工程的重新鏈接,但是不是所有的文件都需要重新編譯,Makefile中紀錄有檔案的訊息,在make時會決定在連結的時候需要重新編譯哪些檔案。

Makefile的宗旨是:讓編譯器知道要編譯一個檔案需要依賴其他的哪些檔案。當那些依賴檔案有了改變,編譯器會自動的發現最終的生成檔已經過時,而重新編譯對應的模組。

Makefile的基本結構不是很複雜,但當一個程式開發人員開始寫Makefile時,常常會懷疑自己寫的是否符合慣例,而且自己寫的Makefile經常和自己的開發環境相關聯,當系統環境變數或路徑發生了變化後,Makefile可能還要跟著修改。這樣就造成了手工書寫Makefile的諸多問題,automake剛好能很好地幫助我們解決這些問題。

使用automake,程式開發人員只需要寫一些簡單的含有預定義宏的文件,由autoconf根據一個宏文件生成configure,由automake根據另一個宏文件生成Makefile.in,再使用configure依據Makefile.in來產生一個符合慣例的Makefile。以下我們將詳細介紹Makefile的automake產生方法。

二、使用的環境

本文所提到的程式是基於Linux發行版本:Fedora Core release 1,它包含了我們要用到的autoconf,automake。

三、從helloworld入手

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

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

新建三個檔案:

helloworld.c  configure.in  Makefile.am
登入後複製

然後依次執行:

autoscan; aclocal; autoconf; automake --add-missing; ./configure; make; ./helloworld;
登入後複製

就可以看到Makefile被產生出來,而且可以將helloworld.c編譯通過。很簡單吧,幾個指令就可以做出一個符合慣例的Makefile,感覺如何呀。現在開始介紹詳細的過程:

1、建目錄

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

$ mkdir helloword
$ cd helloworld
登入後複製

2、 helloworld.c

然後用你自己最喜歡的編輯器寫一個hellowrold.c文件,例如命令:vi helloworld.c。使用下面的程式碼作為helloworld.c的內容。

int main(int argc, char** argv)
{
    printf("Hello, Linux World! ");
    return 0;
}
登入後複製

完成後保存退出。現在在helloworld目錄下就應該要有一個你自己寫的helloworld.c了。

3、產生configure

我們使用autoscan指令來幫助我們根據目錄下的原始碼產生一個configure.in的範本檔案。

指令:

$ autoscan
$ ls
configure.scan helloworld.c
登入後複製

執行後在hellowrold目錄下會產生一個檔案:configure.scan,我們可以拿它來當configure.in的藍本。

4,產生configure.in

現在將configure.scan改名為configure.in,編輯它,按下面的內容修改,去掉無關的語句:

Code
============================configure.in内容开始=========================================
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_INIT(helloworld.c)
AM_INIT_AUTOMAKE(helloworld, 1.0)
# 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(Makefile)
============================configure.in内容结束=========================================
登入後複製

5 執行aclocal和autoconf

和autoconf,分別會產生aclocal.m4及configure兩個檔案:

$ aclocal
$ls
aclocal.m4 configure.in helloworld.c
$ autoconf
$ ls
aclocal.m4 autom4te.cache configure configure.in helloworld.c
登入後複製

大家可以看到configure.in內容是一些宏定義,這些宏經autoconf處理後會變成檢查系統特性、環境變數、軟體必須的參數的shell腳本。

autoconf 是用来生成自动配置软件源代码脚本(configure)的工具。configure脚本能独立于autoconf运行,且在运行的过程中,不需要用户的干预。

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

aclocal根据configure.in文件的内容,自动生成aclocal.m4文件。aclocal是一个perl 脚本程序,它的定义是:“aclocal - create aclocal.m4 by scanning configure.ac”。

autoconf从configure.in这个列举编译软件时所需要各种参数的模板文件中创建configure。

autoconf需要GNU m4宏处理器来处理aclocal.m4,生成configure脚本。

m4是一个宏处理器。将输入拷贝到输出,同时将宏展开。宏可以是内嵌的,也可以是用户定义的。除了可以展开宏,m4还有一些内建的函数,用来引用文件,执行命令,整数运算,文本操作,循环等。m4既可以作为编译器的前端,也可以单独作为一个宏处理器.

6、新建Makefile.am

新建Makefile.am文件,命令:$ vi Makefile.am

内容如下:

AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=helloworld
helloworld_SOURCES=helloworld.c
登入後複製

automake会根据你写的Makefile.am来自动生成Makefile.in。Makefile.am中定义的宏和目标,会指导automake生成指定的代码。例如,宏bin_PROGRAMS将导致编译和连接的目标被生成。

7、运行automake

命令:

$ automake --add-missing
configure.in: installing `./install-sh'
configure.in: installing `./mkinstalldirs'
configure.in: installing `./missing'
Makefile.am: installing `./depcomp'
登入後複製

automake会根据Makefile.am文件产生一些文件,包含最重要的Makefile.in。

8、执行configure生成Makefile

$ ./configure
checking for a BSD-compatible install /usr/bin/install -c
checking whether build environment is sane yes
checking for gawk gawk
checking whether make sets $(MAKE) yes
checking for gcc gcc
checking for C compiler default output a.out
checking whether the C compiler works yes
checking whether we are cross compiling no
checking for suffix of executables
checking for suffix of object files o
checking whether we are using the GNU C compiler yes
checking whether gcc accepts -g yes
checking for gcc option to accept ANSI C none needed
checking for style of include used by make GNU
checking dependency style of gcc gcc3
configure: creating ./config.status
config.status: creating Makefile
config.status: executing depfiles commands
$ ls -l Makefile
-rw-rw-r-- 1 yutao yutao 15035 Oct 15 10:40 Makefile
登入後複製

你可以看到,此时Makefile已经产生出来了。

9、使用Makefile编译代码

$ make
if gcc -DPACKAGE_NAME="" -DPACKAGE_TARNAME="" -DPACKAGE_VERSION="" -
DPACKAGE_STRING="" -DPACKAGE_BUGREPORT="" -DPACKAGE="helloworld" -DVERSION="1.0"
-I. -I. -g -O2 -MT helloworld.o -MD -MP -MF ".deps/helloworld.Tpo"
-c -o helloworld.o `test -f 'helloworld.c' || echo './'`helloworld.c;
then mv -f ".deps/helloworld.Tpo" ".deps/helloworld.Po";
else rm -f ".deps/helloworld.Tpo"; exit 1;
fi
gcc -g -O2 -o helloworld helloworld.o
登入後複製

10, 运行helloworld

$ ./helloworld
Hello, Linux World!
登入後複製

这样helloworld就编译出来了,你如果按上面的步骤来做的话,应该也会很容易地编译出正确的helloworld文件。你还可以试着使用一些其他的make命令,如make clean,make install,make dist,看看它们会给你什么样的效果。感觉如何?自己也能写出这么专业的Makefile,老板一定会对你刮目相看。

四、深入浅出

针对上面提到的各个命令,我们再做些详细的介绍。

1、 autoscan

autoscan是用来扫描源代码目录生成configure.scan文件的。autoscan可以用目录名做为参数,但如果你不使用参数的话,那么autoscan将认为使用的是当前目录。autoscan将扫描你所指定目录中的源文件,并创建configure.scan文件。

2、 configure.scan

configure.scan包含了系统配置的基本选项,里面都是一些宏定义。我们需要将它改名为configure.in

3、 aclocal

aclocal是一个perl 脚本程序。aclocal根据configure.in文件的内容,自动生成aclocal.m4文件。aclocal的定义是:“aclocal - create aclocal.m4 by scanning configure.ac”。

4、 autoconf

使用autoconf,根据configure.in和aclocal.m4来产生configure文件。configure是一个脚本,它能设置源程序来适应各种不同的操作系统平台,并且根据不同的系统来产生合适的Makefile,从而可以使你的源代码能在不同的操作系统平台上被编译出来。

configure.in文件的内容是一些宏,这些宏经过autoconf 处理后会变成检查系统特性、环境变量、软件必须的参数的shell脚本。configure.in文件中的宏的顺序并没有规定,但是你必须在所有宏的最前面和最后面分别加上AC_INIT宏和AC_OUTPUT宏。

在configure.ini中:

#号表示注释,这个宏后面的内容将被忽略。

AC_INIT(FILE) 这个宏用来检查源代码所在的路径。

AM_INIT_AUTOMAKE(PACKAGE, VERSION) 這個巨集是必須的,它描述了我們將要產生的軟體包的名字及其版本號:PACKAGE是軟體包的名字,VERSION是版本號。當你使用make dist指令時,它會為你產生一個類似helloworld-1.0.tar.gz的軟體發行包,其中就有對應的軟體包的名字和版本號碼。

AC_PROG_CC  這個宏將檢查系統所使用的C編譯器。

AC_OUTPUT(FILE)  這個宏是我們要輸出的Makefile的名字。

我們在使用automake時,實際上還需要用到其他的一些宏,但我們可以用aclocal 來幫我們自動產生。執行aclocal後我們會得到aclocal.m4檔。

產生了configure.in和aclocal.m4 兩個巨集檔案後,我們就可以使用autoconf來產生configure檔了。

5、 Makefile.am

Makefile.am是用來產生Makefile.in的,需要你手工書寫。 Makefile.am中定義了一些內容:

AUTOMAKE_OPTIONS  這個是automake的選項。在執行automake時,它會檢查目錄下是否存在標準GNU軟體包中應具備的各種文件,例如AUTHORS、ChangeLog、NEWS等文件。當我們將其設定成foreign時,automake會改用一般軟體包的標準來檢查。

bin_PROGRAMS  這個是指定我們所要產生的可執行檔的檔名。如果你要產生多個可執行文件,那麼在各個名字間用空格隔開。

helloworld_SOURCES  這個是指定產生「helloworld」時所需要的原始碼。如果它用到了多個來源文件,那麼請使用空格符號將它們分開。例如需要helloworld.h,helloworld.c那請寫成helloworld_SOURCES= helloworld.h helloworld.c。

如果你在bin_PROGRAMS定義了多個可執行文件,則對應每個執行檔都要定義相對的filename_SOURCES。

6、 automake

我們使用automake,根據configure.in和Makefile.am產生Makefile.in。

選項--add-missing的定義是“add missing standard files to package”,它會讓automake加入一個標準的軟體包所必須的一些文件。

我們用automake產生出來的Makefile.in檔是符合GNU Makefile慣例的,接下來我們只要執行configure這個shell 腳本就可以產生合適的Makefile 檔了。

7、 Makefile

在符合GNU Makefiel慣例的Makefile中,包含了一些基本的預先定義的操作:

make  根據Makefile編譯原始碼,連接,產生目標文件,可執行檔。

make clean  清除上次的make指令所產生的object檔案(後綴為「.o」的檔案)及可執行檔。

make install  將編譯成功的執行檔安裝到系統目錄中,一般為/usr/local/bin目錄。

make dist  產生發佈軟體套件檔案(即distribution package)。這個指令將會將可執行檔及相關檔案打包成一個tar.gz壓縮的檔案用來作為發佈軟體的軟體包。它會在目前目錄下產生一個名字類似「PACKAGE-VERSION.tar.gz」的檔案。 PACKAGE和VERSION,是我們在configure.in中定義的AM_INIT_AUTOMAKE(PACKAGE, VERSION)。

make distcheck  產生發佈軟體包並對其進行測試檢查,以確定發布包的正確性。這個操作會自動把壓縮包檔解開,然後執行configure指令,並且執行make,來確認編譯不出現錯誤,最後提示你軟體包已經準備好,可以發佈了。
make distclean  類似make clean,但同時也將configure產生的檔案全部刪除掉,包括Makefile。

五、過程圖示

linux下使用autoconf和automake產生Makefile原理詳解

六、結束語

透過上面的介紹,你應該可以很容易地產生一個你自己的符合GNU慣例的Makefile檔案及對應的專案檔。如果你想寫出更複雜的且符合慣例的Makefile,你可以參考一些開放程式碼的專案中的configure.in和Makefile.am文件,例如:嵌入式資料庫sqlite,單元測試cppunit。


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1665
14
CakePHP 教程
1424
52
Laravel 教程
1322
25
PHP教程
1270
29
C# 教程
1250
24
Linux體系結構:揭示5個基本組件 Linux體系結構:揭示5個基本組件 Apr 20, 2025 am 12:04 AM

Linux系統的五個基本組件是:1.內核,2.系統庫,3.系統實用程序,4.圖形用戶界面,5.應用程序。內核管理硬件資源,系統庫提供預編譯函數,系統實用程序用於系統管理,GUI提供可視化交互,應用程序利用這些組件實現功能。

git怎麼查看倉庫地址 git怎麼查看倉庫地址 Apr 17, 2025 pm 01:54 PM

要查看 Git 倉庫地址,請執行以下步驟:1. 打開命令行並導航到倉庫目錄;2. 運行 "git remote -v" 命令;3. 查看輸出中的倉庫名稱及其相應的地址。

vscode上一步下一步快捷鍵 vscode上一步下一步快捷鍵 Apr 15, 2025 pm 10:51 PM

VS Code 一步/下一步快捷鍵的使用方法:一步(向後):Windows/Linux:Ctrl ←;macOS:Cmd ←下一步(向前):Windows/Linux:Ctrl →;macOS:Cmd →

notepad怎麼運行java代碼 notepad怎麼運行java代碼 Apr 16, 2025 pm 07:39 PM

雖然 Notepad 無法直接運行 Java 代碼,但可以通過借助其他工具實現:使用命令行編譯器 (javac) 編譯代碼,生成字節碼文件 (filename.class)。使用 Java 解釋器 (java) 解釋字節碼,執行代碼並輸出結果。

sublime寫好代碼後如何運行 sublime寫好代碼後如何運行 Apr 16, 2025 am 08:51 AM

在 Sublime 中運行代碼的方法有六種:通過熱鍵、菜單、構建系統、命令行、設置默認構建系統和自定義構建命令,並可通過右鍵單擊項目/文件運行單個文件/項目,構建系統可用性取決於 Sublime Text 的安裝情況。

Linux的主要目的是什麼? Linux的主要目的是什麼? Apr 16, 2025 am 12:19 AM

Linux的主要用途包括:1.服務器操作系統,2.嵌入式系統,3.桌面操作系統,4.開發和測試環境。 Linux在這些領域表現出色,提供了穩定性、安全性和高效的開發工具。

laravel安裝代碼 laravel安裝代碼 Apr 18, 2025 pm 12:30 PM

要安裝 Laravel,需依序進行以下步驟:安裝 Composer(適用於 macOS/Linux 和 Windows)安裝 Laravel 安裝器創建新項目啟動服務訪問應用程序(網址:http://127.0.0.1:8000)設置數據庫連接(如果需要)

git軟件安裝 git軟件安裝 Apr 17, 2025 am 11:57 AM

安裝 Git 軟件包括以下步驟:下載安裝包運行安裝包驗證安裝配置 Git安裝 Git Bash(僅限 Windows)

See all articles