關于Makefile,Makefile.in,Makefile.am,Configure功能及相互關系的問題

目錄

    • makefile寫法
    • 1. 簡介
    • 2. 上路之前
    • 3. 一個簡單的例子
    • 4.說明:
      • 4.1、autoscan
      • 4.2、 configure.scan
      • 4.3、aclocal
      • 4.4、autoconf
      • 4.5、Makefile.am
      • 4.6、 automake
      • 4.7、Makefile

makefile寫法

在 Unix 上寫程式的人大概都碰過 Makefile,尤其是用 C 來開發程式的人。用 make來開發和編譯程式的確很方便,可是要寫出一個 Makefile就不簡單了。偏偏介紹 Makefile 的文件不多,GNU Make 那份印出來要幾百頁的文件,光看完 Overview 就快陣亡了,難怪許多 人聞 Unix 色變。
本文將介紹如何利用 GNU Autoconf 及 Automake 這兩套軟體來協助我們『自動』產生 Makefile 檔,并且讓開發出來的軟體可以像 Apache, MySQL 和常見的 GNU 軟體一樣,只要會 ./configure'',make’’, ``make install’’ 就可以把程式安裝到系統中。如果您有 心開發 Open Source 的軟體,或只是想在 Unix 系統下寫寫程式。希望這份介紹文件能幫助您輕松地進入 Unix Programming 的殿堂。

1. 簡介

Makefile 基本上就是『目標』(target), 『關連』(dependencies) 和『動作』三者所組成的一連串規則。而 make 就會根據 Makefile 的規則來決定如何編譯 (compile) 和連結 (link) 程式。實際上,make 可做的不只是編譯和連結程式,例如 FreeBSD 的 port collect ion 中, Makefile 還可以做到自動下載原始程式套件,解壓縮 (extract) ,修補 (patch),設定,然後編譯,安裝至系統中。
Makefile 基本構造雖然簡單,但是妥善運用這些規則就也可以變出許多不同的花招。卻也因此,許多剛開始學習寫 Makefile 時會感到沒有規范可循,每個人寫出來的 Makefile 長得都不太一樣,不知道從何下手,而且常常會受限於自己的開發環境,只要環境變數不同或路 徑改一下,可能Makefile 就得跟著修改。雖然有 GNU Makefile Conventions (GNU Makefile 慣例) 訂出一些使用 GNU 程式設計時撰寫 Makefile 的一些標準和規范,但是內容很長而且很復雜, 并且經常做些調整,為了減輕程式設計師維護 Makefile 的負擔,因此有了Automake。

程式設計師只需寫一些預先定義好的巨集 (macro),交給 Automake 處理後會產生一個可供Autoconf 使用的 Makefile.in 檔。再配合利用Autoconf 產生的自動設定檔 configure即可產生一份符合 GNU Makefile慣例的 Makeifle 了。

2. 上路之前

在開始試著用 Automake 之前,請先確認你的系統已經安裝以下的軟體: 1. GNU Automake 2. GNU Autoconf 3. GNU m4 4. perl 5. GNU Libtool (如果你需要產生 shared library)
我會建議你最好也使用 GNU C/C++ 編譯器 、GNU Make 以及其它 GNU 的工具程式來做為開發的環境,這些工具都是屬於 Open Source Software不僅免費而且功能強大。如果你是使用Red Hat Linux 可以找到所有上述軟體的 rpm 檔,FreeBSD 也有現成的 package 可以直 接安裝,或著你也可以自行下載這些軟體的原始檔回來 DIY。以下的范例是在 Red Hat Linux 5.2 + CLE2 的環境下所完成的。
在這里插入圖片描述

3. 一個簡單的例子

