Linux的Makefile-電子版課件_第1頁
Linux的Makefile-電子版課件_第2頁
Linux的Makefile-電子版課件_第3頁
Linux的Makefile-電子版課件_第4頁
Linux的Makefile-電子版課件_第5頁
已閱讀5頁,還剩56頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

Linux開發(fā)MakefileMakefile總述Makefile的語法使用makefile管理工程內(nèi)容總述Makefile的語法使用makefile管理工程總述Makefile關(guān)系到整個工程的編譯規(guī)那么;Makefile帶來的好處是“自動化編譯”;我們熟悉的開發(fā)工具實際上自動完成的makefile的創(chuàng)立工作。如:Tornado,Windows的IDE等??偸?程序的編譯和鏈接C或是C++,首先要把源文件變成中間代碼,在linux在是“.o”文件,這個一步動作叫做編譯〔compile〕;把大量的中間文件集合起來合并成一個可執(zhí)行文件,這個過程叫做鏈接〔link〕;在大多數(shù)時候,由于源文件太多,編譯生成的中間目標(biāo)文件太多,而在鏈接時需要明顯地指出中間目標(biāo)文件名,這對于編譯很不方便,所以,我們要給中間目標(biāo)文件打個包,在Windows下這種包叫“庫文件”〔LibraryFile),在linux,是ArchiveFile,也就是.a文件,或者是動態(tài)庫.so文件??偸?makefile的總體規(guī)那么如果這個工程沒有編譯過,那么我們的所有C文件都要編譯并被鏈接;如果這個工程的某幾個C文件被修改,那么我們只編譯被修改的C文件,并鏈接目標(biāo)程序;如果這個工程的頭文件被改變了,那么我們需要編譯引用了這幾個頭文件的C文件,并鏈接目標(biāo)程序??偸?make如何工作當(dāng)我們在終端輸入make命令后 1〕make命令會在當(dāng)前目錄下找名字叫“Makefile”或“makefile”的文件; 2〕如果找到,它會找文件中的第一個目標(biāo),需要注意的是,第一個目標(biāo)是makefile的最終目標(biāo); 3〕如果makefile的第一個目標(biāo)所需要的條件不符合或者是第一個目標(biāo)所依賴的文件比已經(jīng)生成的目標(biāo)文件新,就找下一個目標(biāo)來生成第一個目標(biāo)所依賴的條件; 這就是整個Make的依賴性,make會一層一層的去找依賴關(guān)系,并最終編譯出第一個目標(biāo)文件。總述-makefile的內(nèi)容Makefile里主要包含了五個東西:顯式規(guī)那么、隱晦規(guī)那么、變量定義、文件指示和注釋。 -顯示規(guī)那么:說明如何生成一個或多的的目標(biāo)文件; -隱晦規(guī)那么:make有自動推導(dǎo)的功能,所以隱晦的規(guī)那么可以讓我們比較粗糙地簡略地書寫Makefile -變量定義:變量一般都是字符串 -文件指示:在一個Makefile中引用另一個Makefile或者是指根據(jù)某些情況指定Makefile中的有效局部或者是定義一個多行命令 -注釋:注釋是用“#”字符。 最需要注意的是:在Makefile中的命令,必須要以[Tab]鍵開始總述-makefile的文件名默認(rèn)的情況下,make命令會在當(dāng)前目錄下按順序找尋文件名為“GNUmakefile”、“makefile”、“Makefile”的文件,建議使用“Makefile”這個文件名,因為,這個文件名第一個字符為大寫,比較醒目。最好不要用“GNUmakefile”,這個文件是GNU的make識別的;當(dāng)然也可以自己定義makefile的文件名,比方“make.linux”,“make.vxworks”等,這樣在make是就需要指定文件名了。如:make-fMake.Linux總述-make的工作方式1、讀入所有的Makefile。2、讀入被include的其它Makefile或文件。3、初始化文件中的變量。4、推導(dǎo)隱晦規(guī)那么,并分析所有規(guī)那么。5、為所有的目標(biāo)文件創(chuàng)立依賴關(guān)系鏈。6、根據(jù)依賴關(guān)系,決定哪些目標(biāo)要重新生成。7、執(zhí)行生成命令。思考為什么需要makefileMakefile是怎么工作的?內(nèi)容總述Makefile的語法使用makefile管理工程makefile的語法target...:prerequisites... command ... ...target也就是一個目標(biāo)文件,可以是ObjectFile,也可以是執(zhí)行文件。還可以是一個標(biāo)簽;prerequisites就是,要生成那個target所需要的文件或是目標(biāo);command也就是make需要執(zhí)行的命令〔任意的Shell命令〕。make并不管命令是怎么工作的,他只管執(zhí)行所定義的命令。make會比較targets文件和prerequisites文件的修改日期,如果prerequisites文件的日期要比targets文件的日期要新,或者target不存在的話,那么,make就會執(zhí)行后續(xù)定義的命令。makefile的語法-最簡單的makefile關(guān)聯(lián)多個源文件的makefilehello:hello.ofunc.o

gcchello.ofunc.o-ohellohello.o:hello.c

gcc-chello.c-ohello.ofunc.o:func.cfunc.h

gcc-cfunc.c-ofunc.omakefile的語法-使用變量定義變量:變量名=值調(diào)用變量:$(變量名)在多處使用同樣的信息時變量非常有用。makefile的語法-使用變量修改上面的例子PROC=helloCC=gccSOURCES=hello.cfunc.cOBJECTS=hello.ofunc.o$(PROC):$(OBJECTS) $(CC)-o$(PROC)$(OBJECTS)hello.o:hello.c $(CC)-ohello.o-chello.cfunc.o:func.cfunc.h $(CC)-ofunc.o-cfunc.c

makefile的語法-讓make自己推導(dǎo)GUN的make是非常強(qiáng)大的,它可以自動推導(dǎo)文件以及文件依賴關(guān)系后面的命令,于是我們就沒必要去在每一個[.o]文件后都寫上類似的命令,因為,我們的make會自動識別,并自己推導(dǎo)命令。;只要make看到一個[.o]文件,它就會自動的把[.c]文件加在依賴關(guān)系中,比方make找到一個hello.o那么hello.c就會是它的依賴文件。

makefile的語法-讓make自己推導(dǎo)所以上面的例子可以變的非常簡單:PROC=helloCC=gccOBJECTS=hello.ofunc.o$(PROC):$(OBJECTS)執(zhí)行這個make輸出的結(jié)果:gcc

-c-ohello.ohello.cgcc

-c-ofunc.ofunc.cgcc

hello.ofunc.o

-ohello

makefile的語法-常用變量名稱說明缺省CCC編譯器ccCFLAGSC參數(shù)CXXC++編譯器g++CXXFLAGSC++參數(shù)CPPC預(yù)處理,輸出處理結(jié)果$(CC)-ECPPFLAGS預(yù)處理參數(shù)ARarARFLAGSAR參數(shù)LDFLAGS鏈接參數(shù)makefile的語法-常用變量條件處理過程%.o<-%.c$(CC)-c$(CPPFLAGS)$(CFLAGS)%.o<-%.c,%.cpp,%.cc$(CXX)-c$(CPPFLAGS)$(CXXFLAGS)無擴(kuò)展名<-需求的對象$(CC)

$(LDFLAGS)$(LOADLIBES)

$(LDLIBS)makefile的語法-自動生成依賴性在Makefile中,我們的依賴關(guān)系可能會需要包含一系列的頭文件如果是一個比較大型的工程,你必需清楚哪些C文件包含了哪些頭文件,并且,你在參加或刪除頭文件時,也需要小心地修改Makefile,這是一個很沒有維護(hù)性的工作;大多數(shù)的C/C++編譯器都支持一個“-M”的選項,即自動找尋源文件中包含的頭文件,并生成一個依賴關(guān)系;如果你使用GNU的C/C++編譯器,你得用“-MM”參數(shù),不然,“-M”參數(shù)會把一些標(biāo)準(zhǔn)庫的頭文件也包含進(jìn)來。

makefile的語法-自動生成依賴性舉例:如果main.c包含頭文件“defs.h”gcc-Mmain.c的輸出是:

main.o:main.cdefs.h/usr/include/stdio.h/usr/include/features.h\/usr/include/sys/cdefs.h/usr/include/gnu/stubs.h\/usr/lib/gcc-lib/i486-suse-linux/2.95.3/include/stddef.h\/usr/include/bits/types.h/usr/include/bits/pthreadtypes.h\/usr/include/bits/sched.h/usr/include/libio.h\/usr/include/_G_config.h/usr/include/wchar.h\/usr/include/bits/wchar.h/usr/include/gconv.h\/usr/lib/gcc-lib/i486-suse-linux/2.95.3/include/stdarg.h\/usr/include/bits/stdio_lim.hgcc-MMmain.c main.o:main.cdefs.hmakefile的語法-偽目標(biāo)通常情況下makefile文件的第一個目標(biāo)為最終目標(biāo),后續(xù)目標(biāo)和最終目標(biāo)存在依賴關(guān)系;偽目標(biāo)并不是一個輸出文件,只是一個標(biāo)簽;可以通過一個特殊的標(biāo)記“.PHONY”來向make說明,這是一個偽目標(biāo);很顯然直接執(zhí)行“make”是不會執(zhí)行偽目標(biāo)的,但是可以通過執(zhí)行“make目標(biāo)”的方式來實現(xiàn);

makefile的語法-偽目標(biāo)hello:hello.ofunc.o

gcchello.ofunc.o-ohellohello.o:hello.c

gcc-chello.c-ohello.ofunc.o:func.cfunc.h

gcc-cfunc.c-ofunc.o.PHONY:cleanclean:rm–rfhellohello.ofunc.omakefile的語法-偽目標(biāo)從上面的例子可以看出,通過執(zhí)行“makeclean”命令可以刪除所有的目標(biāo)文件makefile的語法-偽目標(biāo)偽目標(biāo)也可以嵌套,例如:.PHONY:cleanobjcleanhellocleanobj: rm–rf*.oCleanhello: rm–rfhello 我們可以輸入“makecleanobj”或者“makecleanhello”命令以到達(dá)刪除不同文件的目的。makefile的語法-函數(shù)在makefile中經(jīng)常會使用到函數(shù)來讓我們的規(guī)那么更加靈活;$(<function><arguments>)或是${<function><arguments>}<function>是函數(shù)名,<arguments>是函數(shù)的參數(shù),參數(shù)間以逗號“,”分隔,而函數(shù)名和參數(shù)之間以“空格”分隔。函數(shù)調(diào)用以“$”開頭,以圓括號或花括號把函數(shù)名和參數(shù)括起。makefile的語法-函數(shù)注意:為了風(fēng)格的統(tǒng)一,函數(shù)和變量的括號最好一樣,如使用“$(substa,b,$(x))”這樣的形式,而不是“$(substa,b,${x})”的形式。makefile的語法-函數(shù)一個例子:comma:=,empty:=space:=$(empty)$(empty)foo:=abcbar:=$(subst$(space),$(comma),$(foo))在這里例子中$(bar)的最終取值為“a,b,c”makefile的語法-函數(shù)$(strip<string>) 名稱:去空格函數(shù)——strip。 功能:去掉<string>字串中開頭和結(jié)尾的空字符。 返回:返回被去掉空格的字符串值。 例如:$(stripabc)->abc$(findstring<find>,<in>) 名稱:查找字符串函數(shù)——findstring。 功能:在字串<in>中查找<find>字串。 返回:如果找到,那么返回<find>,否那么返回空字符串。 例如:$(findstringa,abc)->’a’$(findstringa,bc)->‘’makefile的語法-函數(shù)$(filter<pattern...>,<text>) 名稱:過濾函數(shù)——filter。 功能:以<pattern>模式過濾<text>字符串中的單詞,保存符合模式<pattern>的單詞。可以有多個模式。 返回:返回符合模式<pattern>的字串。例如:sources:=foo.cbar.cbaz.sugh.hfoo:$(sources)cc$(filter%.c%.s,$(sources))-ofoo$(filter%.c%.s,$(sources))返回的值是“foo.cbar.cbaz.s”。makefile的語法-函數(shù)$(sort<list>)名稱:排序函數(shù)——sort。功能:給字符串<list>中的單詞排序〔升序〕。返回:返回排序后的字符串。例如:$(sortfoobarlose)返回“barfoolose”。備注:sort函數(shù)會去掉<list>中相同的單詞。makefile的語法-函數(shù)$(dir<names...>)

名稱:取目錄函數(shù)——dir。功能:從文件名序列<names>中取出目錄局部。目錄局部是指最后一個反斜杠〔“/”〕之前的局部。如果沒有反斜杠,那么返回“./”。返回:返回文件名序列<names>的目錄局部。例如:$(dirsrc/foo.chacks)返回值是“src/”。makefile的語法-函數(shù)$(addsuffix<suffix>,<names...>)

名稱:加后綴函數(shù)——addsuffix。功能:把后綴<suffix>加到<names>中的每個單詞后面。返回:返回加過后綴的文件名序列。例如:$(addsuffix.c,foobar)返回值是“foo.cbar.c”。makefile的語法-函數(shù)foreach函數(shù) foreach函數(shù)和別的函數(shù)非常的不一樣。因為這個函數(shù)是用來做循環(huán)用的。 $(foreach<var>,<list>,<text>) 這個函數(shù)的意思是,把參數(shù)<list>中的單詞逐一取出放到參數(shù)<var>所指定的變量中,然后再執(zhí)行<text>所包含的表達(dá)式。每一次<text>會返回一個字符串,循環(huán)過程中,<text>的所返回的每個字符串會以空格分隔,最后當(dāng)整個循環(huán)結(jié)束時,<text>所返回的每個字符串所組成的整個字符串〔以空格分隔〕將會是foreach函數(shù)的返回值。makefile的語法-函數(shù)一個例子:names:=abcdfiles:=$(foreachn,$(names),$(n).o)

上面的例子中,$(name)中的單詞會被挨個取出,并存到變量“n”中,“$(n).o”每次根據(jù)“$(n)”計算出一個值,這些值以空格分隔,最后作為foreach函數(shù)的返回,所以,$(files)的值是“a.ob.oc.od.o”。makefile的語法-函數(shù)$(error<text...>)產(chǎn)生一個致命的錯誤,<text...>是錯誤信息$(warning<text...>)這個函數(shù)很像error函數(shù),只是它并不會讓make退出,只是輸出一段警告信息,而make繼續(xù)執(zhí)行makefile的語法-條件判斷使用條件判斷,可以讓make根據(jù)運(yùn)行時的不同情況選擇不同的執(zhí)行分支。條件表達(dá)式可以是比較變量的值,或是比較變量和常量的值;語法為:<conditional-directive><text-if-true>else<text-if-false>endif其中<conditional-directive>表示條件關(guān)鍵字“ifeq”,“ifneq”,“ifdef”,“ifndef”makefile的語法-條件判斷一個例子libs_for_gcc=-lgnunormal_libs=foo:$(objects)ifeq($(CC),gcc) $(CC)-ofoo$(objects)$(libs_for_gcc)else $(CC)-ofoo$(objects)$(normal_libs)endif思考如何使用變量;如何使用函數(shù);條件判斷有什么用?內(nèi)容總述Makefile的語法使用makefile管理工程使用makefile管理工程在一些大的工程中,我們會把我們不同模塊或是不同功能的源文件放在不同的目錄中,我們可以在每個目錄中都書寫一個該目錄的Makefile,這有利于讓我們的Makefile變得更加地簡潔,而不至于把所有的東西全部寫在一個Makefile中;我們把位于最上層的makefile稱為總控makefile。使用makefile管理工程例如:

有一個子目錄叫subdir,這個目錄下有個Makefile文件,來指明了這個目錄下文件的編譯。那么總控的Makefile可以這樣書寫: subsystem:cdsubdir&&$(MAKE)

這個例子的意思是說先進(jìn)入subdir,再執(zhí)行這個目錄中的“make”,執(zhí)行完成后會離開這個子目錄。使用makefile管理工程-實例以An6016-01系統(tǒng)的命令行進(jìn)程為例說明使用makefile管理工程的做法。目錄說明備注prj_cli命令行進(jìn)程源碼目錄該目錄下的makefile為總控,同時還有makefile的配置文件config.mkprj_msc所有功能庫的源碼目錄該目錄下makefile為編譯庫的總控makefileprj_msc/bridge_clientBridge客戶端源碼目錄該目錄下的makefile僅控制本目錄下的源碼編譯prj_msc/bridge_defunBridge命令行源碼目錄該目錄下的makefile僅控制本目錄下的源碼編譯prj_msc/bridge_includeBridge頭文件目錄該目錄下的makefile僅控制本目錄下的源碼編譯prj_msc/service_clientservice客戶端源碼目錄該目錄下的makefile僅控制本目錄下的源碼編譯prj_msc/service_defunservice命令行源碼目錄該目錄下的makefile僅控制本目錄下的源碼編譯prj_msc/service_includeservice頭文件目錄該目錄下的makefile僅控制本目錄下的源碼編譯prj_msc/target庫目標(biāo)文件目錄該目錄makefile負(fù)責(zé)生成動態(tài)庫/靜態(tài)庫prj_cli/target總目標(biāo)文件目錄該目錄下的makefile控制所有目標(biāo)文件的鏈接生成最終的可執(zhí)行文件makefile管理工程實例-配置文件通常情況將對一個工程的通用性描述、變量定義,工程平臺定義等內(nèi)容專門定義一個配置文件,同一個工程不同目錄的makefile都可以應(yīng)用這個配置文件,這樣以后的修改只用修改這個配置文件即可。提高維護(hù)性能。makefile管理工程實例-配置文件#######################################compileconfigfile#usedinallthemodules'makefile######################################TARGET_ARCH:=x86#定義目標(biāo)板架構(gòu)為X86LIB_TYPE:=a#定義庫的類型為靜態(tài)庫ifndefTARGET_ARCH TARGET_ARCH:=x86endififndefLIB_TYPE LIB_TYPE:=soendififeq($(TARGET_ARCH),ppc)#根據(jù)不同的架構(gòu)定義交叉編譯環(huán)境 CROSS_COMPILE:=ppc_85xx- BINDIR:=/opt/montavista/pro/devkit/ppc/85xx/binelse CROSS_COMPILE:= BINDIR:=/usr/binendif#根據(jù)目標(biāo)框架定義常用工具AS :=$(BINDIR)/$(CROSS_COMPILE)asCC :=$(BINDIR)/$(CROSS_COMPILE)gccCXX :=$(BINDIR)/$(CROSS_COMPILE)g++CPP :=$(BINDIR)/$(CC)-ELD :=$(BINDIR)/$(CROSS_COMPILE)ldAR :=$(BINDIR)/$(CROSS_COMPILE)arNM :=$(BINDIR)/$(CROSS_COMPILE)nmSTRIP :=$(BINDIR)/$(CROSS_COMPILE)stripOBJCOPY:=$(BINDIR)/$(CROSS_COMPILE)objcopyOBJDUMP:=$(BINDIR)/$(CROSS_COMPILE)objdumpRANLIB :=$(BINDIR)/$(CROSS_COMPILE)ranlib#定義公共文件目錄PUBLICDIR:=$(shellcd$(ROOTDIR);cd../public;pwd)定義根目錄TOPMOST:=$(shellcd$(ROOTDIR);cd..;pwd)#附加的包含頭文件路徑,各工程自己添加ADDINCLUDE:=$(TOPMOST)/prj_msc/msc_commADDINCLUDE+=-I$(TOPMOST)/prj_msc/include-I$(TOPMOST)/prj_msc/service_include-I$(TOPMOST)/prj_msc/bridge_include\ -I$(TOPMOST)/prj_onu_manage/include-I$(TOPMOST)/prj_msc/maintain_includemakefile管理工程實例-配置文件#根據(jù)目標(biāo)板架構(gòu)定義CFLAGS環(huán)境變量ifeq($(TARGET_ARCH),ppc)CFLAGS:=-I/opt/montavista/pro/devkit/ppc/85xx/target/usr/include\ -I/opt/montavista/pro/devkit/ppc/85xx/target/usr/include/glib-2.0\ -I/opt/montavista/pro/devkit/ppc/85xx/target/usr/lib/glib-2.0/include\ -I$(ROOTDIR)/include-I$(PUBLICDIR)-I$(ADDINCLUDE)CFLAGS+=-DLINUX=1-DUNIX=1-Dlinux-D__linux__-Dunix-D_GNU_SOURCE\-DLINUX_OS-Wallelse CFLAGS:=-I$(ROOTDIR)/include-I/usr/include/glib-2.0\ -I/usr/lib/glib-2.0/include\ -I$(PUBLICDIR)-I$(ADDINCLUDE)CFLAGS+=-DLINUX_OS-DTARGET_X86-WallEndififeq($(TARGET_ARCH),ppc) LDFLAGS:=-L$(ROOTDIR)/targetelse LDFLAGS:=-L$(ROOTDIR)/targetendififeq($(TARGET_ARCH),x86) CFLAGS+=-O0-ggdb LDFLAGS+=-O0-ggdbelse CFLAGS+=-Os LDFLAGS+=-OsendifLIBS:=pthreadmakefile管理工程實例-總控makefile〔prj_cli〕CURDIR :=$(shellpwd) #獲取當(dāng)前目錄include$(CURDIR)/config.mk #包含配置文件#定義該模塊包含的目錄MODULES:=../publicavlclilibmodulesusermanagetarget#定義本程序包含庫的源碼文件路徑LIBMODULES:=../prj_mscall: #最終目標(biāo) #用來指示工程路徑

