青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

sunrise

每天不斷學習,才能不斷提升自己。

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  64 隨筆 :: 0 文章 :: 92 評論 :: 0 Trackbacks
雖然很簡單還是弄了一個小時才搞定,成就感啊。。
轉自:http://blog.csdn.net/dybinx/article/details/6764874

編寫 make 規則: 
使用 gcc 的時候,用 -M 開關,它會為每一個你給它的C文件輸出一個規則,把目標文件 做為目的,而這個C文件和所有應該被 #include 的 header 文 件將做為依靠文件。注意這個規則會加入所有 header 文件,包 括被角括號(`<', `>')和雙引號(`"')所包圍的文件。其實系統 header 檔(比如 stdio.h, stdlib.h 等等一般不會被我們更改,如果用 -MM 來代替 -M 傳遞給 gcc,那些用角括號包圍的 header 檔將不會被包括。
$@ 擴展成當前規則的目的文件名, $< 擴展成依靠列表中的第 一個依靠文件,而 $^ 擴展成整個依靠的列表。

自動生成Makefile文件的操作:


1、首先,新建一個測試項目的目錄——hello:mkdir hello
然后,cd hello;編輯一個hello.c的代碼文件:
#include <stdio.h>
int main()
{
     printf("hello automake!\n");
}
保存退出;

2、執行autoscan命令,在當前路徑中生成了autoscan.log  configure.scan兩個新文件。其中configure.scan文件的內容如下:
AC_PREREQ(2.57)
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_CONFIG_SRCDIR([test.c])
AC_CONFIG_HEADER([config.h])
AC_PROG_CC
AC_OUTPUT

3、重命名configure.scan  為configure.in,編輯它的內容,修改后的內容為:
AC_PREREQ(2.57)
AC_INIT(hello)
AC_CONFIG_SRCDIR([hello.c])
#AC_CONFIG_HEADER([config.h])
AM_INIT_AUTOMAKE(hello, 1.0)
AC_PROG_CC
AC_OUTPUT([Makefile])

說明:Autoconf 是用來產生 'configure'文件的工具。'configure' 是一個 shell script,它可以自動設定符合各種不同平臺上Unix 系統的特性,并且根據系統參數及環境產生合適的Makefile文件或C 的頭文件(header file),讓原始程式可以很方便地在不同的平臺上進行編譯。Autoconf會讀取 configure.in 文件然后產生'configure' 這個 shell script。configure.in 文件內容是一系列GNU m4 的宏,這些宏經autoconf處理后會變成檢查系統特性的shell scripts。 configure.in 內宏的順序并沒有特別的規定,但是每一個configure.in 文件必須在所有宏前加入 AC_INIT 宏,然后在所有宏的最后加上 AC_OUTPUT宏。可先用 autoscan 掃描原始文件以產生一個 configure.scan 文件,再對 configure.scan 做些修改成 configure.in 文件。
AC_INIT(FILE) 
該宏用來檢查源代碼所在路徑,autoscan 會自動產生,一般無須修改它。
AM_INIT_AUTOMAKE(PACKAGE,VERSION) 
這個是使用 Automake 所必備的宏,PACKAGE 是所要產生軟件套件的名稱,VERSION 是版本編號。 
AC_PROG_CC 
檢查系統可用的C編譯器,若源代碼是用C寫的就需要這個宏。
AC_OUTPUT(FILE) 
設置 configure 所要產生的文件,若是Makefile ,configure 便會把它檢查出來的結果帶入 Makefile.in 文件后產生合適的 Makefile。 

4、執行aclocal命令,生成了aclocal.m4文件,一般無需修改這個文件。
5、新建Makefile.am文件,編輯內容如下:
            bin_PROGRAMS=test   
            test_SOURCES=test.c
說明:
Automake 會根據 configure.in 中的宏把Makefile.am 轉成 Makefile.in 文件。 Makefile.am 文件定義所要產生的目標: 
AUTOMAKE_OPTIONS
設置 automake 的選項。Automake 主要是幫助開發 GNU 軟件的人員來維護軟件,所以在執行 automake 時,會檢查目錄下是否存在標準 GNU 軟件中應具備的文件,例如 'NEWS'、'AUTHOR'、'ChangeLog' 等文件。設置 foreign 時,automake 會改用一般軟件的標準來檢查。 
bin_PROGRAMS 
定義要產生的執行文件名。如果要產生多個執行文件,每個文件名用空白符隔開
hello_SOURCES 
定義 'hello' 這個執行程序所需要的原始文件。如果 'hello'這個程序是由多個原始文件所產生,必須把它所用到的所有原始文件都列出來,以空白符隔開。假設 'hello' 還需要 'hello.c'、'main.c'、'hello.h' 三個文件的話,則定義 
hello_SOURCES= hello.c main.c hello.h 
如果定義多個執行文件,則對每個執行程序都要定義相對的filename_SOURCES