Automake 所產生的 Makefile 除了可以做到程式的編譯和連結,也已經把如何產生程式文件(如 manual page, info 檔及 dvi 檔) 的動作,還有把原始程式包裝起來以供散 的動作都考慮進去了,所以原始程式所存放的目錄架構最好符合 GNU 的標準慣例,接下來我拿hello.c 來做為例子。
在工作目錄下建立一個新的子目錄 devel'',再在 devel 下建立一個hello’’ 的子目錄,這個目錄將作為我們存放 hello 這個程式及其相關檔案的地方:
% mkdir devel
% cd devel
% mkdir hello
% cd hello

用編輯器寫個 hello.c 檔,

#include <stdio.h>

int main(int argc, char *argv[])
{
printf(“Hello GNU!\n”);
return 0;
}
在這里插入圖片描述
接下來就要用 Autoconf 及 Automake 來幫我們產生 Makefile 檔了。

1、用 autoscan 產生一個 configure.in 的雛型,執行 autoscan 後會產生一個configure.scan 的檔案,我們可以用它做為configure.in檔的藍本。
. 在這里插入圖片描述
2、 編輯 configure.scan 檔,如下所示,并且把它的檔名改成configure.in
autoconfig用戶參考手冊 http://www.gnu.org/software/autoconf/manual/autoconf.html
automake用戶參考手冊 http://www.gnu.org/software/automake/manual/automake.html
修改后的configure.in文件內容如下:

.# -- Autoconf --
.# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([hello.c])
AC_CONFIG_HEADERS([config.h])

.# 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_CONFIG_FILES(Makefile)
AC_OUTPUT
在這里插入圖片描述
上面以AC開頭的宏來自autoconf,以AM開頭的宏來自automake。要從autoconf或 automake中尋求幫助,這一點很有用。以GNOME開頭的宏來自于Gnomemacros目錄。這些宏都是用m4宏語言寫的。如果將 autoconf和automake安裝在/usr目錄下,autoconf和automake中的標準宏一般放在/usr/share/aclocal 目錄下。

3、 執行 aclocal 和 autoheader ,分別會產生 aclocal.m4 及 configure.h.in 兩個檔案
% aclocal
% autoheader
注意:要修改文件名
在這里插入圖片描述
4、編輯 Makefile.am 檔,內容如下 :

.# cat Makefile.am
AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS = hello
hello_SOURCES = hello.c
hello_CPPFLAGS = -I /usr/include/
在這里插入圖片描述
5、 執行 automake --add-missing ,Automake 會根據 Makefile.am 檔產生一些檔案,包含最重要的 Makefile.in
% automake --add-missing

configure.ac:11: installing ‘./compile’
configure.ac:6: installing ‘./install-sh’
configure.ac:6: installing ‘./missing’
Makefile.am: installing ‘./depcomp’
在這里插入圖片描述
6. 執行 autoconf 得到 configure可執行腳本文件

% autoconf
在這里插入圖片描述
7. 執行測試:

執行./configure
執行 make 此時應該已經生成可執行文件,ls看一下
執行 make install
在這里插入圖片描述
在這里插入圖片描述
8. 測試程序:#可執行文件
make clean 清除編譯過程生成的文件
make uninstall 卸載
在這里插入圖片描述

4.說明:

4.1、autoscan

autoscan是 用來掃描源代碼目錄生成configure.scan文件的 .autoscan可以用目錄名做為參數,但如果你不使用參數的 話,那么autoscan將認為使用的是當前目錄.autoscan將掃描你所指定目錄中的 源文件,并創建configure.scan文件。

4.2、 configure.scan

configure.scan包含了系統配置的 基本選項,里面都是 一些宏定義.我們需要將它改名configure.in

4.3、aclocal

aclocal是 一個perl 腳本程序.aclocal根據configure.in文件的 內容,自動生成aclocal.m4件.aclocal的 定義是 :“aclocal - create aclocal.m4 by scanning configure.ac”.

4.4、autoconf

autoconf是 用來產生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文件了.

4.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.

4.6、 automake

我們使用automake --add-missing來產生Makefile.in.選項–add-missing的 定義是 “add missing standard files to package”,它會讓automake加入一個標準的 軟件包所必須的 一些文件.
  我們用automake產生出來的 Makefile.in文件是 符合GNU Makefile慣例的 ,接下來我們只要執行configure這個shell 腳本就可以產生合適的 Makefile 文件了.

