亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 944 | 回復(fù): 0
打印 上一主題 下一主題

Makefile匯總 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2008-10-21 22:03 |只看該作者 |倒序?yàn)g覽
GNU make最初是Unix系統(tǒng)下的一個(gè)工具,設(shè)計(jì)之初是為了維護(hù)C程序文件不必要的重新編譯。使用make工具,可以將大型的開(kāi)發(fā)項(xiàng)目分解成多個(gè)更易于管理的模塊。
make是一個(gè)解釋Makefile文件中指令的命令工具,其最基本的功能就是通過(guò)Makefile文件來(lái)描述源程序之間的相互關(guān)系并自動(dòng)維護(hù)編譯工作,它會(huì)告訴系統(tǒng)以何種方式編譯何鏈接程序。一旦正確完成Makefile文件,剩下的就是在Linux終端下輸入make這樣的一個(gè)命令,就可以自動(dòng)完成所有的編譯任務(wù),并生成目標(biāo)文件程序。由此可見(jiàn)Makefile文件的重要價(jià)值。本文只是對(duì)Makefile相關(guān)知識(shí)的總結(jié),其內(nèi)容包括:1.GNU make基礎(chǔ)知識(shí)及原理;2.Makefile相關(guān)知識(shí);3.手工制作Makefile文件;4.利用autoconf和automake自動(dòng)生成Makefile文件
因?yàn)楸救艘矊儆诓锁B(niǎo)級(jí)別的,有不足的地方,各位包容,千萬(wàn)別仍雞蛋---謝謝
1.GNU make基礎(chǔ)知識(shí)及原理
GNU makede 工作流程如下:
1.查找當(dāng)前目錄下的Makefile文件
2.初始化文件中的變量
3.分析Makefile中的所有規(guī)則
4.為所有的目標(biāo)文件創(chuàng)造依賴(lài)關(guān)系
5.根據(jù)依賴(lài)關(guān)系,決定哪些目標(biāo)文件要重新生成
6.執(zhí)行生成命令
為了比較明了地說(shuō)明make工具的工作原理,舉個(gè)例子。比如我們的項(xiàng)目有以下文件。
源程序:main.c、test1.c、test.c
頭文件:head1.h、head2.h、head3.h
有源程序和頭文件編譯生成的目標(biāo)文件:main.o、test1.o、test2.o
以及有目標(biāo)文件鏈接生成的可執(zhí)行文件:test
它們的相互依賴(lài)關(guān)系:
main.c
head1.h    main.o
head2.h
head2.h
           test1.o
test1.c
test2.c
          test2.o   