6、 執行autoconf命令,生成autom4te.cache和configure文件;
7、執行automake -a命令,生成depcomp  ,install-sh,mkinstalldirs,COPYING,INSTALL, missing文件;
說明:
編輯好 Makefile.am 文件,就可以用 automake --add-missing來產生 Makefile.in。加上 --add-missing 選項來告訴 automake順便假如包裝一個軟件所必須的文件。Automake產生生出來的 Makefile.in 文件是完全符合 GNU Makefile 的慣例,只要執行 configure這個shell script 便可以產生合適的 Makefile 文件了。 
在執行automake -a命令時可能會出現以下信息:
Makefile.am: required file `./NEWS' not found
Makefile.am: required file `./README' not found
Makefile.am: required file `./AUTHORS' not found
Makefile.am: required file `./ChangeLog' not found
這些對結果影響不大,如果不想產生這些讓人誤解的信息,可以手動建立這些文件:
>NEWS   
>README   
>AUTHORS   
>ChangeLog   

8、執行./configure,生成了Makefile文件
9、執行make,生成目標文件。

實戰Makefile.am

Makefile.am是一種比Makefile更高層次的規則。只需指定要生成什么目標,它由什么源文件生成,要安裝到什么目錄等構成。

表一列出了可執行文件、靜態庫、頭文件和數據文件,四種書寫Makefile.am文件個一般格式。


表 1Makefile.am一般格式
表 1Makefile.am一般格式 

對于可執行文件和靜態庫類型,如果只想編譯,不想安裝到系統中,可以用noinst_PROGRAMS代替bin_PROGRAMS,noinst_LIBRARIES代替lib_LIBRARIES。

Makefile.am還提供了一些全局變量供所有的目標體使用:


表 2 Makefile.am中可用的全局變量
表 2 Makefile.am中可用的全局變量 

在Makefile.am中盡量使用相對路徑,系統預定義了兩個基本路徑:


表 3Makefile.am中可用的路徑變量
表 3Makefile.am中可用的路徑變量 

在上文中我們提到過安裝路徑,automake設置了默認的安裝路徑:

1) 標準安裝路徑

默認安裝路徑為:$(prefix) = /usr/local,可以通過./configure --prefix=<new_path>的方法來覆蓋。

其它的預定義目錄還包括:bindir = $(prefix)/bin, libdir = $(prefix)/lib, datadir = $(prefix)/share, sysconfdir = $(prefix)/etc等等。

2) 定義一個新的安裝路徑

比如test, 可定義testdir = $(prefix)/test, 然后test_DATA =test1 test2,則test1,test2會作為數據文件安裝到$(prefix)/ /test目錄下。

我們首先需要在工程頂層目錄下(即project/)創建一個Makefile.am來指明包含的子目錄:


SUBDIRS=src/lib src/ModuleA/apple/shell src/ModuleA/apple/core 
CURRENTPATH=$(shell /bin/pwd)
INCLUDES=-I$(CURRENTPATH)/src/include -I$(CURRENTPATH)/src/ModuleA/apple/include
export INCLUDES

由于每個源文件都會用到相同的頭文件,所以我們在最頂層的Makefile.am中包含了編譯源文件時所用到的頭文件,并導出,見藍色部分代碼。

我們將lib目錄下的swap.c文件編譯成libswap.a文件,被apple/shell/apple.c文件調用,那么lib目錄下的Makefile.am如下所示:


noinst_LIBRARIES=libswap.a
libswap_a_SOURCES=swap.c
INCLUDES=-I$(top_srcdir)/src/includ

細心的讀者可能就會問:怎么表1中給出的是bin_LIBRARIES,而這里是noinst_LIBRARIES?這是因為如果只想編譯,而不想 安裝到系統中,就用noinst_LIBRARIES代替bin_LIBRARIES,對于可執行文件就用noinst_PROGRAMS代替 bin_PROGRAMS。對于安裝的情況,庫將會安裝到$(prefix)/lib目錄下,可執行文件將會安裝到${prefix}/bin。如果想安 裝該庫,則Makefile.am示例如下:


bin_LIBRARIES=libswap.a
libswap_a_SOURCES=swap.c
INCLUDES=-I$(top_srcdir)/src/include
swapincludedir=$(includedir)/swap
swapinclude_HEADERS=$(top_srcdir)/src/include/swap.h

最后兩行的意思是將swap.h安裝到${prefix}/include /swap目錄下。

接下來,對于可執行文件類型的情況,我們將討論如何寫Makefile.am?對于編譯apple/core目錄下的文件,我們寫成的Makefile.am如下所示:


noinst_PROGRAMS=test
test_SOURCES=test.c
test_LDADD=$(top_srcdir)/src/ModuleA/apple/shell/apple.o $(top_srcdir)/src/lib/libswap.a
test_LDFLAGS=-D_GNU_SOURCE
DEFS+=-D_GNU_SOURCE
#LIBS=-lpthread

由于我們的test.c文件在鏈接時,需要apple.o和 libswap.a文件,所以我們需要在test_LDADD中包含這兩個文件。對于Linux下的信號量/讀寫鎖文件進行編譯,需要在編譯選項中指明 -D_GNU_SOURCE。所以在test_LDFLAGS中指明。而test_LDFLAGS只是鏈接時的選項,編譯時同樣需要指明該選項,所以需要 DEFS來指明編譯選項,由于DEFS已經有初始值,所以這里用+=的形式指明。從這里可以看出,Makefile.am中的語法與Makefile的語 法一致,也可以采用條件表達式。如果你的程序還包含其他的庫,除了用AC_CHECK_LIB宏來指明外,還可以用LIBS來指明。

如果你只想編譯某一個文件,那么Makefile.am如何寫呢?這個文件也很簡單,寫法跟可執行文件的差不多,如下例所示:

noinst_PROGRAMS=apple
apple_SOURCES=apple.c
DEFS+=-D_GNU_SOURCE
posted on 2012-06-27 10:13 SunRise_at 閱讀(2402) 評論(1)  編輯 收藏 引用 所屬分類: linux開發

評論

