




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Linux環(huán)境及開發(fā)工具應(yīng)用實(shí)踐環(huán)境及開發(fā)工具應(yīng)用實(shí)踐 -Linux開發(fā)工具開發(fā)工具2Company name目錄目錄1. Make及及Makefile編寫編寫2. CVS等版本管理工具等版本管理工具3. Linux軟件包安裝軟件包安裝4. Linux常用庫函數(shù)常用庫函數(shù)Company name為什么要分解工程為什么要分解工程v 編寫大的工程編寫大的工程:v 當(dāng)用戶改動一行代碼,編譯器需要全部重新編譯來生成一個(gè)新的可執(zhí)行文件。但如果項(xiàng)目是分開在幾個(gè)小文件里,改動其中一個(gè)文件的時(shí)候,別的源文件的目標(biāo)文件(object files)已經(jīng)存在,所以沒有什么原因去重新編譯它們。 只要通過基本的規(guī)劃,將
2、一個(gè)項(xiàng)目分解成多個(gè)小文件可使你更加容易的找到一段代碼。 v 層次更清晰層次更清晰Company name怎樣分解項(xiàng)目怎樣分解項(xiàng)目 vi) 不要用一個(gè) header 文件指向多個(gè)源碼文件(例外:程序包 的 header 文件)。 vii) 如果可以的話,完全可以用多個(gè) header 文件來指向同一個(gè)源碼文件。 viii) 不要在多個(gè) header 文件中重復(fù)定義信息。 viv) 在每一個(gè)源碼文件里, #include 部分應(yīng)聲明了源碼文件對應(yīng)的所有header 文件。 Company namemake 建立工程的基本步驟:把你的源碼文件一個(gè)一個(gè)的編譯成目標(biāo)文件的格式,最后把所有的目標(biāo)文件加上需要
3、的程序包連接成一個(gè)可執(zhí)行文件。 在大型的開發(fā)項(xiàng)目中,通常有幾十到上百個(gè)的源文件,如果每次均手工鍵入 gcc 命令進(jìn)行編譯的話,則會非常不方便。因此,人們通常利用 make 工具來自動完成編譯工作。 Company namemakev這些工作包括:v如果僅修改了某幾個(gè)源文件,則只重新編譯這幾個(gè)源文件;v如果某個(gè)頭文件被修改了,則重新編譯所有包含該頭文件的源文件。利用這種自動編譯可大大簡化開發(fā)工作,避免不必要的重新編譯。 vMakefile為項(xiàng)目構(gòu)建了一個(gè)依賴信息數(shù)據(jù)庫,在每次編譯前檢查是否可以找到所有需要文件。Company namemakev makefile 文件是許多編譯器,包括 Wind
4、ows NT 下的編譯器維護(hù)編譯信息的常用方法,只是在集成開發(fā)環(huán)境中,用戶通過友好的界面修改 makefile 文件而已。默認(rèn)情況下,GNU make 工具在當(dāng)前工作目錄中按如下順序搜索 makefile:vGNUmakefile、makefile、 Makefilev 在Linux系統(tǒng)中,習(xí)慣使用 Makefile 作為 makfile 文件。 Company namemakev make 工具通過一個(gè)稱為 makefile 的文件來完成并自動維護(hù)編譯工作。makefile 需要按照某種語法進(jìn)行編寫,其中說明了如何編譯各個(gè)源文件并連接生成可執(zhí)行文件,并定義了源文件之間的依賴關(guān)系。當(dāng)修改了其中
5、某個(gè)源文件時(shí),如果其他源文件依賴于該文件,則也要重新編譯所有依賴該文件的源文件。 Company name基本基本 makefile 結(jié)構(gòu)結(jié)構(gòu)vMake 的工作是讀進(jìn)文本文件 makefile 。makefile 中一般包含如下內(nèi)容:v需要由 make 工具創(chuàng)建的項(xiàng)目,通常是目標(biāo)文件和可執(zhí)行文件。通常使用“目標(biāo)(target)”一詞來表示要創(chuàng)建的項(xiàng)目。v 要創(chuàng)建的項(xiàng)目依賴于哪些文件。v 創(chuàng)建每個(gè)項(xiàng)目時(shí)需要運(yùn)行的命令。Company name基本基本 makefile 結(jié)構(gòu)結(jié)構(gòu)v 有了這些信息, make 會檢查硬盤上的文件,如果 目的文件的時(shí)間戳(該文件生成或被改動時(shí)的時(shí)間)比至少它的一 個(gè)依
6、賴文件舊的話, make 就執(zhí)行相應(yīng)的命令,以便更新目的文件Company name簡單簡單Makefile例子例子v = makefile 開始 =myprog : foo.o bar.o gcc foo.o bar.o -o myprogfoo.o : foo.c foo.h bar.h gcc -c foo.c -o foo.obar.o : bar.c bar.h gcc -c bar.c -o bar.o= makefile 結(jié)束 =Company name簡單簡單Makefile例子例子v Myprog是主要目標(biāo)(要保 證總是最新)。給出規(guī)則說明只要文件myprog 比文件foo.
7、o或bar.o中任何一個(gè)舊,下一行命令將執(zhí)行v 在檢查文件 foo.o 和 bar.o 的時(shí)間戳之前,它會往下查 找那些把 foo.o 或 bar.o 做為目標(biāo)文件的規(guī)則。它找到關(guān)于 foo.o 的規(guī)則,該文件的依靠文件是 foo.c, foo.h 和 bar.h 。 它從下面再找不到生成這些依靠文件的規(guī)則,它就開始檢查磁盤上這些依賴文件的時(shí)間戳。如果這些文件中任何一個(gè)的時(shí)間戳比 foo.o 的新,命令 gcc -o foo.o foo.c 將會執(zhí)行,從而更新 文件 foo.o 。 接下來對文件 bar.o 做類似的檢查,依賴文件在這里是文件 bar.c 和 bar.h Company nam
8、emake 工具建立程序的好處工具建立程序的好處v make 檢查時(shí)間戳檢查時(shí)間戳:源碼文件里一個(gè)簡單改變都會造成那個(gè)文件被重新編譯(因 為 .o 文件依靠 .c 文件),進(jìn)而可執(zhí)行文件被重新連接(因?yàn)?.o 文件被改變了)。v 不需再記憶復(fù)雜的依賴關(guān)系不需再記憶復(fù)雜的依賴關(guān)系:當(dāng)改變一個(gè) header 文件時(shí),不再需要記住哪些源碼文件依靠它,因?yàn)樗械?資料都在 makefile 里。 make 會很輕松的替重新編譯所有那 些因依賴這個(gè) header 文件而改變了的源碼文件,如有需要,再進(jìn)行重新連接。Company name編寫編寫 make 規(guī)則規(guī)則 (Rules) v 最明顯的(也是最簡
9、單的)編寫規(guī)則的方法是一個(gè)一個(gè)的查看源碼文件,把它們的目標(biāo)文件做為目的,而源碼文件和被它 #include 的 header 檔做為依靠文件。 v 使用 gcc 的時(shí)候,用 -M 開關(guān),它會為每一個(gè)給它的文件輸出一個(gè)規(guī)則,把目標(biāo)文件做為目的,而這個(gè)文件和所有應(yīng)該被 #include 的 header 文件將做為依靠文件。注意這個(gè)規(guī)則會加入所有 header 文件,包 括被角括號()和雙引號()所包圍的文件。 v 由 gcc 輸出的規(guī)則不會含有命令部分;可以自己寫入命令 或者什么也不寫,而讓make 使用它的隱含的規(guī)則 。Company namemakefile 變量(宏)變量(宏)vmakef
10、ile 里的變量就像一個(gè)環(huán)境變量。事實(shí)上,環(huán)境變量在 make 過程中被解釋成 make 的變量。vmakefile變量大小寫敏感,一般使用大寫字母。v以相同的編譯選項(xiàng)同時(shí)編譯多個(gè) C 源文件時(shí),可以使用變量為每個(gè)目標(biāo)的編譯指定編譯選項(xiàng),避免乏味。v在 makefile 中引用變量的值時(shí),只需變量名之前添加 $ 符號。Company namemakefile 變量的作用變量的作用v貯存一個(gè)文件名列表貯存一個(gè)文件名列表。生成可執(zhí)行文件的規(guī)則包含一些目標(biāo)文件名做為依靠。在這個(gè)規(guī)則的命令行里同樣的那些文件被輸送給 gcc 做為命令參數(shù)。如果在這里使用一個(gè)變數(shù)來貯存所有的目標(biāo)文件名,加入新的目標(biāo)文件會
11、變的簡單而且較不易出錯(cuò)。v例如:前面程序可以改為:vOBJECT= foo.o bar.o v使用是加上 $符號。v$(OBJECT)Company namemakefile 變量的作用變量的作用v貯存可執(zhí)行文件名貯存可執(zhí)行文件名。如果用戶的項(xiàng)目被用在一個(gè)非 gcc 的系統(tǒng)里,或者如果想使用一個(gè)不同的編譯器,必須將所有使用編譯器的地方改成用新的編譯器名。但是如果使用一 個(gè)變量來代替編譯器名,那么只需要改變一個(gè)地方,其它所有地方的命令名就都改變了。 Company namemakefile 變量的作用變量的作用v貯存編譯器旗標(biāo)。假設(shè)你想給你所有的編譯命令傳遞一組 相同的選項(xiàng)(例如 -Wall -
12、 O -g);如果你把這組選項(xiàng)存入一個(gè)變量,那么你可以把這個(gè)變量放在所有呼叫編譯器 的地方。而當(dāng)你要改變選項(xiàng)的時(shí)候,你只需在一個(gè)地方改 變這個(gè)變量的內(nèi)容。要設(shè)定一個(gè)變量,你只要在一行的開始寫下這個(gè)變量的名字,后面跟一個(gè) = 號,后面跟你要設(shè)定的這個(gè)變量的值。以后你要引用這個(gè)變量,寫一個(gè) $ 符號,后面是圍在括號里的變量名。 Company namemakefile 變量的作用變量的作用v #= makefile 開始 =OBJS = foo.o bar.oCC = gccCFLAGS = -Wall -O -gmyprog : $(OBJS)$(CC) $(OBJS) -o myprogfoo
13、.o : foo.c foo.h bar.h$(CC) $(CFLAGS) -c foo.c -o foo.obar.o : bar.c bar.h$(CC) $(CFLAGS) -c bar.c -o bar.o#= makefile 結(jié)束 = Company namemake 的主要預(yù)定義變量的主要預(yù)定義變量$* 不包含擴(kuò)展名的目標(biāo)文件名稱$+ 所有的依賴文件,以空格分開,并以出現(xiàn)的先后為序,可能包含重復(fù)的依賴文件。$ 第一個(gè)依賴文件的名稱。$? 所有的依賴文件,以空格分開,這些依賴文件的修改日期比目標(biāo)的創(chuàng)建日期晚。$ 目標(biāo)的完整名稱。$ 所有的依賴文件,以空格分開,不包含重復(fù)的依賴文件。
14、$% 如果目標(biāo)是歸檔成員,則該變量表示目標(biāo)的歸檔成員名稱。AR 歸檔維護(hù)程序的名稱,默認(rèn)值為 ar。ARFLAGS 歸檔維護(hù)程序的選項(xiàng)。Company namemake 的主要預(yù)定義變量的主要預(yù)定義變量vAS 匯編程序的名稱,默認(rèn)值為 as。vASFLAGS 匯編程序的選項(xiàng)。vCC C 編譯器的名稱,默認(rèn)值為 cc。vCCFLAGS C 編譯器的選項(xiàng)。vCPP C 預(yù)編譯器的名稱,默認(rèn)值為 $(CC) -E。vCPPFLAGS C 預(yù)編譯的選項(xiàng)。vCXX C+ 編譯器的名稱,默認(rèn)值為g+。vCXXFLAGS C+ 編譯器的選項(xiàng)。vFC FORTRAN 編譯器的名稱,默認(rèn)值為f77。vFFLAG
15、S FORTRAN 編譯器的選項(xiàng)Company namemake 的主要預(yù)定義變量的主要預(yù)定義變量v #= makefile 開始 =OBJS = foo.o bar.oCC = gccCFLAGS = -Wall -O -gmyprog : $(OBJS)$(CC) $ -o $foo.o : foo.c foo.h bar.h$(CC) $(CFLAGS) -c $ -o $bar.o : bar.c bar.h$(CC) $(CFLAGS) -c $ -o $#= makefile 結(jié)束 = Company namemakefile 里的函數(shù)里的函數(shù) (Functions) makefi
16、le 里的函數(shù)跟它的變量很相似-使用的時(shí)候,你用一個(gè) $ 符號跟開括號,函數(shù)名,空格后跟一列由逗號分隔的參數(shù),最后 用關(guān)括號結(jié)束。 例如wildcard 的函 數(shù),它有一個(gè)參數(shù),功能是展開成一列所有符合由其參數(shù)描述的文 件名,文件間以空格間隔??梢允褂妹睿篠OURCES = $(wildcard *.c)這行會產(chǎn)生一個(gè)所有以 .c 結(jié)尾的文件的列表,然后存入變量 SOURCES 里Company namemakefile 里的函數(shù)里的函數(shù) (Functions)v另一個(gè)有用的函數(shù)是patsubst( patten substitude, 匹配替換的縮寫) 。v它有個(gè)參數(shù)(第一個(gè)是一個(gè)需要匹配
17、的 式樣,第二個(gè)是用什么來替換它,第三個(gè)是一個(gè)需要被處理的 由空格分隔的字列。例如OBJS = $(patsubst %.c,%.o,$(SOURCES)運(yùn)行將處理所有在 SOURCES 字列中的字,如果它的 結(jié)尾是 .c ,就用 .o 把 .c 取代。注意這里的 % 符號是匹 配一個(gè)或多個(gè)字符。 Company namemake隱含規(guī)則隱含規(guī)則v 定義如何從不同的依賴文件建立特定類型目標(biāo)。v 支持兩種類型的隱含規(guī)則:后綴規(guī)則(Suffix Rule):Unix系統(tǒng)通常支持一種基于文件擴(kuò)展名即文件名后綴的隱含規(guī)則。這種后綴規(guī)則定義了如何將一個(gè)具有特定文件名后綴的文件(例如.c文件),轉(zhuǎn)換成為具
18、有另一種文件名后綴的文件(例如.o文件):.c:.o$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $ $Company namemake隱含規(guī)則隱含規(guī)則v系統(tǒng)中默認(rèn)的常用文件擴(kuò)展名及其含義為:.o 目標(biāo)文件.c C源文件.f FORTRAN源文件.s 匯編源文件.y Yacc-C源語法.l Lex源語法 Company namemake隱含規(guī)則隱含規(guī)則模式規(guī)則(pattern rules):定義更加復(fù)雜的依賴性規(guī)則。在目標(biāo)名稱的前面多了一個(gè) % 號,同時(shí)可用來定義目標(biāo)和依賴文件之間的關(guān)系,例如下面的模式規(guī)則定義了如何將任意一個(gè) X.c 文件轉(zhuǎn)換為 X.o 文件:v%.c:
19、%.ov$(CC) $(CCFLAGS) $(CPPFLAGS) -c -o $ $Company name運(yùn)行運(yùn)行 makev 直接在 make 命令的后面鍵入目標(biāo)名可建立指定的目標(biāo);直接運(yùn)行 make,則建立第一個(gè)目標(biāo)??梢杂?make -f mymakefile 這樣的命令指定 make 使用特定的 makefile,而不是默認(rèn)的 makefile 或 Makefilev make 命令其他選項(xiàng)-C DIR 在讀取 makefile 之前改變到指定的目錄 DIR。-f FILE 以指定的 FILE 文件作為makefileCompany name運(yùn)行運(yùn)行 makemake 命令其他選項(xiàng)-
20、h 顯示所有的 make 選項(xiàng)-i 忽略所有的命令執(zhí)行錯(cuò)誤-I DIR 當(dāng)包含其他 makefile 文件時(shí),可利用該選項(xiàng)指定搜索目錄-n 只打印要執(zhí)行的命令-p 顯示 make 變量數(shù)據(jù)庫和隱含規(guī)則-s 在執(zhí)行命令時(shí)不顯示命令-w 在處理 makefile 前后,顯示工作目錄-W FILE 假定文件 FILE 已經(jīng)被修改Company name調(diào)試調(diào)試makev-d選項(xiàng)能夠使make在執(zhí)行命令時(shí)打印大量的額外調(diào)試信息。v輸出信息如下: 在重新編譯時(shí)make需要檢查的文件 被比較的文件以及比較的結(jié)果 需要被重新生成的文件 make想要使用的隱式規(guī)則 make實(shí)際使用的隱式規(guī)則以及所執(zhí)行的命令C
21、ompany name常見的常見的make出錯(cuò)信息出錯(cuò)信息v No rule to make target target. Stop makefile中沒有包含創(chuàng)建指定的target所需要的規(guī)則,而且也沒有合適的默認(rèn)規(guī)則可用。v target is up to date 指定target的相關(guān)文件沒有變化。v Target target not remade because of errors 在編譯target時(shí)出錯(cuò),這一消息僅在使用make的-k選項(xiàng)時(shí)才會出現(xiàn)。v Command: Command not found Make 找不到命令(拼寫錯(cuò)誤或路徑不對)。v Illegal opti
22、on option 在調(diào)用make時(shí)包含了不能被make識別的選項(xiàng)。Company name有用的有用的makefile目標(biāo)目標(biāo)v install 把最終的二進(jìn)制文件,所支持的庫文件或shell腳本及相關(guān)的文檔移動到文件系統(tǒng)中與之相應(yīng)的最終位置,并設(shè)置文件的權(quán)限和屬主。 編譯程序,運(yùn)行簡單的測試v uninstall 刪除由install目標(biāo)所安裝的那些文件。v dist 用來生成準(zhǔn)備發(fā)布的軟件包。將刪除編譯工作目錄中舊的二進(jìn)制文件和目標(biāo)文件,并創(chuàng)建一個(gè)歸檔文件,以便上載。v tags 創(chuàng)建或更新程序的標(biāo)記表。v installtest或installcheck 驗(yàn)證安裝過程。Company
23、name版本控制工具版本控制工具CVSv版本控制系統(tǒng)是一個(gè)軟件系統(tǒng),它能對計(jì)算機(jī)軟件開發(fā)中源代碼(當(dāng)然也不僅僅局限于源代碼)的版本進(jìn)行跟蹤、管理和控制,可以記錄程序源代碼的修改過程并維護(hù)一個(gè)完整的代碼修改和更新的歷史記錄。v使用CVS來管理軟件項(xiàng)目,在版本更改時(shí)只存儲不同版本的diff文件。v更適合用于多人協(xié)作開發(fā)的項(xiàng)目管理。vcvs的特點(diǎn): 支持遠(yuǎn)程訪問; 用戶可以為他要修改的文件編輯標(biāo)志。 完成項(xiàng)目中跟蹤、協(xié)調(diào)和管理的工作,以保證多人協(xié)作開發(fā)軟件系統(tǒng)的完整性和安全性。Company name版本控制工具版本控制工具CVSv CVS 的基本工作思路是這樣的:在一臺服務(wù)器上建立一個(gè)倉庫,倉庫里
24、可以存放許多不同項(xiàng)目的源程序。由倉庫管理員統(tǒng)一管理這些源程序。這樣,就好象只有一個(gè)人在修改文件一樣。避免了沖突。每個(gè)用戶在使用倉庫之前,首先要把倉庫里的項(xiàng)目文件下載到本地。用戶做的任何修改首先都是在本地進(jìn)行,然后用 cvs 命令進(jìn)行提交,由 cvs 倉庫管理員統(tǒng)一修改。這樣就可以做到跟蹤文件變化,沖突控制等等。Company name版本控制工具版本控制工具CVSvCVS軟件,請找到相關(guān)的rpm,tgz,deb 等包裝上,或者到 /CVS/Dev/code vhttp:/ vhttp:/www.loria.fr/molli/cvs-index.html
25、 下載原程序編譯安裝Company name版本控制工具版本控制工具CVS的使用的使用v建立CVS服務(wù)器v建立CVS項(xiàng)目v定義模塊v版本的分支和合并v多人協(xié)作開發(fā)軟件Company name建立建立CVS服務(wù)器服務(wù)器v在使用CVS進(jìn)行版本管理控制前,必須首先建立起CVS服務(wù)器。v為了CVS系統(tǒng)能夠正常運(yùn)行,則必須保證一定的系統(tǒng)資源,一般需要32M就可以正常工作。Company name建立建立CVS服務(wù)器服務(wù)器v 1)建立CVSROOT目錄:v #groupadd cvsv #adduser cvsrootv 2)用cvsroot用戶登陸,修改/home/cvsroot的權(quán)限,賦予同組人讀寫的
26、權(quán)限。v $chmod 777v 3)建立CVS倉庫:v $cvs -d /home/cvsroot initCompany name建立建立CVS服務(wù)器服務(wù)器v 4)以root身份登陸,修改/etc/inetd.conf和/etc/services:v 在/etc/inetd.conf里加入:v cvsserver stream tcp nowait root /usr/bin/cvs cvs allow-root=/home/cvsroot pserverv 注意:上面所加入的行是單獨(dú)一整行, /usr/bin/cvs 是CVS版本的命令路徑, /home/cvsroot是所建立的CVSR
27、OOT的路徑。v 在/etc/services里加入:v cvsserver 2401/topCompany name建立建立CVS服務(wù)器服務(wù)器v cvsserver是任意的名稱,但是不能和已有服務(wù)重名,而且要求和/etc/inetd.conf中所加入行的第一項(xiàng)一致。v5)添加可以使用CVS服務(wù)的用戶到cvs組:v以root身份修改/etc/group,把需要使用CVS的用戶名加到cvs組里,修改后的/etc/group應(yīng)該有下面這樣一行:v cvs:x:105:laser,gumpwuCompany name建立建立CVS服務(wù)器服務(wù)器v 6)重啟inetd使修改生效:v #killall -
28、HUP inetdv 這樣服務(wù)器設(shè)置完成,接下來進(jìn)行客戶端的配置。v 1)設(shè)置環(huán)境變量CVSROOT:v $export CVSROOT=:pservser:laserthe_server-name:/home/cvsrootv 這里pservser是訪問方式,laser是可以使用CVS服務(wù)器的用戶名, the_server-name是CVS服務(wù)器的名稱或IP地址, /home/cvsroot是CVS服務(wù)器的CVSROOT目錄。Company name建立建立CVS服務(wù)器服務(wù)器v2)登錄CVS服務(wù)器:v輸入$cvs login登錄,輸入口令,口令和在CVS服務(wù)器上的口令一樣。成功登錄后系統(tǒng)將在
29、用戶主目錄建立一個(gè).cvspass文件,以后就不必輸入口令。Company name建立建立CVS項(xiàng)目項(xiàng)目v使用CVS進(jìn)行版本控制的第一步是是在倉庫中建立項(xiàng)目。你可以有幾種方法:v 建立一個(gè)目錄樹v 從其它版本控制系統(tǒng)建立文件v 從無到有建立一個(gè)目錄樹 Company name建立建立CVS項(xiàng)目項(xiàng)目v建立一個(gè)目錄樹v 當(dāng)你開始使用CVS時(shí),你可能已經(jīng)有幾個(gè)項(xiàng)目可以使用CVS進(jìn)行管理了。在這種情況下,最容易的方法就是使用:“import”命令。下面通過一個(gè)例子來講解如何使用它的。假定現(xiàn)在有一些想放到CVS中的文件在wdir中,并且你想讓它們放在數(shù)據(jù)倉庫中的如下目錄: $CVSROOT/yoyod
30、yne/rdir Company name建立建立CVS項(xiàng)目項(xiàng)目v 可以使用如下命令: $cdwdir $cvsinport-mInportedSourcesyoyodyne/rdiryoyostart 如果沒有使用-m參數(shù)記錄一個(gè)日志信息,CVS將調(diào)用一個(gè)編輯器(*譯者注:通常是vi)并且提示輸入信息。yoyo字符串是開發(fā)者標(biāo)箋,start是發(fā)行標(biāo)箋。他們沒有什么特別的意義,僅僅是因?yàn)镃VS的需要才放在這里。 Company name建立建立CVS項(xiàng)目項(xiàng)目v 現(xiàn)在可以檢查一下它是否有效了,然后可以刪除原來的代碼目錄。 $cd $mvdirdir.orig $cvscheckoutyoyody
31、ne/dir $diff-rdir.origyoyodyne/dir $rm-rdir.orig. 為了避免偶然進(jìn)入原來的目錄中去編輯文件,刪除原來的代碼是個(gè)好主意。當(dāng)然,在你刪除之前保留一份備份到其它地方也是明智之舉。 “checkout”命令能使用模塊名作為參數(shù)(正如前面所有例子)或是一個(gè)相對于$CVSROOT的路徑,如同上面的例子。應(yīng)當(dāng)檢查CVS目錄中的權(quán)限情況是否合適,應(yīng)當(dāng)使它們屬于某一個(gè)特定的組。v 如果想import的一些文件是二進(jìn)制代碼,你可以使用一些特殊的方法表明這些文件是否 是二進(jìn)制文件。 Company name建立建立CVS項(xiàng)目項(xiàng)目v 從其它版本控制系統(tǒng)建立文件v 如果有
32、一個(gè)其它版本控制系統(tǒng)維護(hù)的項(xiàng)目,例如RCS,也許希望把這些文件放到CVS中,并且要保留這些文件的歷史。 v 從從RCSRCS: 如果你使用RCS,找到RCS文件,通常一個(gè)文件名叫foo.c的文件會有RCS/foo.c,v的RCS文件。(但它有可能在其它地方,請看RCS的文檔以得到相關(guān)信息)。如果文件目錄在CVS中不存在,那在CVS中創(chuàng)建它。然后把這些文件拷貝到CVS的倉庫目錄中(在倉庫中的名字必須是帶,v的原文件;這些文件直接放在CVS中的這個(gè)目錄下,而非RCS子目錄中)。這是在CVS中一個(gè)為數(shù)不多的直接進(jìn)入CVS倉庫直接操作的情況,而沒使用CVS命令。然后就可以把它們在新的目錄下checko
33、ut了。當(dāng)把RCS文件移動CVS中時(shí),RCS文件應(yīng)在未被鎖定的狀態(tài),否則移動操作時(shí)CVS將會出現(xiàn)一些問題。Company name建立建立CVS項(xiàng)目項(xiàng)目v 從其它版本控制工具 從SCCSSCCS: 有一個(gè)sccsarcs的腳本文件可以做把SCCS的文件轉(zhuǎn)化成RCS文件,這個(gè)文件放在CVS原代碼目錄的contrib目錄中。注意: 你必須在一臺同時(shí)安裝了RCS和SCCS的機(jī)器上運(yùn)行它。并且,正如其它在contrib.目錄中的其它腳本一樣。(你的方法也許是變化多端的) 從PVCSPVCS: 在contrb中有一個(gè)叫pves-to-rcs的腳本可以轉(zhuǎn)換PVCS到RCS文件。你必須在一臺同時(shí)有PVCS和
34、RCS的機(jī)器上運(yùn)行它。 Company name建立建立CVS項(xiàng)目項(xiàng)目v 從無到有建立一個(gè)目錄樹v 建立一個(gè)新的項(xiàng)目,最容易的方法是建立一個(gè)空的目錄樹,如下所示: $mkdirtc $mkdirtc/man $mkdirtc/testing 在這之后,你可以import這個(gè)(空)目錄到倉庫中去。 $cdtc $cvsimport-mcreateddirectorystructureyoyodyne/diryoyo start 然后,當(dāng)新增一個(gè)文件時(shí),增加文件(或目錄)到倉庫中。請檢查$CVSROOT中的權(quán)限是否正確。 Company name定義模塊定義模塊v 在moduyes文件中定義模塊。
35、這不是嚴(yán)格需要的,但模塊能把相關(guān)的目錄和文件容易關(guān)聯(lián)起來。下面的例子可以充分演示如何定義模塊。 1.得到模塊文件的工作拷貝。 $cvscheckoutCVSROOT/modules $cdCVSROOT 2.編輯這個(gè)文件并寫入定義模塊的行。你可以使用下面的行定義模塊tc: tcyoyodyne/tc 3.提交你的更改到倉庫 $cvscommit-mAddedtcmodule.modules 4.發(fā)行模塊文件 $cd $cvsrelease-dCVSROOT Company name分支與合并分支與合并 v CVS允許你獨(dú)立出一個(gè)派生的代碼到一個(gè)分離的開發(fā)版本-分支。當(dāng)你改變一個(gè)分支中的文件時(shí),
36、這些更改不會出現(xiàn)在主開發(fā)版本和其它分支版本中。 在這之后你可以使用合并(merging)把這些變更從一個(gè)分支移動到另一個(gè)分支(或主開發(fā)版本)。合并涉及到使用“cvsupdate-j”命令,合并這些變更到一個(gè)工作目錄。 你可以確認(rèn)(commit)這次版本,并且因此影響到拷貝這些變更到其它的分支。 Company name多個(gè)開發(fā)者同時(shí)工作多個(gè)開發(fā)者同時(shí)工作v 當(dāng)多個(gè)開發(fā)者同時(shí)參與一個(gè)項(xiàng)目時(shí),常常會發(fā)生沖突。一般經(jīng)常發(fā)生的情況是兩個(gè)人想同時(shí)編輯一個(gè)文件的時(shí)候。它的解決方法之一是文件鎖定或是使用保留式的checkout,這種方法允許一個(gè)文件一次只允許一個(gè)人編輯。這是一些版本控制系統(tǒng)的唯一解決方式,包
37、括RCS和SCCS?,F(xiàn)在在CVS通常使用保留式checkout的方法是使用CVSadmin-1命令。下面將講述可以使用適當(dāng)?shù)姆椒▉肀苊鈨蓚€(gè)人同時(shí)編輯一個(gè)文件,而非使用軟件的方式強(qiáng)迫達(dá)到這一點(diǎn)。 Company name多個(gè)開發(fā)者同時(shí)工作多個(gè)開發(fā)者同時(shí)工作v 在CVS中默認(rèn)的方法是unreservedcheckout-非保留式的導(dǎo)出。在這種方法下,開發(fā)者可以同時(shí)在他們的工作拷貝中編輯一個(gè)文件。第一個(gè)提交工作的沒有一種自動的方法可以知道另一個(gè)人在編輯文件。另一個(gè)人可能會在試圖提交時(shí)得到一個(gè)錯(cuò)誤信息。他們必須使用CVS命令使他們的工作拷貝同倉庫的內(nèi)容保持更新。這個(gè)操作是自動的。 CVS可以支持fac
38、ilitate多種不同的通信機(jī)制,而不會強(qiáng)迫去遵守某種規(guī)則,如resered checkouts那樣。以下的部分描述這些不同的方式是如何工作的,和選擇多種方式之間涉及到的一些問題。 Company name多個(gè)開發(fā)者同時(shí)工作多個(gè)開發(fā)者同時(shí)工作v 文件狀態(tài) 基于你對導(dǎo)出的文件使用過的操作,和這些文件在倉庫中的版本使用過的操作,我們可以 把一個(gè)文件分為幾個(gè)狀態(tài)。這個(gè)狀態(tài)可以由status命令得到,它們是: up-to-date: 對于正在使用的這個(gè)分支,文件同倉庫中的最后版本保持一致。 LocallyModified: 你修改過文件,但沒有commit。 Company name多個(gè)開發(fā)者同時(shí)工作
39、多個(gè)開發(fā)者同時(shí)工作vLocallyadded: 使用了“add”命令增加文件,但沒有“commitLocallyRemoved: 你使用了remove命令,但沒有commitNeedscheckout: 其他人提交了一個(gè)更新的版本。這個(gè)狀態(tài)的名字有些誤導(dǎo),你應(yīng)當(dāng)使用update而非checkout來更新新的版本。 Company name多個(gè)開發(fā)者同時(shí)工作多個(gè)開發(fā)者同時(shí)工作v NeedsPatch: 象“Needscheckout”一樣,但CVS服務(wù)將只給出Patch(補(bǔ)?。┪募钦麄€(gè)文件。而給出Patch和給出整個(gè)文件的效果是相同的。 NeedsMerge: 一些人提交了一個(gè)更新版本,而
40、你卻修改過這些文件。 Filehadconflictsonmerge: 這同“LocallyModified”相象,只是“update命令給出了一個(gè)沖突信息。Company name多個(gè)開發(fā)者同時(shí)工作多個(gè)開發(fā)者同時(shí)工作v Unkown: CVS不知道關(guān)于這個(gè)文件的情況.例如,你創(chuàng)建了一個(gè)新文件,而沒有使用add命令為了幫助弄清楚文件的狀態(tài),status也報(bào)告工作版本(working vevision),這是這個(gè)文件是從哪個(gè)版本來的,另外還報(bào)告?zhèn)}庫版本(Repository vevision)。這是這個(gè)文件在倉庫中的這個(gè)版本分支的最后版本。 Company name多個(gè)開發(fā)者同時(shí)工作多個(gè)開發(fā)者同
41、時(shí)工作v 你應(yīng)當(dāng)把update和status命令放在一起來認(rèn)識。你使用update使你的文件更新到最新狀態(tài),你使用status命令來得到update命令將會做何種操作。(當(dāng)然,倉庫中的狀態(tài)將可能會在你運(yùn)行update之前變化)。事實(shí)上,如果你想使用一個(gè)命令得到比使用status正式的狀態(tài)信息,你可以使用: $cvs-n-q-update 這里-n選擇項(xiàng)表示不真正執(zhí)行update,而只顯示狀態(tài);-q選擇項(xiàng)表示不打印每個(gè)目錄的名字。 Company name多個(gè)開發(fā)者同時(shí)工作多個(gè)開發(fā)者同時(shí)工作v 使一個(gè)文件更新到最版本 當(dāng)你想更新或是合并一個(gè),使用update命令。對于一個(gè)不是最新版本的文件,這個(gè)
42、命令大略等同于checkout命令:最新版本從倉庫中提出并放到工作目錄中。 當(dāng)你使用update命令時(shí),你修改過的文件在任何情況下不會受到損害。如果在倉庫中沒有更新的版本,update時(shí)你的代碼沒有任何影響。當(dāng)你編輯過一個(gè)文件,并且倉庫中有更新版本,那么update將合并所有的變更到你的工作目錄。 Company name多個(gè)開發(fā)者同時(shí)工作多個(gè)開發(fā)者同時(shí)工作v 例如,想象一個(gè)你導(dǎo)出了一個(gè)1.4版的文件并且開始編輯它,在某一時(shí)候其他人提交了1.5版,然后又提交了1.6版,如果你運(yùn)行update命令,CVS將把1.4版到1.6版之間的變更放到你的文件中。如果在1.4版和1.6版之間的改變太靠近于的
43、你一些變更的話,那么一個(gè)覆蓋(overlop)沖突就發(fā)生了。在這種情況下將輸出一個(gè)警告信息,然后結(jié)果保留的文件中包含了有沖突代碼的兩個(gè)版本,由特別的符號所分隔開。Company name版本控制工具版本控制工具CVSv 建立一個(gè)新的CVS項(xiàng)目: 1. 進(jìn)入到你的已有項(xiàng)目的目錄:$cd cvstest2. 運(yùn)行命令: $cvs import -m “this is a cvstest project” stest v_0_0_1 start 說明:import 表示向cvs倉庫輸入項(xiàng)目文件; -m參數(shù)后面的字串是描述文本; cvstest 是項(xiàng)目名稱; v_0_0_1是這個(gè)分支的總標(biāo)記; sta
44、rt 是每次 import 標(biāo)識文件的輸入層次的標(biāo)記。v 運(yùn)行下面的命令: $cvs checkout cvstestv 從倉庫中檢索出cvstest項(xiàng)目的源文件Company name版本控制工具版本控制工具CVSv如果你已經(jīng)做過一次checkout了,那么不需要重新checkout,只需要進(jìn)入cvstest項(xiàng)目的目錄,更新一下就行了:v $cd cvstest $cvs updateCompany name版本控制工具版本控制工具CVSv 打印出狀態(tài)報(bào)告:v =File: foo.c Status: Up-to-date Working revision: Some Dat
45、e Repository revision: 1.2 /home/cvsroot/cvstest/foo.c,v Sticky Tag: (none) Sticky Date: (none) Sticky Options: (none) Company name版本控制工具版本控制工具CVSv 這里最重要的就是 Status 欄,可能有四種狀態(tài): Up-to-date:表明你獲得的文件是最新的; Locally Modified:表明你曾經(jīng)修改過該文件,但還沒有提交,你的版本比倉庫里的新; Needing Patch:表明其它人已經(jīng)修改過該文件并且已經(jīng)提交了!你的版本比倉庫里的舊; Needs
46、 Merge:表明你曾經(jīng)修改過該文件,但是別人也修改了這個(gè)文件,而且還提交給倉庫了! Company name版本控制工具版本控制工具CVSv1,你對某個(gè)文件做了修改,比如說改了ceo.c,加了一行程序:printf(“where can I find VC to cheat!”); 改完之后你要把修改提交給倉庫,用命令: $cvs commit -m “add a complain” ceo.c 或者就是: $cvs commit -m “worry about money” 讓cvs幫你檢查哪個(gè)文件需要提交。 Company name版本控制工具版本控制工具CVSv2,當(dāng)開始工作時(shí),可能先
47、做: $cvs status v如果發(fā)現(xiàn)有人改了ceo.c,可以更新: $cvs update ceo.c 或: $cvs update 把ceo.c這個(gè)文件更新為最新版本Company name版本控制工具版本控制工具CVSv還有一些命令,比如要增加一個(gè)文件 garbage_china_concept_stocks_list: v$cvs add arbage_china_concept_stocks_list v然后還需要做: v $cvs commit garbage_china_concert_stocks_list Company name軟件包安裝工具軟件包安裝工具v軟件安裝工具r
48、pmvRPM 有五個(gè)基本的操作 模式(不包括包的編譯): 安裝,卸載,升級,查詢,校驗(yàn)v要了解完整的細(xì)節(jié)和選項(xiàng),可以使用 rpm -help Company name安裝安裝v 典型的 RPM 有著類似 foo-1.0-1.i386.rpm這樣的名稱, 其中指明了包名 (foo), 版本號 (1.0), 發(fā)行號 (1), 和硬件平臺 (i386)。安裝一個(gè)軟件包只需簡單的鍵入以下命令: v # rpm -ivh foo-1.0-1.i386.rpmrpm -ivh foo-1.0-1.i386.rpm v foo # # v RPM 將會打印出軟件包的名字( 并不一定要與文件名相同 ), 然后
49、打印出一連串的 # 號以表示安裝進(jìn)度。 Company name安裝安裝v 盡管通常是使用v rpm -ivh foo-1.0-1.i386.rpm 來安裝包, 但也可以用v rpm -Uvh foo-1.0-1.i386.rpm 來替代。 -U 是包升級參數(shù), 也可以用來安裝新包。 Company name軟件包已被安裝軟件包已被安裝v 如果軟件包已被安裝, 會出現(xiàn)以下信息: v # rpm -ivh foo-1.0-1.i386.rpmrpm -ivh foo-1.0-1.i386.rpm v foo package foo-1.0-1 is already installed error
50、: foo-1.0-1.i386.rpm cannot be installed # v 如果仍要安裝該包, 可以在命令行中使用 -replacepkgs 選項(xiàng), 這樣 RPM 將忽略該錯(cuò)誤信息: v # rpm -ivh -replacepkgs foo-1.0-1.i386.rpmrpm -ivh -replacepkgs foo-1.0-1.i386.rpmv foo v # # Company name文件沖突文件沖突v 如果要安裝的軟件包中有一個(gè)文件已在安裝其它包時(shí)被安裝,會顯示以下信息: v # rpm -ivh foo-1.0-1.i386.rpmrpm -ivh foo-1.0
51、-1.i386.rpm v foo /usr/bin/foo conflicts with file from bar-1.0-1 error: v foo-1.0-1.i386.rpm cannot be installed #v 要想讓RPM 忽略該錯(cuò)誤信息, 請使用 -replacefiles 命令行選項(xiàng): v # rpm -ivh -replacefiles foo-1.0-1.i386.rpmrpm -ivh -replacefiles foo-1.0-1.i386.rpm v foo # # Company name未解決依賴關(guān)系未解決依賴關(guān)系v 一個(gè) RPM 包可能會 依賴 其它
52、軟件包, 也就是說要求在安裝了特定的軟件包之后才能安裝該軟件包。 如果在安裝這個(gè)軟件包時(shí)未解決這種存在的依賴關(guān)系, 會看到: v # rpm -ivh bar-1.0-1.i386.rpmrpm -ivh bar-1.0-1.i386.rpm v failed dependencies: v foo is needed by bar-1.0-1 #v 只有先安裝完所依賴的軟件包,才能解決這個(gè)問題。 如果想強(qiáng)制安裝 (這不是個(gè)好辦法,因?yàn)榘惭b后的軟件包未必能正常運(yùn)行), 可以使用 -nodeps 命令行選項(xiàng)。 Company name卸載卸載v 卸載軟件包: v # rpm -e foorpm
53、-e foov # v 請注意請注意 v 注意這里使用軟件包的 名字 “foo” , 而不是原始軟件包的文件名: foo-1.0-1.i386.rpm。卸載軟件包時(shí), 需要用原始包的實(shí)際文件名替換 foo 包名。 v 在卸載某個(gè)軟件包時(shí),可能會發(fā)生依賴關(guān)系錯(cuò)誤,這說明其它包與此包之間有安裝依賴關(guān)系。例如: v # rpm -e foorpm -e foov removing these packages would break dependencies: v foo is needed by bar-1.0-1 v # v 要使 RPM 在卸載此包時(shí)忽略該錯(cuò)誤, 使用 -nodeps 命令行選項(xiàng)。 Company name升級升級v 升級軟件包和安裝軟件包十分類似。 v # rpm -Uvh foo-2.0-1.i386.rpmrpm -Uvh foo-2.0-1.i386.rpmv foov # # RPM 將自動卸載已安裝的老版本的 foo 軟件包,用戶無法看到有關(guān)信息。事實(shí)上
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025下半年電新行業(yè)供給回歸有序需求韌性較好靜待周期復(fù)蘇
- 直播電商主播在2025年的粉絲互動與營銷策略研究報(bào)告
- 老年教育課程設(shè)置改革與2025年體驗(yàn)式教學(xué)方法應(yīng)用分析報(bào)告
- 2025年農(nóng)村一二三產(chǎn)業(yè)融合發(fā)展的農(nóng)村電商與農(nóng)業(yè)品牌建設(shè)報(bào)告
- 2025年文化旅游演藝項(xiàng)目季節(jié)性運(yùn)營與市場策略報(bào)告
- 2025年成人教育終身學(xué)習(xí)平臺運(yùn)營中的品牌建設(shè)與市場推廣報(bào)告
- 汽車輕量化材料在汽車底盤減重中的技術(shù)創(chuàng)新報(bào)告
- 汽車行業(yè)2025年供應(yīng)鏈風(fēng)險(xiǎn)管理與企業(yè)風(fēng)險(xiǎn)管理策略優(yōu)化方案報(bào)告
- 汽車共享平臺2025年運(yùn)營模式轉(zhuǎn)型與用戶行為重構(gòu)報(bào)告
- 2025年遠(yuǎn)程醫(yī)療服務(wù)在分級診療中的遠(yuǎn)程醫(yī)療技術(shù)與設(shè)備研發(fā)與創(chuàng)新報(bào)告
- 浙江省紹興市諸暨市2023-2024學(xué)年五年級下學(xué)期期末數(shù)學(xué)試卷
- 重慶市大足縣2023-2024學(xué)年四年級數(shù)學(xué)第二學(xué)期期末聯(lián)考試題含解析
- 煤礦調(diào)度智能化培訓(xùn)課件
- 基于PLC的啤酒發(fā)酵自動控制系統(tǒng)
- 重慶市沙坪壩區(qū)2022-2023學(xué)年八年級下學(xué)期期末英語試題
- 思辨與創(chuàng)新智慧樹知到期末考試答案章節(jié)答案2024年復(fù)旦大學(xué)
- 手術(shù)室-標(biāo)準(zhǔn)側(cè)臥位擺放
- (正式版)JBT 9229-2024 剪叉式升降工作平臺
- 合伙人退出協(xié)議書
- (高清版)DZT 0208-2020 礦產(chǎn)地質(zhì)勘查規(guī)范 金屬砂礦類
- 2024年春江蘇開放大學(xué)先進(jìn)制造技術(shù)第一次過程性考核作業(yè)答案
評論
0/150
提交評論