head3.h
main.o
test1.o   test
test2.o
在該項(xiàng)目的所有文件當(dāng)中,目標(biāo)文件main.o的依賴(lài)文件是main.c、head1.h、head2.h;test.o的依賴(lài)文件是head2.h、test1.c;目標(biāo)文件test2.o的依賴(lài)文件是head3.h、test2.c;最終的可執(zhí)行文件依賴(lài)文件是main.o、test1.o、test2.o。執(zhí)行make命令時(shí),會(huì)首先處理test程序的所有依賴(lài)文件(.o文件)的更新規(guī)則,對(duì)于.o文件,會(huì)檢查每個(gè)依賴(lài)程序(.c和.h文件)是否有更新,其判斷依據(jù)主要是依賴(lài)文件的建立時(shí)間是否比所生成的目標(biāo)文件要晚,如果是,那么就會(huì)按規(guī)則重新編譯生成相應(yīng)的目標(biāo)文件,對(duì)于可執(zhí)行文件也是如此。make工具管理項(xiàng)目的過(guò)程是從最底層開(kāi)始。
make本身可以帶有參數(shù):Make 【選項(xiàng)】【宏定義】【目標(biāo)文件】
make命令的常用選項(xiàng):
-f file:指定Makefile的文件名
-n:打印出所有的執(zhí)行命令,但實(shí)際上并不執(zhí)行這些命令
-s:在執(zhí)行時(shí)并不打印命令名
-w:如果在make執(zhí)行時(shí)要改變目錄,則打印當(dāng)前的執(zhí)行目錄
-I:指定所有的Makefile所在的目錄
-h:help文檔,顯示Makefile的help信息
例:習(xí)慣makeflie文件名為Makefile,當(dāng)然以這知識(shí)習(xí)慣。我們可以自己隨意的命名。這時(shí)我們可以用帶-f的選項(xiàng)的make命令來(lái)指定Makefile文件
#make -f makename
2.Makefile相關(guān)知識(shí)
2.1 Makefile規(guī)則:
#注釋
目標(biāo)文件....:依賴(lài)文件列表
命令列表
注意:是按Tab建 不能用簡(jiǎn)單的空格建替代
2.2 變量的定義
immediate = deferred
immediate ?= deferred
immediate := immediate
immediate += deferred or immediate
define immediate
deferred
endef
GNU make中對(duì)變量的賦值有兩種方式:延時(shí)變量、立即變量。區(qū)別在于他們的定義方式和擴(kuò)展時(shí)的方式不同,前者在這個(gè)變量使用時(shí)猜擴(kuò)展開(kāi),即當(dāng)真正使用時(shí)這個(gè)變量的值猜確定;后者在定義時(shí)它的的值就已經(jīng)確定!=“、”?=“和使用define指令定義的變量是延時(shí)變量;”:=“定義是立即變量!?=“用來(lái)定義第一次出現(xiàn)的延時(shí)變量。
對(duì)于附加操作符”+=“,右邊的變量如果在前面使用(:=)定義為立即變量則它為立即變量,否則均為延時(shí)變量。
Makefile中變量直接定義不需要什么特變的格式 例如
CC=gcc #定義變量CC 并賦值gcc
引用變量用$() 如引用上述定義的CC變量
$(CC)
2.3 Makefile 中的函數(shù)
函數(shù)調(diào)用的格式如下:
$(function arguments)
function為函數(shù)名 arguments為該函數(shù)的參數(shù),之間用空格或鍵,多個(gè)參數(shù)用逗號(hào)隔開(kāi)。
(1)$(subst from,to,text)
在文本text中用to替代from
(2)$(findstring find,in)
在字符串”in“中查找find,找到返回find , 否則返回值為空
(3) $(shell command arguments)
例:當(dāng)前目錄下有1.c、2.c、1.h、2.h
src :=$(shell ls *.c)
則結(jié)果為”1.c 2.c“
。。。。。。
由于函數(shù)較多這里不一一介紹
2.4 Makefile文件中的變量
$@:指代當(dāng)前規(guī)則下的目標(biāo)文件列表
$
#include
int main(int argc,char *argv[])
{
printf("hello makefile!\n");
return 0;
}
Makefile文件
src :=$(shell ls *c)
CC=gcc
main:main.c
        $(CC) -o main $(src)
clean:
       rm -rf *.o  
