版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1后綴名說明.cC語言源代碼文件.C/.cc/.cxxC++源代碼文件.h程序所包含的頭文件.i已經(jīng)預(yù)處理過的C語言源代碼文件.ii已經(jīng)預(yù)處理過的C++源代碼文件.mObjective-C語言源代碼文件.s匯編語言源代碼文件.S經(jīng)過預(yù)編譯的匯編語言源代碼文件.a/.so編譯后的庫代碼.o編譯后的目標(biāo)文件GNUC/C++編譯器的使用gcc通過擴(kuò)展名來判斷文件的類型,從而確定用何種方式處理該文件2GNUC/C++編譯器的使用gcc編譯器選項(xiàng)和參數(shù)參數(shù)含義-o<file>Placetheoutputinto<file>-cCompileandassemble,butdonotlink-ggdbProducedebugginginformationforusebyGDB.-Othecompilertriestoreducecodesizeandexecutiontime,withoutperforminganyoptimizationsthattakeagreatdealofcom-pilationtime.-gProducedebugginginformationintheoperatingsystem'snativeformat.GDBcanworkwiththisdebugginginformation.-I<dir>Addthedirectorydirtothelistofdirectoriestobesearchedforheaderfiles.Directoriesnamedby-Iaresearchedbeforethe-L<dir>Searchthelibrarynamedlibrarywhenlinking3GNUC/C++編譯器的使用1、直接通過編譯生成目標(biāo)代碼可執(zhí)行文件:$gcchello.c–ohello2、如果一個(gè)程序包含有多個(gè)源文件,則也可直接生成目標(biāo)代碼:voidf1(){printf(“%s\n”,"function1");}voidf2(){printf("%s\n","function2");}main(){f1();f2();}$gccf1.cf2.cmain.c–omain4Linux上廣泛使用的C語言編譯器是GNUC編譯器,GNUC建立在自由軟件基金會的編程許可證的基礎(chǔ)上,可以自由發(fā)布。在Linux下,一個(gè)完整的C語言開發(fā)環(huán)境到少包括以下三個(gè)組成部分:函數(shù)庫glibc(在/usr/lib和/lib目錄中)編譯器gcc系統(tǒng)頭文件glibc_header(*.h)glibc是構(gòu)成一個(gè)完整的C語言開發(fā)環(huán)境所必不可少的組成部分,也是Linux下C語言的主要函數(shù)庫。glibc_header中包含了系統(tǒng)編譯源代碼所需要的聲明文件,如果缺少系統(tǒng)頭文件,很多用到系統(tǒng)功能的C程序?qū)o法編譯。(包含在/usr/include/及其子目錄中)5GNUC/C++函數(shù)庫定義:是一些預(yù)先編譯好的函數(shù)的集合,那些函數(shù)都是按照可再使用的原則編寫的。它們通常是一組相互關(guān)聯(lián)的用來完成某項(xiàng)常見工作的函數(shù)構(gòu)成(比如c庫里面的標(biāo)準(zhǔn)輸入輸出函數(shù)、時(shí)間函數(shù)和數(shù)學(xué)函數(shù)等)。函數(shù)庫中的函數(shù)可以通過連接程序與應(yīng)用程序進(jìn)行連接,而不必在每次開發(fā)程序時(shí)都對這些通用的函數(shù)進(jìn)行編譯。不同類型的應(yīng)用程序?qū)褂貌煌暮瘮?shù)庫。如數(shù)學(xué)應(yīng)用將使用數(shù)學(xué)庫libm(/usr/lib/libm.a,/usr/lib/libm.so),標(biāo)準(zhǔn)的C庫libc(/usr/lib/libc.a,/usr/lib/libc.so)。注意:*.h只是對函數(shù)的聲明(declaration),函數(shù)的定義是在具體的函數(shù)庫中6所有的程序都將使用標(biāo)準(zhǔn)的C函數(shù)庫libc,該庫中包含了內(nèi)存管理或輸入輸出操作的基本函數(shù),這些庫都存放在/usr/lib或/lib這些系統(tǒng)公用的目錄中,系統(tǒng)中的任何用戶都可以利用這些庫。注:用戶可以自己定義自己的函數(shù)庫!庫可以有三種使用的形式:靜態(tài)庫(*.a):代碼在編譯時(shí)就已連接到開發(fā)人員開發(fā)的應(yīng)用程序中。靜態(tài)庫在程序編譯時(shí)會被連接到目標(biāo)代碼中,程序運(yùn)行時(shí)將不再需要該靜態(tài)庫共享庫(sharedobject,以*.so作為后綴):只是在程序開始運(yùn)行時(shí)才載入,在編譯時(shí),只是簡單地指定需要使用的庫函數(shù)。動態(tài)庫:是共享庫的另一種變化形式,也是在程序運(yùn)行時(shí)載入,使用的庫函數(shù)不是在程序運(yùn)行開始,而是在程序中的語句需要使用該函數(shù)時(shí)才載入。類似于windowsOS中的DLL文件。7共享庫的生成方法動態(tài)庫可以在程序運(yùn)行期間釋放動態(tài)庫所占用的內(nèi)存,騰出空間供其他程序使用。由于共享庫和動態(tài)庫并沒有在程序中包括庫函數(shù)的內(nèi)容,只是包含了對庫函數(shù)的引用,因此代碼的規(guī)模比較小。生成用戶共享庫的方法:gcctest1.ctest2.ctest3.c-fPIC-shared-olibtest.so使用自定義的庫進(jìn)行編譯、連接gcctest.c-L.libtest.so-otest8靜態(tài)庫的生成方法靜態(tài)庫的生成方法:Step1:編譯而不連接$gcctest1.c-c-otest1.o$gcctest2.c-c-otest2.o$gcctest3.c-c-otest3.oStep2:生成ar命令生成靜態(tài)庫$arrcslibtest.atest1.otest2.otest3.oStep3:使用靜態(tài)庫編譯和連接,生成可執(zhí)行文件gcctest.c-L.libtest.a-otest9系統(tǒng)中可用的庫都存放在/usr/lib和/lib目錄中。庫文件名由前綴lib和庫名以及后綴組成。根據(jù)庫的類型不同,后綴名也不一樣。共享庫名的格式:庫的名稱.so.主版本號.次版本號靜態(tài)庫名的格式:庫的名稱.a例如:libm.so.5 數(shù)學(xué)共享庫的標(biāo)識字符為m,版本號為5libm.a 靜態(tài)數(shù)字庫libc.a為標(biāo)準(zhǔn)C庫10函數(shù)庫存放的標(biāo)準(zhǔn)目錄:/lib 系統(tǒng)必備共享庫/usr/lib 標(biāo)準(zhǔn)共享庫和靜態(tài)庫/usr/i486-linux-libc5/lib libc5兼容性函數(shù)庫/usr/X11R6/lib X11R6的函數(shù)庫/usr/local/lib 本地函數(shù)庫11頭文件存放的目錄:/usr/include 系統(tǒng)頭文件 /usr/local/include 本地頭文件共享庫及相關(guān)配置文件在/etc目錄中,其中:ld.so.conf 包含共享庫的搜索位置ldconfig 共享庫管理工具,一般在更新了共享庫之后要運(yùn)行該命令ldd 可查看可執(zhí)行文件所使用的共享庫e.g.#lddtest,查看test文件的共享庫依賴make工具
在開發(fā)大型軟件時(shí),往往要把整個(gè)系統(tǒng)劃分成若干個(gè)子系統(tǒng),然后再把子系統(tǒng)劃分幾個(gè)能獨(dú)立工作的模塊,使得軟件系統(tǒng)模塊化。這樣在對系統(tǒng)進(jìn)行編譯時(shí)就要按模塊進(jìn)行編譯。
當(dāng)模塊變更時(shí),采用手工編譯方法可能漏掉一些已經(jīng)修改過或受影響的模塊,不能保證生成的可執(zhí)行文件使用最新的程序模塊。當(dāng)程序的各模塊之間的調(diào)用關(guān)系比較復(fù)雜時(shí),一個(gè)模塊的修改往往要引起許多目標(biāo)文件的重新編譯與生成例如當(dāng)一個(gè)程序由模塊main.c,x1.c,x2.c組成時(shí),其編譯過程如下:make工具(2)$cc–cmain.c$cc–cx1.c$cc–cx2.c$cc–oprogmain.ox1.ox2.o在上例中,x1.c,x2.c或main.c中任一模塊的更改都將影響程序prog的生成。
基本功能:
自動實(shí)現(xiàn)模塊間的依賴關(guān)系,根據(jù)程序中模塊的修改情況,僅重新編譯修改模塊及其關(guān)聯(lián)模塊,連接所有目標(biāo)代碼,以保證最終可執(zhí)行文件總是由組成它的模塊的最新版生成。make命令make命令是UNIX系統(tǒng)下開發(fā)大中型軟件時(shí),常用的一個(gè)程序自動維護(hù)工具。make命令基本操作
在說明文件(makefile)中尋找目標(biāo)文件
保證該目標(biāo)文件所依賴的所有文件都存在且是最新的版本
在任一程序的修改晚于該目標(biāo)文件生成時(shí)間的前提下創(chuàng)建目標(biāo)文件make命令參數(shù)make命令的常用參數(shù):-f-i-s-r-p-e-n
指定make的說明文件忽略調(diào)用命令返回的錯(cuò)誤代碼執(zhí)行時(shí)不顯示所執(zhí)行的命令不使用內(nèi)部規(guī)則打印makefile中的宏及依賴信息不接收對shell環(huán)境變量賦值的宏定義非執(zhí)行方式makefile的概念:來自文件系統(tǒng)的文件名和最近一次的修改日期和時(shí)間將一些間隔連接起來的內(nèi)部規(guī)則makefile文件Makefile是一個(gè)描述文件,所描述的主要內(nèi)容是模塊間的依賴關(guān)系及在此依賴關(guān)系基礎(chǔ)上所采取的動作。Make命令在操作時(shí)就遵循這個(gè)文件所定義的規(guī)范。make命令使用的信息源:makefile是普通的文本文件,可以使用任何一種UNIX系統(tǒng)下的文本編輯器創(chuàng)建和修改makefile文件(2)makefile必須與它使用的源文件放在同一個(gè)目錄下機(jī)群系統(tǒng)并行程序調(diào)試環(huán)境DENNET19Makefile里有什么?Makefile里主要包含了五個(gè)東西:顯式規(guī)則:要生成的文件,文件的依賴文件,生成的命令
隱晦規(guī)則:自動推導(dǎo)目標(biāo)文件和依賴文件名的關(guān)系變量定義:運(yùn)行make時(shí),變量都會被擴(kuò)展到相應(yīng)的引用位置上文件指示:(1)在一個(gè)Makefile中引用另一個(gè)Makefile,與c語言中的#include一樣,使用“includefoo.make”這種方式(如果是“-includefoo.make”,則表示忽略foo.make中的錯(cuò)誤);(2)根據(jù)某些情況指定Makefile中的有效部分,就像C語言中的預(yù)編譯#if一樣;(3)定義一個(gè)多行的命令注釋:#Makefile中的命令,必須要以[Tab]鍵開始
機(jī)群系統(tǒng)并行程序調(diào)試環(huán)境DENNET20Makefile的文件名
Makefile的一般命名規(guī)則為:常規(guī)命名順序:GNUmakefile〉makefile〉Makefile特定名稱:Makefile.linuxmake–fMake.linuxmake–fileMake.linuxMakefile最常用,一方面因?yàn)轱@目,另一方面符合大多數(shù)人的習(xí)慣
機(jī)群系統(tǒng)并行程序調(diào)試環(huán)境DENNET21make的工作方式
讀入所有的Makefile;讀入被include的其它Makefile;初始化文件中的變量;推導(dǎo)隱晦規(guī)則,并分析所有規(guī)則;為所有的目標(biāo)文件創(chuàng)建依賴關(guān)系鏈;根據(jù)依賴關(guān)系,決定哪些目標(biāo)要重新生成;執(zhí)行生成命令。
makefile的編寫(2)注釋:可以在makefile的任意位置添加注釋注釋以#開始,以換行符結(jié)束包括行:把別的文件包括進(jìn)makefile其格式為:#include“文件名”宏:定義格式為:macro-variable=value宏可以簡化makefile描述文件的書寫23規(guī)則的定義規(guī)則中的項(xiàng)目定義必須從最左邊開始,一個(gè)規(guī)則中的第二行以后的行必須以tab健開始。規(guī)則的格式如下:targets:prerequisites commands或targets:prerequisites;commands commandsmakefile的編寫
規(guī)則中的依賴關(guān)系:依賴關(guān)系是說明文件的關(guān)鍵部分,是makefile的核心部分。一個(gè)依賴關(guān)系說明一個(gè)目標(biāo)依賴于哪些文件以及生成或更新該目標(biāo)所需要的命令定義格式為:Target-name:[dependent…][;command][(tab)command]makefile示例#anexampleofmakefileprog:main.ox1.ox2.occ–oprogmain.ox1.ox2.omain.o:main.ccc–cmain.cx1.o:x1.ccc–cx1.cx2.o:x2.ccc–cx2.cmake將在3個(gè)源文件main.c,x1.c,x2.c中的任何一個(gè)發(fā)生變化之后執(zhí)行,重新生成目標(biāo)程序progmake的宏make的一個(gè)主要特性就是它可以定義和使用宏make使用的宏可以分成:
自定義的宏
預(yù)定義的宏宏可以簡化makefile描述文件的書寫宏常用來定義makefile中經(jīng)常變化的地方,可以使對makefile的管理更加方便make的宏(2)
自定義的宏:宏既可以在make命令行中定義,也可以在makefile中定義。一旦定義了宏,就可以在makefile的任何地方使用。
宏的引用:$(macro-variable)或${macro-variable}宏的定義:macro-variable=valuemake的宏(3)make的預(yù)定義宏:$*$@$<$?$%
表示去掉后綴的當(dāng)前目標(biāo)名當(dāng)前目標(biāo)的全路徑名為比給定目標(biāo)文件版本更新的依賴文件名表示所有必須再編譯的目標(biāo)模塊表示構(gòu)成庫的模塊文件名
當(dāng)目標(biāo)是庫文件時(shí),目標(biāo)內(nèi)的成員名。例如目標(biāo)x.a(y.o)的目標(biāo)名為x.a,成員名為y.omake的宏(4)make的預(yù)定義宏:CCCFLAGSCPPFLAGSCOMPILE.sLINK.ccc
$(AS)$(ASFLAGS)$(CC)$(ASFLAGS)$(CPPFLAGS)-c30Makefile文件中的符號“%”%可以理解為統(tǒng)配符??墒褂盟x或重定義模式規(guī)則。例如:%.o:%.c gcc–c$<定義了一個(gè)規(guī)則:所有目標(biāo)文件*.o依賴C語言源程序*.c;且生成方法為gcc-c$<。31Makefile文件中的符號“=”或“:=”符號“=”或“:=”用于修改已經(jīng)定義的變量或在已定義變量的基礎(chǔ)上定義新變量。例如 已知:var1=a.cb.cc.c
則 var2=$(var1:.c=.o)
定義 var2=a.ob.oc.o
而 var1+=d.c
重定義var1,其值為var1=a.cb.cc.cd.c32“:=”與“=”的區(qū)別“:=”與“=”是有區(qū)別的。當(dāng)使用“=”時(shí),變量將做遞歸或擴(kuò)展“:=”只作簡單替換。廈門大學(xué)通訊工程系Makefile的Phony目標(biāo).PHONY:target不是實(shí)際的文件目標(biāo)常用于clean這類并不產(chǎn)生實(shí)際文件的目標(biāo)34Makefile中的常用目標(biāo)clean:用于對項(xiàng)目環(huán)境進(jìn)行準(zhǔn)備,清除已經(jīng)生成的目標(biāo)文件等以便重新編譯;install:用于對整個(gè)項(xiàng)目的成品進(jìn)行安裝;uninstall:則是用于對安裝的項(xiàng)目進(jìn)行卸載。35Makefile示例1//文件f1.c的內(nèi)容f1(intarg){printf(”F1:youpassed:%d\n”,arg);}//文件f2.c的內(nèi)容:f2(char*arg){printf(”F2:youpassed:%s\n”,arg);}//文件f3.c的內(nèi)容#include<stdio.h>main(){fprintf(stderr,”Begine:\n”);f1(15); f2(”HelloWorld!”);fprintf(stderr,”:End\n”);exit(0);}36Makefile示例2它們之間的關(guān)系如下圖37項(xiàng)目編譯過程分析按照gcc的工作過程,對模塊的編譯和鏈接過程可分為:(1)生成目標(biāo)代碼
gcc-cf1.c gcc-cf2.c gcc-cf3.c(2)生成可執(zhí)行程序gcc-off1.of2.of3.o38Makefile內(nèi)容f:f1.of2.of3.o
gcc-off1.of2.of3.of1.o:f1.c
gcc–cf1.cf2.o:f2.c
gcc–cf2.cf3.o:f3.c
gcc–cf3.c39Makefile的使用有了Makefile文件,可以使用make命令對此項(xiàng)目進(jìn)行編譯。編譯方法為:
make或makef若要編譯單個(gè)項(xiàng)目,比方說f1.o,可以使用以下方法:
makef1.o40增加all、clean和install目標(biāo)的Makefileall:f #makealltobuildff:f1.of2.of3.o gcc-off1.of2.of3.of1.o:f1.c gcc–cf1.cf2.o:f2.c gcc–cf2.cf3.o:f3.c gcc–cf3.cclean: rm–ff?.o#makeallandinstallfto/usr/binwithpermission755install:all install–m755/usr/local/binmake的宏示例2#exampleoforiginalprog:prog1.oprog2.ogccprog1.oprog2.o-oprogprog1.o:prog1.clib.hgcc-c-I.-oprog1.oprog1.cprog2.o:prog2.cgcc-cprog2.c#examplewithmacroMARCO=prog1.oprog2.oprog:$(MARCO)gccprog1.oprog2.o-o$@prog1.o:prog1.clib.hgcc-c-I.-o$@$<prog2.o:prog2.cgcc-c$*.cmake的后綴規(guī)則make的后綴規(guī)則是make隱含規(guī)則的一種在后綴規(guī)則中,目標(biāo)和依賴文件名都只使用文件名后綴來代替文件名本身如:make自動認(rèn)為.o為后綴的目標(biāo)文件都是依賴以.c和.s為后綴的依賴文件通過后綴規(guī)則可以使用同一條規(guī)則對一系列同類別的文件進(jìn)行相同的處理,極大地簡化makefile的編寫。
make后綴規(guī)則定義了不同后綴的文件之間的依賴關(guān)系。make的后綴規(guī)則示例當(dāng)make自己定義了一個(gè).c后綴的規(guī)則如下:.c:$(LINK.c)–o$@$<$(LDLIBS)該規(guī)則定義了從C源文件如何得到一個(gè)可執(zhí)行文件。此C源文件的名稱將是目的文件的名稱加上.c后綴。若有一個(gè)prog.c是只使用標(biāo)準(zhǔn)C庫函數(shù)的程序,其makefile為:prog:make生成目的文件時(shí)發(fā)現(xiàn)無此目的文件的依賴文件,就使用隱含規(guī)則“.c:”及prog.c來生成目的文件。自動化編譯
Autoconf介紹內(nèi)容大綱學(xué)習(xí)目的Autoconf介紹Autoconf框架圖Autoconf流程Autoconf優(yōu)化Autoconf小結(jié)FAQ學(xué)習(xí)目的如何方便在linux系統(tǒng)上寫c/c++等工程的一種技巧,從而提高工程化的能力;方便的閱讀理解開源代碼;容易理解掌握整個(gè)工程源碼的架構(gòu);寫出優(yōu)秀而漂亮的代碼框架。Autoconf介紹無論是在Linux還是在Unix環(huán)境中,make都是一個(gè)非常重要的編譯命令??梢酝ㄟ^查閱make的幫助文檔來手工編寫Makefile,當(dāng)然我們更愿意自動生成Makefile。要想了解更多的自動化編譯的知識,不僅僅要熟悉Makefile的語法,還要熟悉m4規(guī)則。實(shí)踐還證明:光靠這些規(guī)則理論是不夠的,我們要學(xué)會在實(shí)踐中創(chuàng)造規(guī)則、完善理論。Autoconf框架圖Autoconf流程-如何寫configure.in在開始antoconf之前,了解一下Autoconf依賴于:Bash,Coreutils,Diffutils,Grep,M4,Make,Perl,Sed.autoscan程序可以用來為軟件包創(chuàng)建configure.in文件。autoscan在以命令行參數(shù)中指定的目錄為根(如果未給定參數(shù),則以當(dāng)前目錄為根)的目錄樹中檢查源文件。它為通常的輕便問題搜索源文件,并且為那個(gè)包創(chuàng)建一個(gè)configure.scan文件,這個(gè)文件就是configure.in的前身。autoscan程序是perl語言寫的。將configure.scan文件重命名成configure.in或者configure.ac,并編輯之。configure.in文件中的內(nèi)容都是以AC_INIT開頭,以AC_OUTPUT結(jié)束。Autoconf流程-如何寫configure.inconfiugre.in文件的一般布局AC_INIT測試程序測試函數(shù)庫測試頭文件測試類型定義測試結(jié)構(gòu)測試編譯器特性測試庫函數(shù)測試系統(tǒng)調(diào)用AC_OUTPUTAutoconf流程-如何寫configure.in宏含義AC_INIT(FILE)用來檢查源代碼所在的路徑。AM_INIT_AUTOMAKE(PACKAGE,VERSION)這個(gè)宏是必須的,它描述了我們將要生成的軟件包的名字及其版本號:PACKAGE是軟件包的名字,VERSION是版本號。當(dāng)你使用makedist命令時(shí),它會給你生成一個(gè)類似helloworld-1.0.tar.gz的軟件發(fā)行包,其中就有對應(yīng)的軟件包的名字和版本號。AC_PROG_CC檢查系統(tǒng)所用的C編譯器。AC_CHECK_LIB(library,function,[action-if-found],[action-if-not-found],[other-libraries])該宏用來檢查lib庫中是否存在指定的函數(shù)。當(dāng)測試成功時(shí),執(zhí)行shell命令action_if_found或者action_if_found當(dāng)為空時(shí),在輸出變量LIBS中添加-llib。action_if_not_found把-lother_libs選項(xiàng)傳給link命令。AC_OUTPUT要輸出的Makefile的名字。AC_LANG_CPLUSPLUS對C++語言的支持。AC_PROG_LIBTOOL對libtool工具的支持。AC_CHECK_HEADERS檢查系統(tǒng)中或環(huán)境路徑中是否存在指定的頭文件,和AC_CHECK_LIB一樣支持條件語句。AC_CHECK_FUNCS檢查libraryfunctions,和AC_CHECK_LIB一樣支持條件語句。Autoconf流程-如何編寫m4文件m4是傳統(tǒng)Unix的宏處理的安裝啟動的應(yīng)用,其對應(yīng)的是.m4文件記錄了很多無法理解的宏。詳細(xì)的介紹見官方網(wǎng)站:/software/m4/M4文件定義的宏一般需要在configure.in文件中調(diào)用,使用aclocal來進(jìn)行解析aclocal也是一個(gè)perl腳本程序,aclocal根據(jù)configure.in文件的內(nèi)容,自動生成aclocal.m4文件。.m4文件很有趣,很多gcc無法完成的工作,m4可以方便的幫助完成;特別是環(huán)境依賴、系統(tǒng)移植性等方面。Autoconf流程-如何編寫m4文件M4文件的寫法貌似shell腳本,不過更多的是宏的寫法,比如定義一個(gè)宏:AC_DEFUN其他常用的宏:AC_ARG_ENABLEAC_ARG_WITHAM_CONDITIONALAC_SUBSTAS_IFAutoconf流程-autoheader負(fù)責(zé)生成config.h.in文件。該工具通常會從“acconfig.h”文件中復(fù)制用戶附加的符號定義,因此此處沒有附加符號定義,所以不需要?jiǎng)?chuàng)建“acconfig.h”文件。Autoconf流程-如何編寫automakeautomake要用的腳本配置文件是Makefile.am,用戶需要自己創(chuàng)建相應(yīng)的文件。之后,automake工具轉(zhuǎn)換成Makefile.in。automake有相對應(yīng)的一些參數(shù)可以配置,比如-a等等可執(zhí)行文件靜態(tài)庫測試文件noinst_PROGRAMS=foofoo_SOURCES=foo_LDADD=foo_LDFLAGS=foo_DEPENDENCIES=noinst_LIBRARIES=libfoo.afoo_a_SOURCES=foo_a_LDADD=foo_a_LIBADD=foo_a_LDFLAGS=check_PROGRAMS=dofoodofoo_SOURCES=dofoo_LDADD=TESTS_ENVIRONMENT=TESTS=$(check_PROGRAMS)Autoconf流程-如何編寫automake目前automake支持三種目錄層次:flat、shallow和deep。Flat指的是所有文件都位于同一個(gè)目錄中就是所有源文件、頭文件以及其他庫文件都位于當(dāng)前目錄中,且沒有子目錄。Termutils就是這一類。shallow指的是主要的源代碼都儲存在頂層目錄,其他各個(gè)部分則儲存在子目錄中。就是主要源文件在當(dāng)前目錄中,而其它一些實(shí)現(xiàn)各部分功能的源文件位于各自不同的目錄。Automake本身就是這一類。deep指的是所有源代碼都被儲存在子目錄中;頂層目錄主要包含配置信息。就是所有源文件及自己寫的頭文件位于當(dāng)前目錄的一個(gè)子目錄中,而當(dāng)前目錄里沒有任何源文件。GNUcpio和GNUtar就是這一類。Yahoo的ydm、dcp等工程也屬于這一類。flat類型是最簡單的,deep類型是最復(fù)雜的。但是實(shí)際工程中我們經(jīng)常用到的是deep類型的。Autoconf流程-如何編寫automakeMakefile.am中盡量使用相對路徑,系統(tǒng)預(yù)定義了兩個(gè)基本路徑:$(top_srcdir)工程最頂層目錄,用于引用源程序;$(top_builddir)定義了生成目標(biāo)文件上最上層目錄,用于引用.o等編譯出來的目標(biāo)文件。Makefile.am中也類似于m4一樣,定義了很多的宏,比如:includedir頭文件的路徑,等同于-I;也可以使用libfooincludedir指定特定的庫引用的頭文件路徑;include_HEADERS定義需要安裝的頭文件,也可以libfooinclude_HEADERS來指定特定的庫需要安裝的頭文件;一般和libfooincludedir結(jié)合使用;Autoconf流程-如何編寫automakedata_DATA需要安裝數(shù)據(jù)文件AUTOMAKE_OPTIONS由于GNU對自己發(fā)布的軟件有嚴(yán)格的規(guī)范,比如必須附帶許可證聲明文件COPYING等,否則automake執(zhí)行時(shí)會報(bào)錯(cuò)。automake提供了三種軟件等級:foreign、gnu和gnits,讓用戶選擇采用,默認(rèn)等級為gnu。在本例使用foreign等級,它只檢測必須的文件。bin_PROGRAMS或lib_LIBRARIES定義要產(chǎn)生的執(zhí)行文件名。如果要產(chǎn)生多個(gè)執(zhí)行文件,每個(gè)文件名用空格隔開。對于可執(zhí)行文件和靜態(tài)庫類型,如果只想編譯,不想安裝到系統(tǒng)中,可以用noinst_PROGRAMS代替bin_PROGRAMS,noinst_LIBRARIES代替lib_LIBRARIES。Autoconf流程-如何編寫automakeMakefile.am還可以支持pkgconfig,對于pc文件也有相應(yīng)的宏的定義:pcdatadirpc文件的安裝目錄pcdata_DATA安裝的pcdata的文件名稱Autoconf流程-如何編寫automakeMakefile.am還提供了一些全局變量供所有的目標(biāo)體使用:INCLUDES鏈接時(shí)所需要的頭文件LDADD鏈接時(shí)所需要的庫文件LDFLAGS鏈接時(shí)所需要的庫文件選項(xiàng)標(biāo)志EXTRA_DIST源程序和一些默認(rèn)的文件將自動打入.tar.gz包,其它文件若要進(jìn)入.tar.gz包可以用這種辦法,比如配置文件,數(shù)據(jù)文件等等。SUBDIRS在處理本目錄之前要遞歸處理哪些子目錄Autoconf流程-如何編寫automakeAM_LDFLAGS同LDFLAGS一樣,只是AM_LDFLAGS優(yōu)先加載;AM_CPPFLAGS(AM_CFLAGS)同CPPFLAGS一樣,只是AM_CPPFLAGS優(yōu)先加載;AM_CXXFLAGS同CXXFLAGS一樣,只是AM_CXXFLAGS優(yōu)先加載;CLEANDIRS需要?jiǎng)h除的目錄MOSTLYCLEANFILES需要?jiǎng)h除的文件Autoconf流程—autoconfautoconf是一個(gè)用于生成可以自動地配置軟件源碼包,用以適應(yīng)多種UNIX類系統(tǒng)的shell腳本工具,其中autoconf需要用到m4,便于生成腳本。通過configure.in和aclocal.m4文件,使用autoconf生成configure文件,很復(fù)雜的configure文件吧!運(yùn)行configure文件,生成了我們要的Makefile文件Autoconf優(yōu)化-rpm方案我們知道,創(chuàng)建一個(gè)rpm包,需要用到一個(gè)spec文件,來注明rpm包的生成信息。在工程項(xiàng)目中一般通常解決方法是在文件的根目錄放一個(gè)*.spec.in(用來生成spec文件)或spec文件,這里我結(jié)合了.rpmmacros采用了生成spec文件的方式:#definerpmbuildrootRPMBUILDTOPDIR=$(shellunsetRPMBUILDTOPDIR;if[-f${HOME}/.rpmmacros];thenexportRPMBUILDTOPDIR=`grep_topdir${HOME}/.rpmmacros|awk'{print$$2}'`;elseexportRPMBUILDTOPDIR=/usr/src/redhat;fi;echo$${RPMBUILDTOPDIR};)Autoconf優(yōu)化-rpm方案下面的這些有點(diǎn)像Makefile吧,但是這個(gè)是在Makefile.am文件中:.PHONY:rpmrpm:dist@PACKAGE@.spec $(RM)${RPMBUILDTOPDIR}/SOURCES/$(distdir).tar.gz $(RM)${RPMBUILDTOPDIR}/SPECS/@PACKAGE@.spec $(LN_S)`pwd`/$(distdir).tar.gz${RPMBUILDTOPDIR}/SOURCES $(LN_S)`pwd`/@PACKAGE@.spec${RPMBUILDTOPDIR}/SPECS rpmbuild-ba${RPMBUILDTOPDIR}/SPECS/@PACKAGE@.spec這樣就可以通過makerpm命令來生成rpm了,值得注意的是如果沒有在.rpmmacros文件內(nèi)指定_topdir,則需要sudo權(quán)限來根據(jù)系統(tǒng)變量來生成rpm。Autoconf小結(jié)-補(bǔ)充Libtool工具添加需要注意libtoolize步驟針對CFLAGS和CXXFLAGS對默認(rèn)GNU的編譯選項(xiàng)的更改針對一個(gè)lib可以拆分成兩個(gè)libdata_DATA需要指定datadir變量的位置AC_HEADER_STDC等宏的合理添加makedist等各種包的打法autoreconf的使用Autoconf小結(jié)-FAQ依賴的其他項(xiàng)目是從代碼編譯的,同時(shí)他們的makefile是自己寫的一套其他項(xiàng)目從代碼進(jìn)行編譯的話,可以一次性把編譯好的lib和頭文件放到你工程下的lib和include目錄下,而不是你每次修改自己工程的源文件都需要make一下其他的項(xiàng)目。我們的目的并不是讓別人遵從我們的想法,而是宣揚(yáng)我們的想法是多么的好,甚至你有更好的想法,我們會一起改進(jìn)autoconf。make的時(shí)候發(fā)生的錯(cuò)誤有時(shí)候奇奇怪怪的,比如鏈接起來了其他代碼片段一般在make出現(xiàn)錯(cuò)誤了,可以從錯(cuò)誤代碼原因進(jìn)行分析,只要你遵守“游戲規(guī)則”,是不會產(chǎn)生鏈接到其它的代碼片段的。這個(gè)autoconf如何和java源碼一起編譯我們可以寫Makefile.am,方法如同寫Makefile一樣,把java里面的編譯器,比如ant包含進(jìn)來,完成我們的make過程即可。Autoconf小結(jié)-FAQ執(zhí)行./configure時(shí)候出現(xiàn)循環(huán)等問題請重新執(zhí)行aclocal;autoheader;libtoolize--force;automake-a;autoreconf一系列命令,然后./configure,如果make再出現(xiàn)問題,請makeclean后再次make。怎么確定不需要執(zhí)行aclocal等一系列命令一般來說,修改configure.in(ac)或增加(減少)m4文件都需要進(jìn)行執(zhí)行aclocal等一系列命令,其他比如修改Makefile.am等不需要執(zhí)行。我不會用autoconf,也不會寫makefile學(xué),除非你不想用c/c++。用的多了,經(jīng)常會碰到一些問題,該找誰?Google和gnu的網(wǎng)站源碼控制SCCS軟件開發(fā)過程中,需要不斷對程序進(jìn)行修改和完善。這種修改和完善時(shí)常需要查閱一些早期的版本,甚至要退回到以前的某一版本重新開始。保留所開發(fā)的源程序的各個(gè)版本非常有必要,但是這樣會占用大量的存儲空間,而且人工管理相當(dāng)困難,極易造成混亂建議你選用的版本控制系統(tǒng)包括:rcs,cvs,svn,git,Mercurial,Bazzar等等。UNIX系統(tǒng)為此提供了一個(gè)源碼控制系統(tǒng)SCCS,它只記錄對源程序的修改情況,可以對源代碼的多個(gè)版本進(jìn)行有效的管理和控制http://sccs.berlios.de/目前是5.06版本源碼控制SCCS(2)
軟件版本編號:Release.Level.Branch.Sequence發(fā)行號級別號分支號順序號標(biāo)識一組相似且兼容的版本標(biāo)識同一發(fā)行版本里各文件存在的主要差異標(biāo)識在特定級別上的修改標(biāo)識在一個(gè)特定分支上的修改SCCS工作文件SCCS使用不同類型的文件來完成自己的工作。這些文件包含實(shí)際的源代碼和SCCS執(zhí)行過程中產(chǎn)生的信息。SCCS在原始的文件名前加上一前綴來命名這些文件。SCCS工作文件(2)s.文件:s.文件是源文件的歷史文件,它包含指定源文件所有版本。它為指定文件的所有版本提供壓縮存儲方式,并自動維護(hù)各版本之間的關(guān)系。x.文件:由修改SCCS文件的SCCS命令創(chuàng)建,是SCCS文件的一個(gè)臨時(shí)副本。所有修改SCCS文件的SCCS命令,實(shí)際上是對x.文件進(jìn)行修改z.文件:g.文件:SCCS工作文件(3)為一個(gè)封鎖文件。SCCS用它避免多個(gè)程序員同時(shí)修改一個(gè)SCCS文件用指定的s.文件的一個(gè)修改清單(delta)替代原始文件的相應(yīng)部分代碼,從而形成某一版本源代碼的副本,該副本就是g.文件p.文件l.文件SCCS工作文件(4)為SCCS的控制文件,包含當(dāng)前正在編輯的SCCS文件版本的信息。當(dāng)一個(gè)g.文件從s.文件復(fù)原出來時(shí)就會產(chǎn)生一個(gè)相應(yīng)的p.文件。它描述了復(fù)原出來的g.文件的SID、推薦版本更新后使用的SID,編輯過的g.文件和復(fù)原g.文件的用戶名。存放生成給定版本所需使用的delta版本信息SCCS常用命令admingetungetdeltaprs
將源代碼文件置于SCCS控制之下,創(chuàng)建SCCS文件檢查并復(fù)原SCCS文件的某一版本的源代碼取消get–e先前對一個(gè)文件的作用記錄當(dāng)前對源代碼文件的修改變化,并創(chuàng)建新的版本按用戶指定的格式打印SCCS文件的各部分
創(chuàng)建SCCS文件$admin–iprogramgram讀取SCCS文件(僅能查看不能編輯)$getgramSCCS命令示例該命令為program文件創(chuàng)建了一個(gè)名為gram的SCCS文件,并把記錄prog內(nèi)容的第一個(gè)修改清單(delta)復(fù)制到gram中該命令從SCCS文件中還原出只讀源文件programSCCS命令示例(2)讀取SCCS文件并獲取寫權(quán)限$get-egram記錄源代碼的變化$deltagram該命令使SCCS創(chuàng)建了一個(gè)可讀寫的program文件,同時(shí)創(chuàng)建一個(gè)gram文件該命令執(zhí)行后,將出現(xiàn)提示:comments?給出注釋后,delta會在gram中用此信息對原版本和新版本進(jìn)行比較,并把所有修改清單復(fù)制到SCCS文件中去,形成一個(gè)新的deltaGit使用簡介2011/09/20Linux下的分布式版本管理系統(tǒng)git是一個(gè)版本控制系統(tǒng)。官方的解釋是:版本控制(Revisioncontrol)是一種軟件工程技巧,籍以在開發(fā)的過程中,確保由不同人所編輯的同一檔案都得到更新。大家怎么合作開發(fā)軟件呢?用信件?效率太低。用郵件,不好實(shí)現(xiàn)多人溝通。用googlegroup吧,可開發(fā)階段中的源代碼沒法科學(xué)管理。用自建的網(wǎng)站吧,需要人力物力財(cái)力來支撐。GitGit是一個(gè)版本控制工具它采用了分布式版本庫的方式,不必服務(wù)器端軟件支持,使源代碼的發(fā)布和交流極其方便。很多有名的軟件都使用Git來進(jìn)行版本控制,如Linux內(nèi)核集中式版本管理的流程集中式版本管理的缺點(diǎn):1、服務(wù)器壓力太大,數(shù)據(jù)庫容量暴增。2、如果不能連接到服務(wù)器上,基本上不可以工作,看上面第二步,如果服務(wù)器不能連接上,就不能提交,還原,對比等等。3、不適合開源開發(fā)(開發(fā)人數(shù)非常非常多,但是Googleappengine就是用svn的)。但是一般集中式管理的有非常明確的權(quán)限管理機(jī)制(例如分支訪問限制),可以實(shí)現(xiàn)分層管理,從而很好的解決開發(fā)人數(shù)眾多的問題。集中式版本管理的優(yōu)點(diǎn):1、管理方便,邏輯明確,符合一般人思維習(xí)慣。2、易于管理,集中式服務(wù)器更能保證安全性。3、代碼一致性非常高。4、適合開發(fā)人數(shù)不多的項(xiàng)目開發(fā)。5、大部分軟件配置管理的大學(xué)教材都是使用svn和vss。分布式管理的工作流程分布式管理的優(yōu)缺點(diǎn)優(yōu)點(diǎn):適合分布式開發(fā),強(qiáng)調(diào)個(gè)體。公共服務(wù)器壓力和數(shù)據(jù)量都不會太大。速度快、靈活。任意兩個(gè)開發(fā)者之間可以很容易的解決沖突。離線工作。
缺點(diǎn):資料少(起碼中文資料很少)。學(xué)習(xí)周期相對而言比較長。不符合常規(guī)思維。代碼保密性差,一旦開發(fā)者把整個(gè)庫克隆下來就可以完全公開所有代碼和版本信息。Git和其他版本控制系統(tǒng)的主要差別直接快照,而非比較差異Git只關(guān)心文件數(shù)據(jù)的整體是否發(fā)生變化,而大多數(shù)其他系統(tǒng)則只關(guān)心文件內(nèi)容的具體差異。這類系統(tǒng)(CVS,Subversion,Perforce,Bazaar等等)差別2近乎所有操作都可本地執(zhí)行在Git中的絕大多數(shù)操作都只需要訪問本地文件和資源,不用連網(wǎng)。但如果用CVCS的話,差不多所有操作都需要連接網(wǎng)絡(luò)。因?yàn)镚it在本地磁盤上就保存著所有有關(guān)當(dāng)前項(xiàng)目的歷史更新,所以處理起來速度飛快。差別3時(shí)刻保持?jǐn)?shù)據(jù)完整性在保存到Git之前,所有數(shù)據(jù)都要進(jìn)行內(nèi)容的校驗(yàn)和(checksum)計(jì)算,并將此結(jié)果作為數(shù)據(jù)的唯一標(biāo)識和索引。換句話說,不可能在你修改了文件或目錄之后,Git一無所知。這項(xiàng)特性作為Git的設(shè)計(jì)哲學(xué),建在整體架構(gòu)的最底層。所以如果文件在傳輸時(shí)變得不完整,或者磁盤損壞導(dǎo)致文件數(shù)據(jù)缺失,Git都能立即察覺。差別4多數(shù)操作僅添加數(shù)據(jù)常用的Git操作大多僅僅是把數(shù)據(jù)添加到數(shù)據(jù)庫。因?yàn)槿魏我环N不可逆的操作,比如刪除數(shù)據(jù),要回退或重現(xiàn)都會非常困難。概念解釋Gerrit——基于web的代碼審核系統(tǒng)。Gerrit為Git引入的代碼審核是強(qiáng)制性的,就是說除非特別的授權(quán)設(shè)置,向Git版本庫的推送(Push)必須要經(jīng)過Gerrit服務(wù)器,修訂必須經(jīng)過代碼審核的一套工作流之后,才可能經(jīng)批準(zhǔn)并納入正式代碼庫中三種狀態(tài)對于任何一個(gè)文件,在Git內(nèi)都只有三種狀態(tài):已提交(committed),已修改(modified)和已暫存(staged)。已提交表示該文件已經(jīng)被安全地保存在本地?cái)?shù)據(jù)庫中了;已修改表示修改了某個(gè)文件,但還沒有提交保存;已暫存表示把已修改的文件放在下次提交時(shí)要保存的清單中。git概念解釋repository:一個(gè)repository就是一組代碼或文本的集合master:主分支,倉庫建立時(shí)自動創(chuàng)建HEAD:指向你項(xiàng)目中的當(dāng)前開發(fā)branchcommit:一個(gè)commit包含一次代碼的變更信息,每gitcommit一次代碼,生成一個(gè)commitremote:遠(yuǎn)程倉庫基本的Git工作流程1.在工作目錄中修改某些文件。
2.對這些修改了的文件作快照,并保存到暫存區(qū)域。3.提交更新,將保存在暫存區(qū)域的文件快照轉(zhuǎn)儲到git目錄中。安裝Git
概括起來主要有兩種,一種是通過編譯源代碼來安裝;另一種是使用為特定平臺預(yù)編譯好的安裝包。在Fedora上用yum安裝:$yuminstallgit-coregit命令linux環(huán)境下git常用操作命令:gitinitgitclonegitlog,gitshow,gitdiffgitadd,gitcommit,gitpush,gitpullgitconfiggitbranch…gitclonegitclone:將項(xiàng)目倉
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 江蘇省泰州市姜堰區(qū)2024-2025學(xué)年七年級上學(xué)期期中地理試題(含答案)
- 數(shù)據(jù)中心項(xiàng)目投資計(jì)劃書
- 贛南師范大學(xué)《審計(jì)學(xué)》2021-2022學(xué)年第一學(xué)期期末試卷
- 2024年電動開顱設(shè)備項(xiàng)目投資申請報(bào)告代可行性研究報(bào)告
- 阜陽師范大學(xué)《幼兒歌曲彈唱》2022-2023學(xué)年第一學(xué)期期末試卷
- 福建師范大學(xué)協(xié)和學(xué)院《跨國公司經(jīng)營與管理》2021-2022學(xué)年第一學(xué)期期末試卷
- 《股權(quán)轉(zhuǎn)讓合同》-企業(yè)管理
- 福建師范大學(xué)《漆畫人物創(chuàng)作大創(chuàng)作》2023-2024學(xué)年第一學(xué)期期末試卷
- 醫(yī)美行業(yè)研究框架關(guān)注上游高景氣賽道
- 福建師范大學(xué)《廣告史》2021-2022學(xué)年第一學(xué)期期末試卷
- 2024年共青團(tuán)入團(tuán)積極分子考試題庫(含答案)
- 籍貫對照表完整版
- 保安隊(duì)排班表
- 小學(xué)生必背誦古詩詞72首
- 種植活動中發(fā)展大班幼兒科學(xué)探究能力的實(shí)踐研究
- 關(guān)于對加強(qiáng)鐵路站段干部作風(fēng)建設(shè)的探索與思考
- 電控柜的安裝接線的規(guī)范
- 火車道口報(bào)警系統(tǒng)畢業(yè)設(shè)計(jì)論文
- 設(shè)備、設(shè)施日常維修記錄單
- 帶壓堵漏技術(shù)
- 最詳細(xì)的律師事務(wù)所業(yè)務(wù)范圍介紹
評論
0/150
提交評論