4.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
  生成發布軟件包并對其進行測試檢查,以確定發布包的正確性.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378976.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378976.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378976.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

修改主鍵的SQL

declare defname varchar(100)declare cmd varchar(500)declare tablename varchar(100)declare keyname varchar(100) Set tablenameTemp1Set keynameid --需要設置的key,分隔 select defname name FROM sysobjects so JOIN sysconstraints sc ON so.id sc.constid …

西安理工大學863(轉載)

原創&#xff1a;https://blog.csdn.net/mzj15101229871/article/details/107613162 &#xff08;博主總結的很完整&#xff0c;很厲害&#xff0c;本人為了查看方便&#xff0c;才轉載的。本人只是個小白~&#xff09; 第一章 緒論 考試大綱 1&#xff09;了解數據元素、數…

原理簡介_消息通信的利器MQTT協議簡介及協議原理

- 沒用過但是必須得知道系列 -前言&#xff1a;相比于 XMPP&#xff0c; MQTT 的簡單輕量受到了不少工程師的喜愛&#xff0c;從物聯網到傳統的消息服務&#xff0c;簡單可依賴的 MQTT 到底為何讓人如此著迷呢&#xff1f;MQTT 協議&#xff0d;MQTT 協議簡介及協議原理MQTT(Me…

stl vector 函數_vector :: pop_back()函數以及C ++ STL中的示例

stl vector 函數C vector :: pop_back()函數 (C vector::pop_back() function) vector::pop_back() is a library function of "vector" header, it is used to deletes an element from the end of the vector, it deletes the element from the back and returns …

rtmp協議分析(Message 消息,Chunk分塊)

RTMP詳細分析&#xff08;三次握手&#xff09; librtmp分析&#xff08;發送數據包處理&#xff09; librtmp分析&#xff08;接收數據包處理&#xff09; 目錄1、Message(消息)2、Chunking(Message 分塊)2.1、 Basic Header(基本的頭信息)2.1.1、Basic Header為1個字節時2.1.…

【文摘】 雪念——作者:藍色妖姬

引用原文地址&#xff1a;點我 我本是惆悵之人&#xff0c;擁有不了所謂的快樂&#xff0c;筆尖譜寫不出唯美的風花雪月&#xff0c;只是流露這淡淡的疼痛&#xff0c;淡淡的哀傷。——藍色妖姬。 喜歡雪&#xff0c;喜歡佇立在雪地里&#xff0c;凝視著片片雪花從眼前飄落。 心…

將Sharepoint Server 2010部署到WINDOWS 7

首先祝CNBLOGS上的筒子們新年快樂。Sharepoint 2010 BETA版發布已經有段時間了&#xff0c;總是感覺MS的步伐要比我們這些追逐他的人快很多&#xff0c;不過確實他的每一次革新總給我們帶來了驚喜。 前幾天報名參加了SHAREPOINT 2010 DAY 活動(詳情)&#xff0c;等待著1月16日體…

嵌入式實訓-day1

完全復制一個文件的內容到另外一個文件 思路解析&#xff1a; 首先我這里使用了三個.c文件&#xff0c;分別是&#xff1a;yanyu.c、yanyu_old.c、yanyu_now.c 其中yanyu.c負責將yanyu_old.c中的內容讀入到buff緩沖區中&#xff0c;然后再從buff緩沖區中將數據寫入到yanyu_no…

stl中copy()函數_std :: rotate_copy()函數以及C ++ STL中的示例

stl中copy()函數C STL std :: rotate_copy()函數 (C STL std::rotate_copy() function) rotate_copy() function is a library function of algorithm header, it is used to rotate left the elements of a sequence within a given range and copy the rotating elements to…

計量經濟學建模_淺談統計學模型(兼計量經濟學模型)