第一行src變量的值為main.c
第二行指定編譯器為gcc
第三行main 的依賴(lài)文件為main.c
其中clean為偽目標(biāo),它規(guī)定make應(yīng)該執(zhí)行的命令,即刪除所有編譯過(guò)程中產(chǎn)生的中間目標(biāo)文件。由于偽目標(biāo)clean沒(méi)有任何依賴(lài),所以make命令會(huì)認(rèn)為該目標(biāo)是最新的而不會(huì)執(zhí)行任何操作,所以還必須手工執(zhí)行如下命令
make clean
這樣在該目錄下會(huì)生成可執(zhí)行文件main,并刪除編譯過(guò)程產(chǎn)生的中間目標(biāo)文件,執(zhí)行main
./main
屏幕會(huì)打印出
hello makefile!
4.利用autoconf和automake自動(dòng)生成Makefile文件
Autoconf上可以自動(dòng)生成一個(gè)shell腳本,利用他你可在不同的unix下自動(dòng)生成特定的Makefile文件,而且這個(gè)腳本可以脫離autoconf來(lái)運(yùn)行。生成的這個(gè)腳本名字叫configure,執(zhí)行他后。
4.1  在/root/project/main目錄下創(chuàng)建一個(gè)文件main.c,其內(nèi)容如下:
------------------------------------------------
#include  
int main(int argc, char** argv)
{
    printf("Hello, Auto Makefile!\n");
    return 0;
}
------------------------------------------------
此時(shí)狀態(tài)如下:
[root@localhost main]# ls
main.c
4.2  運(yùn)行 autoscan , 自動(dòng)創(chuàng)建兩個(gè)文件: autoscan.log configure.scan
此時(shí)狀態(tài)如下:
[root@localhost main]# autoscan
[root@localhost main]# ls
autoscan.log configure.scan main.c
4.3  我們可以拿上面的configure.scan作為configure.in的藍(lán)本,F(xiàn)在將configure.scan改名為configure.in,并且編輯它
mv configure.scan configure.in
vi configure.in
============================configure.in內(nèi)容開(kāi)始======================
# -*- 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內(nèi)容結(jié)束==========================
修改
修改后的結(jié)果:
------------------------------------------------
#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.57)
AC_INIT(main, 1.0,
639818399@163.com
)

AC_CONFIG_SRCDIR([main.c])
AC_CONFIG_HEADER([config.h])
AM_INIT_AUTOMAKE(main,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])
------------------------------------------------
4.4 運(yùn)行 aclocal, 生成一個(gè)“aclocal.m4”文件和一個(gè)緩沖文件夾autom4te.cache,該文件主要處理本地的宏定義。
此時(shí)的狀態(tài)是:
[root@localhost main]# aclocal
[root@localhost main]# ls
aclocal.m4 autom4te.cache autoscan.log configure.in  main.c
linux的版本不一樣得到的結(jié)果會(huì)稍有不同,但都會(huì)生成aclocal.m4 autom4te.cache這2個(gè)文件  
4.5  運(yùn)行 autoconf, 目的是生成 configure
此時(shí)的狀態(tài)是:
[root@localhost main]# autoconf
[root@localhost main]# ls
aclocal.m4      autoscan.log configure.in   main.c
autom4te.cache configure     
4.6  運(yùn)行 autoheader,它負(fù)責(zé)生成config.h.in文件。該工具通常會(huì)從“acconfig.h”文件中復(fù)制用戶附加的符號(hào)定義,因此此處沒(méi)有附加符號(hào)定義,所以不需要?jiǎng)?chuàng)建“acconfig.h”文件。
此時(shí)的狀態(tài)是:
[root@localhost main]# autoheader
[root@localhost main]# ls
aclocal.m4      autoscan.log configure   autom4te.cache config.h.in   configure.in main.c
4.7  下面即將運(yùn)行 automake, 但在此之前應(yīng)該做一下準(zhǔn)備工作!
首先
創(chuàng)建一個(gè) Makefile.am.這一步是創(chuàng)建Makefile很重要的一步,automake要用的腳本配置文件是Makefile.am,用戶需要自己創(chuàng)建相應(yīng)的文件。之后,automake工具轉(zhuǎn)換成Makefile.in。
這個(gè)Makefile.am的內(nèi)容如下:
------------------------------------------------
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=main
main_SOURCES=main.c
------------------------------------------------
其中的AUTOMAKE_OPTIONS為設(shè)置automake的選項(xiàng)。由于GNU(在第1章中已經(jīng)有所介紹)對(duì)自己發(fā)布的軟件有嚴(yán)格的規(guī)范,比如必須附 帶許可證聲明文件COPYING等,否則automake執(zhí)行時(shí)會(huì)報(bào)錯(cuò)。automake提供了三種軟件等級(jí):foreign、gnu和gnits,讓用 戶選擇采用,默認(rèn)等級(jí)為gnu。在本例使用foreign等級(jí),它只檢測(cè)必須的文件。
    bin_PROGRAMS定義要產(chǎn)生的執(zhí)行文件名。如果要產(chǎn)生多個(gè)執(zhí)行文件,每個(gè)文件名用空格隔開(kāi)。
    main_SOURCES定義“main”這個(gè)執(zhí)行程序所需要的原始文件。如果”main”這個(gè)程序是由多個(gè)原始文件所產(chǎn)生的,則必須把它所用到的所有原 始文件都列出來(lái),并用空格隔開(kāi)。例如:若目標(biāo)體“main”需要“main.c”、“sunq.c”、“main.h”三個(gè)依賴(lài)文件,則定義 main_SOURCES=main.c sunq.c main.h。要注意的是,如果要定義多個(gè)執(zhí)行文件,則對(duì)每個(gè)執(zhí)行程序都要定義相應(yīng)的file_SOURCES。