echo$(CURDIR)>../public/project.mk

#用來指示目標(biāo)環(huán)境

echo"/*本文件由Makefile重建,不要編輯*/">../public/target.h#根據(jù)平臺框架指定公共頭文件ifeq($(TARGET_ARCH),x86) echo"#defineTARGET_X861">>../public/target.h echo"#undefTARGET_PPC">>../public/target.h

else echo"#defineTARGET_PPC1">>../public/target.h echo"#undefTARGET_X86">>../public/target.hendif #循環(huán)指定各個庫源碼目錄的makeformodulein$(LIBMODULES);domake-w-C$$modulemsclib;done

#用來指示工程路徑 echo$(CURDIR)>../public/project.mk#循環(huán)執(zhí)行本進(jìn)程源碼各個目錄的makefile formodulein$(MODULES);domake-w-C$$moduleall;done

clean: #偽目標(biāo)循環(huán)去除所有目錄包括子目錄生成的目標(biāo)文件 echo$(CURDIR)>../public/project.mk formodulein$(MODULES);domake-w-C$$moduleclean;done formodulein$(LIBMODULES);domake-w-C$$moduleclean;donemakefile管理工程實例-總控makefile〔prj_msc〕################################################################################Totalmakefiletocompiletheprojectand#whichdecidedbythevariable:################################################################################CURDIR :=$(shellpwd)include$(CURDIR)/config.mkMODULES:=../publicmsc_commmsc_multi_clientmsc_multi_servermsc_multi_virtual_svr\bridge_serverservice_serverbridge_marshalservice_marshaltargetMSCMODULES:=msc_commONUMODULES:=msc_onu_apimsc_onu_libESWMODULES:=msc_esw_apimsc_esw_libSERVICEMODULES:=service_marshalservice_clientmaintain_marshalmaintain_clientmaintain_serverBRIDGEMODULES:=bridge_marshalbridge_clientDEFUNMODULES:=bridge_defunservice_defunmaintain_defuntargetmakefile管理工程實例-總控makefile〔prj_msc〕本makefile的功能與prj_cli目錄makefile相似,目的也只是循環(huán)編譯各個子模塊〔子目錄〕的源碼生成目標(biāo)文件;從上面的變量定義可以看出,建議有多少個子模塊就需要定義幾個變量。makefile管理工程實例-target目錄makefile〔prj_msc〕目的是為了將已經(jīng)生成的所有源碼的目標(biāo)文件〔.o〕文件關(guān)聯(lián)生成動態(tài)庫〔.so〕或者靜態(tài)庫〔.a〕;將生成的庫文件拷貝到prj_cli的目標(biāo)文件夾中。makefile管理工程實例-target目錄makefile〔prj_msc〕TOPDIR :=$(shellpwd)ROOTDIR:=$(shellcd..;pwd)include$(ROOTDIR)/config.mkSOURCE:=$(wildcard*.c)$(wildcard*.cpp)OBJS:=$(patsubst%.c,%.o,$(patsubst%.cpp,%.o,$(SOURCE)))ONULIB:=libmsc_onu_lib.soESWLIB:=libmsc_esw_lib.soSERVICELIB:=libservice_client_lib.soBRIDGELIB:=libbridge_client_lib.soSERVICEDEFUNLIB:=libservice_defun_lib.soBRIDGEDEFUNLIB:=libbridge_defun_lib.soMAINTAINDEFUNLIB:=libmaintain_defun_lib.soMAINTAINLIB:=libmaintain_client_lib.somsclib: $(CC)-L.-fpic-shared-o$(ONULIB)$(TOPMOST)/prj_msc/msc_onu_lib/msc_onu_cli.o-lmsc_onu_api-lmsc_comm $(CC)-L.-fpic-shared-o$(ESWLIB)$(TOPMOST)/prj_msc/msc_esw_lib/msc_esw_client.o-lmsc_esw_api-lmsc_comm $(CC)-L.-fpic-shared-o$(SERVICELIB)$(TOPMOST)/prj_msc/service_client/*.o\ -lservice_marshal-lmaintain_marshal-lmsc_comm $(CC)-L.-fpic-shared-o$(BRIDGELIB)$(TOPMOST)/prj_msc/bridge_client/msc_bridge_client.o-lbridge_marshal-lmsc_comm $(CC)-L.-fpic-shared-o$(MAINTAINLIB)$(TOPMOST)/prj_msc/maintain_client/*.o-lmaintain_marshal-lmsc_comm $(CC)-L.-fpic-shared-o$(SERVICEDEFUNLIB)$(TOPMOST)/prj_msc/service_defun/*.o $(CC)-L.-fpic-shared-o$(BRIDGEDEFUNLIB)$(TOPMOST)/prj_msc/bridge_defun/*.o $(CC)-L.-fpic-shared-o$(MAINTAINDEFUNLIB)$(TOPMOST)/prj_msc/maintain_defun/*.omakefile管理工程實例-target目錄makefile〔prj_msc〕cp$(ONULIB)$(TOPMOST)/prj_cli/target cp$(ESWLIB)$(TOPMOST)/prj_cli/target cp$(SERVICELIB)$(TOPMOST)/prj_cli/target cp$(BRIDGELIB)$(TOPMOST)/prj_cli/target cp$(SERVICEDEFUNLIB)$(TOPMOST)/prj_cli/target cp$(BRIDGEDEFUNLIB)$(TOPMOST)/prj_cli/target cp$(MAINTAINDEFUNLIB)$(TOPMOST)/prj_cli/target cp$(MAINTAINLIB)$(TOPMOST)/prj_cli/target

makefile管理工程實例-模塊子目錄Makefile子目錄的makefile僅負(fù)責(zé)將本目錄下的源碼生成目標(biāo)文件;所有子目錄下的makefile都是一樣的,所以給我們的makefile維護(hù)工作帶來了極大的便利。makefile管理工程實例-模塊子目錄Makefile########################################moudlemakefile#######################################TOPDIR :=$(shellpwd)#本目錄為多工程共享,注意根目錄設(shè)置方法ROOTDIR:=$(shellcd../../public;catproject.mk)include$(ROOTDIR)/config.mkLIB =$(shellbasename$(TOPDIR)).$(LIB_TYPE)SOURCE:=$(wildcard*.c)$(wildcard*.cpp)OBJS:=$(patsubst%.c,%.o,$(patsubst%.cpp,%.o,$(SOURCE)))all: $(LIB)msclib: $(LIB)cliprog: $(LIB)$(LIB): $(OBJS)ifeq(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論