計量經濟學模型是從統計學模型中衍生出來的&#xff0c;故將它們一并放在此處進行說明。實際上&#xff0c;很多人在很久之前就督促我寫一篇統計學和計量經濟學模型的文章&#xff0c;但我太懶惰&#xff0c;一直拖到現在&#xff0c;也是十分汗顏。先講一些統計學上的基礎故事…

linux文件存儲、inode、硬鏈接、軟鏈接

目錄介紹inode的內容inode的大小inode號碼目錄文件硬鏈接軟鏈接介紹 文件儲存在硬盤上&#xff0c;硬盤的最小存儲單位叫做"扇區"&#xff08;Sector&#xff09;。每個扇區儲存512字節&#xff08;相當于0.5KB&#xff09;。操作系統讀取硬盤的時候&#xff0c;不會…

OSPF路由器建立全毗鄰關系的狀態轉換過程

1&#xff09;Down狀態&#xff1a;路由器不與其他任何路由器交換任何OSPF消息&#xff1b;2&#xff09;Init狀態&#xff1a;接收方路由器已經接收到對端路由器的hello包&#xff0c;但是沒有從對端路由器的hello包中發現自己的router-id.。此時通信是單向的&#xff1b;3&am…

JavaScript打包與解包工具

JavaScript Packer&#xff1a; http://packer.skiyo.cn/ JavaScript UnPacker&#xff1a; http://packer.skiyo.cn/unpacker.html 轉載于:https://www.cnblogs.com/springmvc-hibernate/archive/2010/09/17/2484233.html

工具欄的打印圖標不見了_顯示屏下方的工具欄里的小圖標不見了怎么弄回來

優質回答 回答者&#xff1a;昂天大笑出門去一般右下角那些小圖標都是與系統同步啟動的一些功能&#xff0c;有的是沒必要讓它們同步啟動的&#xff0c;啟動的東西越多&#xff0c;系統反應就越慢。你說的工具欄里的小圖標沒了&#xff0c;可能是那些工具不能和系統同步啟動了&…

使用sshfs掛載linux遠程服務器目錄到windows

目錄下載winfsp 和 sshfs-win使用方式1、添加連接2、連接3、其他操作修改&#xff1a;刪除&#xff1a;下載winfsp 和 sshfs-win 前往 github 對應項目的 release 中下載最新版本&#xff1a; sshfs-win&#xff1a;https://github.com/billziss-gh/sshfs-win/releases winfs…

法學學士學位的完整形式是什么?

LL.B&#xff1a;拉丁文的Legum Baccalaureus(俗稱法學學士) (LL.B: Legum Baccalaureus in Latin (commonly known as Bachelor of Laws)) LL.B is an abbreviation of Legum Baccalaureus in Latin which is generally known as Bachelor of Laws. It is a bachelors degree …

Qt創建工程及導入資源圖片

一、打開軟件 二、 三、 四、 五、 六、 七、 導入其他文件資源&#xff0c;比如圖片資源&#xff1a; 一、 二、 三、 四、 五、 六、導入圖片 七、 八、 該圖片導入項目里面了

linux date命令設置時間

linux date命令設置時間其實很簡單 # date -s 20060925 # date -s 21:19:50 第一行設置日期&#xff0c;第二行設置時間。 轉載于:https://www.cnblogs.com/takeaction/archive/2013/01/21/2869107.html

protect 繼承_(轉)public、protect、private繼承方式 C++

C里面的結構體內的成員不受任何機制保護&#xff0c;直接能用&#xff0c;比如StructtypeA.x;StructtypeA.y;StructtypeA.fun();而c則不同&#xff0c;c的類像強化型的結構體public公有繼承protected保護繼承private私有繼承我們知道類的private和protected成員,在類外是不可以…

原型模型| 軟件工程

A prototype means a preliminary model of anything which gives us a rough idea about the basic functionalities that the real model would have. The prototyping model follows the same strategy. 原型意味著任何事物的初步模型&#xff0c;這使我們對真實模型具有的基…