# re: Makefile自動生成 2012-06-27 20:54 zgpxgame
mark
  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲精品欧美精品| 久久久久综合| 久久久999精品免费| 亚洲一区久久久| 亚洲免费一级电影| 欧美一区=区| 久久av一区二区三区漫画| 欧美一区中文字幕| 久久免费国产精品| 欧美顶级大胆免费视频| 亚洲黄色三级| 99综合在线| 欧美亚洲一区二区在线观看| 久久精品亚洲热| 欧美激情影音先锋| 国产精品蜜臀在线观看| 尤物在线观看一区| 在线一区免费观看| 久久亚洲风情| 艳妇臀荡乳欲伦亚洲一区| 午夜久久美女| 欧美成人国产一区二区| 国产精品入口日韩视频大尺度| 国产综合色在线| 日韩视频免费在线| 久久精品一区二区| 99成人在线| 久久一区二区三区四区| 国产精品二区在线| 最新国产の精品合集bt伙计| 亚洲欧美中文另类| 亚洲电影天堂av| 亚洲欧美在线x视频| 欧美福利一区| 国产一区999| 亚洲尤物在线| 亚洲靠逼com| 久久一区激情| 黑人巨大精品欧美一区二区| 亚洲一区3d动漫同人无遮挡| 欧美大片在线看免费观看| 亚洲制服少妇| 欧美性猛交99久久久久99按摩| 亚洲第一视频| 亚洲女同同性videoxma| 久久精品一区二区三区四区| 99精品欧美一区| 嫩草影视亚洲| 亚洲电影中文字幕| 久久欧美肥婆一二区| 亚洲专区在线| 国产精品美女主播| 亚洲免费在线| 夜夜嗨av一区二区三区网站四季av| 欧美不卡三区| 亚洲破处大片| 亚洲国产精品第一区二区三区| 久久精品一本| 伊人精品成人久久综合软件| 欧美怡红院视频一区二区三区| 一区二区久久| 国产精品久久久久毛片软件| 亚洲女爱视频在线| 亚洲免费视频中文字幕| 国产精品热久久久久夜色精品三区| 一区二区三区欧美在线| 亚洲美女尤物影院| 欧美吻胸吃奶大尺度电影| 一本一本a久久| av不卡在线| 国产精品视频你懂的| 欧美一区二区三区另类| 性欧美办公室18xxxxhd| 国内精品福利| 亚洲第一福利社区| 欧美日韩一区二区三区在线观看免| 一二三四社区欧美黄| 一本色道久久综合亚洲91| 国产精品美女久久久久久久| 久久精品动漫| 欧美 日韩 国产精品免费观看| 亚洲精品美女在线观看| 亚洲毛片在线观看.| 国产精品一区三区| 卡通动漫国产精品| 欧美激情国产日韩精品一区18| 亚洲一区二区高清| 久久爱www久久做| 99精品视频免费观看| 亚洲性感美女99在线| 精品动漫3d一区二区三区免费| 亚洲高清久久| 国产精品一卡二| 欧美激情一区二区三区在线| 欧美午夜电影在线| 猫咪成人在线观看| 国产精品xxxxx| 欧美激情一区二区三级高清视频| 国产精品国产三级国产aⅴ浪潮 | 国产精品久久久久9999| 久久手机免费观看| 欧美剧在线观看| 国产欧美日韩一区二区三区在线观看| 国内不卡一区二区三区| 欧美激情亚洲国产| 国产农村妇女毛片精品久久麻豆 | 欧美视频官网| 久久综合伊人77777| 欧美日韩一二三区| 欧美成在线观看| 国产麻豆精品在线观看| 亚洲精品乱码久久久久久日本蜜臀 | 欧美一区二区三区精品| 欧美a级在线| 久久男女视频| 国产精品自拍一区| 亚洲精品在线免费| 亚洲国产精品日韩| 久久久精品动漫| 久久久另类综合| 国产午夜精品一区理论片飘花| 夜夜嗨av一区二区三区网站四季av | 欧美日韩亚洲不卡| 欧美激情亚洲另类| 尹人成人综合网| 欧美一区二区三区精品电影| 亚洲尤物在线视频观看| 欧美日韩国产成人在线| 欧美成人免费va影院高清| 国内精品福利| 欧美资源在线观看| 久久一区二区三区国产精品| 国产日韩在线视频| 欧美亚洲在线视频| 久久久www成人免费无遮挡大片| 国产精品视频观看| 午夜精品久久久久久久久久久久久| 亚洲免费人成在线视频观看| 欧美精品一区在线发布| 最新中文字幕一区二区三区| 一本到高清视频免费精品| 欧美区一区二区三区| 日韩午夜电影| 亚洲欧美99| 国产午夜精品久久久| 久久精品盗摄| 欧美3dxxxxhd| 亚洲精品视频中文字幕| 欧美日韩高清区| 亚洲一区二区三区涩| 久久精精品视频| 亚洲高清不卡在线| 欧美日韩1区2区| 亚洲欧美日韩中文视频| 一区二区欧美在线观看| 亚洲男女自偷自拍| 欧美在线观看www| 国产亚洲电影| 久久精品视频va| 欧美电影免费观看高清完整版| 亚洲高清中文字幕| 亚洲天堂av在线免费观看| 国产日韩在线看片| 亚洲精选在线| 亚洲狼人精品一区二区三区| 一区二区电影免费在线观看| 欧美综合激情网| 国产精品v欧美精品v日本精品动漫| 亚洲人体影院| 亚洲精品乱码久久久久久日本蜜臀 | 欧美日韩精品一区视频 | 欧美激情影院| 国产在线成人| 亚洲欧美日韩国产精品| 夜夜夜久久久| 欧美一级精品大片| 欧美一区在线直播| 国产一区二区精品丝袜| 午夜久久资源| 久久综合给合久久狠狠色| 国产精品毛片一区二区三区 | 亚洲区免费影片| 香蕉久久夜色精品国产| 午夜国产精品视频| 国产精品美女主播在线观看纯欲| 亚洲高清不卡在线观看| 亚洲激情女人| 久久婷婷国产综合精品青草| 亚洲欧美激情四射在线日| 欧美日韩国产天堂| 亚洲一区二区三区四区在线观看| 亚洲图片欧洲图片日韩av| 国产午夜精品久久久久久免费视 | 美女视频黄 久久| 亚洲一区二区三区精品视频 | 99国产成+人+综合+亚洲欧美| 亚洲国产精品第一区二区三区 | 一区二区三区四区五区视频| 亚洲毛片在线看| 欧美日韩无遮挡|