其次
使用automake對(duì)其生成“configure.in”文件,在這里使用選項(xiàng)“—adding-missing”可以讓automake自動(dòng)添加有一些必需的腳本文件。
運(yùn)行后的狀態(tài)是:
------------------------------------------------
[root@localhost main]# automake --add-missing
configure.in:8: installing `./missing'
configure.in:8: installing `./install-sh'
Makefile.am: installing `./depcomp'
[root@localhost main]# ls
aclocal.m4      config.h.in   configure.in~ main.c        Makefile.in
autom4te.cache configure     depcomp        Makefile.am missing
autoscan.log    configure.in install-sh     Makefile.am~
[root@localhost main]#
------------------------------------------------
4.8  運(yùn)行configure,在這一步中,通過(guò)運(yùn)行自動(dòng)配置設(shè)置文件configure,把Makefile.in變成了最終的Makefile。
運(yùn)行的結(jié)果如下:
------------------------------------------------
[root@localhost main]# ./configure
[root@localhost main]# ls
aclocal.m4      config.h.in    configure.in   main.c        Makefile.in
autom4te.cache config.log     configure.in~ Makefile      missing
autoscan.log    config.status depcomp        Makefile.am   stamp-h1
config.h        configure      install-sh     Makefile.am
這樣Makefile就自動(dòng)生成好了,
4.9  運(yùn)行 make,對(duì)配置文件Makefile進(jìn)行測(cè)試一下
此時(shí)的狀態(tài)如下:
------------------------------------------------
[root@localhost main]# make
運(yùn)行生成的文件 main:
------------------------------------------------
[root@localhost main]# ./main
Hello, Auto Makefile!
[root@localhost main]#
------------------------------------------------
目錄結(jié)構(gòu):
.
|-- Makefile
|-- Makefile.am
|-- Makefile.in
|-- README
|-- aclocal.m4
|-- config.cache
|-- config.log
|-- config.status
|-- configure
|-- configure.in
|-- configure.scan
|-- install-sh -> /usr/local/share/automake/install-sh
|-- missing -> /usr/local/share/automake/missing
|-- mkinstalldirs -> /usr/local/share/automake/mkinstalldirs
|-- src
|   |-- Makefile
|   |-- Makefile.am
|   |-- Makefile.in
|   |-- dlpi.lib
|   |   |-- Makefile
|   |   |-- Makefile.am
|   |   |-- Makefile.in
|   |   |-- dlpi.c
|   |   |-- dlpi.o
|   |   |-- dlpi_lib.h
|   |   `-- libdlpi.a
|   |-- p.c
|   |-- put
|   |-- put.c
|   |-- put.o
|   |-- t
|   |-- t.c
|   `-- t.o
`-- stamp-h
注:自動(dòng)第四部分利用autoconf和automake自動(dòng)生成Makefile文件,是我這幾天正在看的東西,網(wǎng)上有不少這方面的知識(shí),我這部分也就是對(duì)自己找到的幾份資料的綜合


本文來(lái)自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u2/81438/showart_1331708.html
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專(zhuān)區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP