Linux環境及開發工具應用實踐:6_Linux開發工具2_第1頁
Linux環境及開發工具應用實踐:6_Linux開發工具2_第2頁
Linux環境及開發工具應用實踐:6_Linux開發工具2_第3頁
Linux環境及開發工具應用實踐:6_Linux開發工具2_第4頁
Linux環境及開發工具應用實踐:6_Linux開發工具2_第5頁
已閱讀5頁,還剩79頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Linux環境及開發工具應用實踐環境及開發工具應用實踐 -Linux開發工具開發工具2Company name目錄目錄1. Make及及Makefile編寫編寫2. CVS等版本管理工具等版本管理工具3. Linux軟件包安裝軟件包安裝4. Linux常用庫函數常用庫函數Company name為什么要分解工程為什么要分解工程v 編寫大的工程編寫大的工程:v 當用戶改動一行代碼,編譯器需要全部重新編譯來生成一個新的可執行文件。但如果項目是分開在幾個小文件里,改動其中一個文件的時候,別的源文件的目標文件(object files)已經存在,所以沒有什么原因去重新編譯它們。 只要通過基本的規劃,將

2、一個項目分解成多個小文件可使你更加容易的找到一段代碼。 v 層次更清晰層次更清晰Company name怎樣分解項目怎樣分解項目 vi) 不要用一個 header 文件指向多個源碼文件(例外:程序包 的 header 文件)。 vii) 如果可以的話,完全可以用多個 header 文件來指向同一個源碼文件。 viii) 不要在多個 header 文件中重復定義信息。 viv) 在每一個源碼文件里, #include 部分應聲明了源碼文件對應的所有header 文件。 Company namemake 建立工程的基本步驟:把你的源碼文件一個一個的編譯成目標文件的格式,最后把所有的目標文件加上需要

3、的程序包連接成一個可執行文件。 在大型的開發項目中,通常有幾十到上百個的源文件,如果每次均手工鍵入 gcc 命令進行編譯的話,則會非常不方便。因此,人們通常利用 make 工具來自動完成編譯工作。 Company namemakev這些工作包括:v如果僅修改了某幾個源文件,則只重新編譯這幾個源文件;v如果某個頭文件被修改了,則重新編譯所有包含該頭文件的源文件。利用這種自動編譯可大大簡化開發工作,避免不必要的重新編譯。 vMakefile為項目構建了一個依賴信息數據庫,在每次編譯前檢查是否可以找到所有需要文件。Company namemakev makefile 文件是許多編譯器,包括 Wind

4、ows NT 下的編譯器維護編譯信息的常用方法,只是在集成開發環境中,用戶通過友好的界面修改 makefile 文件而已。默認情況下,GNU make 工具在當前工作目錄中按如下順序搜索 makefile:vGNUmakefile、makefile、 Makefilev 在Linux系統中,習慣使用 Makefile 作為 makfile 文件。 Company namemakev make 工具通過一個稱為 makefile 的文件來完成并自動維護編譯工作。makefile 需要按照某種語法進行編寫,其中說明了如何編譯各個源文件并連接生成可執行文件,并定義了源文件之間的依賴關系。當修改了其中

5、某個源文件時,如果其他源文件依賴于該文件,則也要重新編譯所有依賴該文件的源文件。 Company name基本基本 makefile 結構結構vMake 的工作是讀進文本文件 makefile 。makefile 中一般包含如下內容:v需要由 make 工具創建的項目,通常是目標文件和可執行文件。通常使用“目標(target)”一詞來表示要創建的項目。v 要創建的項目依賴于哪些文件。v 創建每個項目時需要運行的命令。Company name基本基本 makefile 結構結構v 有了這些信息, make 會檢查硬盤上的文件,如果 目的文件的時間戳(該文件生成或被改動時的時間)比至少它的一 個依

6、賴文件舊的話, make 就執行相應的命令,以便更新目的文件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 結束 =Company name簡單簡單Makefile例子例子v Myprog是主要目標(要保 證總是最新)。給出規則說明只要文件myprog 比文件foo.

7、o或bar.o中任何一個舊,下一行命令將執行v 在檢查文件 foo.o 和 bar.o 的時間戳之前,它會往下查 找那些把 foo.o 或 bar.o 做為目標文件的規則。它找到關于 foo.o 的規則,該文件的依靠文件是 foo.c, foo.h 和 bar.h 。 它從下面再找不到生成這些依靠文件的規則,它就開始檢查磁盤上這些依賴文件的時間戳。如果這些文件中任何一個的時間戳比 foo.o 的新,命令 gcc -o foo.o foo.c 將會執行,從而更新 文件 foo.o 。 接下來對文件 bar.o 做類似的檢查,依賴文件在這里是文件 bar.c 和 bar.h Company nam

8、emake 工具建立程序的好處工具建立程序的好處v make 檢查時間戳檢查時間戳:源碼文件里一個簡單改變都會造成那個文件被重新編譯(因 為 .o 文件依靠 .c 文件),進而可執行文件被重新連接(因為 .o 文件被改變了)。v 不需再記憶復雜的依賴關系不需再記憶復雜的依賴關系:當改變一個 header 文件時,不再需要記住哪些源碼文件依靠它,因為所有的 資料都在 makefile 里。 make 會很輕松的替重新編譯所有那 些因依賴這個 header 文件而改變了的源碼文件,如有需要,再進行重新連接。Company name編寫編寫 make 規則規則 (Rules) v 最明顯的(也是最簡

9、單的)編寫規則的方法是一個一個的查看源碼文件,把它們的目標文件做為目的,而源碼文件和被它 #include 的 header 檔做為依靠文件。 v 使用 gcc 的時候,用 -M 開關,它會為每一個給它的文件輸出一個規則,把目標文件做為目的,而這個文件和所有應該被 #include 的 header 文件將做為依靠文件。注意這個規則會加入所有 header 文件,包 括被角括號()和雙引號()所包圍的文件。 v 由 gcc 輸出的規則不會含有命令部分;可以自己寫入命令 或者什么也不寫,而讓make 使用它的隱含的規則 。Company namemakefile 變量(宏)變量(宏)vmakef

10、ile 里的變量就像一個環境變量。事實上,環境變量在 make 過程中被解釋成 make 的變量。vmakefile變量大小寫敏感,一般使用大寫字母。v以相同的編譯選項同時編譯多個 C 源文件時,可以使用變量為每個目標的編譯指定編譯選項,避免乏味。v在 makefile 中引用變量的值時,只需變量名之前添加 $ 符號。Company namemakefile 變量的作用變量的作用v貯存一個文件名列表貯存一個文件名列表。生成可執行文件的規則包含一些目標文件名做為依靠。在這個規則的命令行里同樣的那些文件被輸送給 gcc 做為命令參數。如果在這里使用一個變數來貯存所有的目標文件名,加入新的目標文件會

11、變的簡單而且較不易出錯。v例如:前面程序可以改為:vOBJECT= foo.o bar.o v使用是加上 $符號。v$(OBJECT)Company namemakefile 變量的作用變量的作用v貯存可執行文件名貯存可執行文件名。如果用戶的項目被用在一個非 gcc 的系統里,或者如果想使用一個不同的編譯器,必須將所有使用編譯器的地方改成用新的編譯器名。但是如果使用一 個變量來代替編譯器名,那么只需要改變一個地方,其它所有地方的命令名就都改變了。 Company namemakefile 變量的作用變量的作用v貯存編譯器旗標。假設你想給你所有的編譯命令傳遞一組 相同的選項(例如 -Wall -

12、 O -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 結束 = Company namemake 的主要預定義變量的主要預定義變量$* 不包含擴展名的目標文件名稱$+ 所有的依賴文件,以空格分開,并以出現的先后為序,可能包含重復的依賴文件。$ 第一個依賴文件的名稱。$? 所有的依賴文件,以空格分開,這些依賴文件的修改日期比目標的創建日期晚。$ 目標的完整名稱。$ 所有的依賴文件,以空格分開,不包含重復的依賴文件。

14、$% 如果目標是歸檔成員,則該變量表示目標的歸檔成員名稱。AR 歸檔維護程序的名稱,默認值為 ar。ARFLAGS 歸檔維護程序的選項。Company namemake 的主要預定義變量的主要預定義變量vAS 匯編程序的名稱,默認值為 as。vASFLAGS 匯編程序的選項。vCC C 編譯器的名稱,默認值為 cc。vCCFLAGS C 編譯器的選項。vCPP C 預編譯器的名稱,默認值為 $(CC) -E。vCPPFLAGS C 預編譯的選項。vCXX C+ 編譯器的名稱,默認值為g+。vCXXFLAGS C+ 編譯器的選項。vFC FORTRAN 編譯器的名稱,默認值為f77。vFFLAG

15、S FORTRAN 編譯器的選項Company namemake 的主要預定義變量的主要預定義變量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 結束 = Company namemakefile 里的函數里的函數 (Functions) makefi

16、le 里的函數跟它的變量很相似-使用的時候,你用一個 $ 符號跟開括號,函數名,空格后跟一列由逗號分隔的參數,最后 用關括號結束。 例如wildcard 的函 數,它有一個參數,功能是展開成一列所有符合由其參數描述的文 件名,文件間以空格間隔。可以使用命令:SOURCES = $(wildcard *.c)這行會產生一個所有以 .c 結尾的文件的列表,然后存入變量 SOURCES 里Company namemakefile 里的函數里的函數 (Functions)v另一個有用的函數是patsubst( patten substitude, 匹配替換的縮寫) 。v它有個參數(第一個是一個需要匹配

17、的 式樣,第二個是用什么來替換它,第三個是一個需要被處理的 由空格分隔的字列。例如OBJS = $(patsubst %.c,%.o,$(SOURCES)運行將處理所有在 SOURCES 字列中的字,如果它的 結尾是 .c ,就用 .o 把 .c 取代。注意這里的 % 符號是匹 配一個或多個字符。 Company namemake隱含規則隱含規則v 定義如何從不同的依賴文件建立特定類型目標。v 支持兩種類型的隱含規則:后綴規則(Suffix Rule):Unix系統通常支持一種基于文件擴展名即文件名后綴的隱含規則。這種后綴規則定義了如何將一個具有特定文件名后綴的文件(例如.c文件),轉換成為具

18、有另一種文件名后綴的文件(例如.o文件):.c:.o$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $ $Company namemake隱含規則隱含規則v系統中默認的常用文件擴展名及其含義為:.o 目標文件.c C源文件.f FORTRAN源文件.s 匯編源文件.y Yacc-C源語法.l Lex源語法 Company namemake隱含規則隱含規則模式規則(pattern rules):定義更加復雜的依賴性規則。在目標名稱的前面多了一個 % 號,同時可用來定義目標和依賴文件之間的關系,例如下面的模式規則定義了如何將任意一個 X.c 文件轉換為 X.o 文件:v%.c:

19、%.ov$(CC) $(CCFLAGS) $(CPPFLAGS) -c -o $ $Company name運行運行 makev 直接在 make 命令的后面鍵入目標名可建立指定的目標;直接運行 make,則建立第一個目標。可以用 make -f mymakefile 這樣的命令指定 make 使用特定的 makefile,而不是默認的 makefile 或 Makefilev make 命令其他選項-C DIR 在讀取 makefile 之前改變到指定的目錄 DIR。-f FILE 以指定的 FILE 文件作為makefileCompany name運行運行 makemake 命令其他選項-

20、h 顯示所有的 make 選項-i 忽略所有的命令執行錯誤-I DIR 當包含其他 makefile 文件時,可利用該選項指定搜索目錄-n 只打印要執行的命令-p 顯示 make 變量數據庫和隱含規則-s 在執行命令時不顯示命令-w 在處理 makefile 前后,顯示工作目錄-W FILE 假定文件 FILE 已經被修改Company name調試調試makev-d選項能夠使make在執行命令時打印大量的額外調試信息。v輸出信息如下: 在重新編譯時make需要檢查的文件 被比較的文件以及比較的結果 需要被重新生成的文件 make想要使用的隱式規則 make實際使用的隱式規則以及所執行的命令C

21、ompany name常見的常見的make出錯信息出錯信息v No rule to make target target. Stop makefile中沒有包含創建指定的target所需要的規則,而且也沒有合適的默認規則可用。v target is up to date 指定target的相關文件沒有變化。v Target target not remade because of errors 在編譯target時出錯,這一消息僅在使用make的-k選項時才會出現。v Command: Command not found Make 找不到命令(拼寫錯誤或路徑不對)。v Illegal opti

22、on option 在調用make時包含了不能被make識別的選項。Company name有用的有用的makefile目標目標v install 把最終的二進制文件,所支持的庫文件或shell腳本及相關的文檔移動到文件系統中與之相應的最終位置,并設置文件的權限和屬主。 編譯程序,運行簡單的測試v uninstall 刪除由install目標所安裝的那些文件。v dist 用來生成準備發布的軟件包。將刪除編譯工作目錄中舊的二進制文件和目標文件,并創建一個歸檔文件,以便上載。v tags 創建或更新程序的標記表。v installtest或installcheck 驗證安裝過程。Company

23、name版本控制工具版本控制工具CVSv版本控制系統是一個軟件系統,它能對計算機軟件開發中源代碼(當然也不僅僅局限于源代碼)的版本進行跟蹤、管理和控制,可以記錄程序源代碼的修改過程并維護一個完整的代碼修改和更新的歷史記錄。v使用CVS來管理軟件項目,在版本更改時只存儲不同版本的diff文件。v更適合用于多人協作開發的項目管理。vcvs的特點: 支持遠程訪問; 用戶可以為他要修改的文件編輯標志。 完成項目中跟蹤、協調和管理的工作,以保證多人協作開發軟件系統的完整性和安全性。Company name版本控制工具版本控制工具CVSv CVS 的基本工作思路是這樣的:在一臺服務器上建立一個倉庫,倉庫里

24、可以存放許多不同項目的源程序。由倉庫管理員統一管理這些源程序。這樣,就好象只有一個人在修改文件一樣。避免了沖突。每個用戶在使用倉庫之前,首先要把倉庫里的項目文件下載到本地。用戶做的任何修改首先都是在本地進行,然后用 cvs 命令進行提交,由 cvs 倉庫管理員統一修改。這樣就可以做到跟蹤文件變化,沖突控制等等。Company name版本控制工具版本控制工具CVSvCVS軟件,請找到相關的rpm,tgz,deb 等包裝上,或者到 /CVS/Dev/code vhttp:/ vhttp:/www.loria.fr/molli/cvs-index.html

25、 下載原程序編譯安裝Company name版本控制工具版本控制工具CVS的使用的使用v建立CVS服務器v建立CVS項目v定義模塊v版本的分支和合并v多人協作開發軟件Company name建立建立CVS服務器服務器v在使用CVS進行版本管理控制前,必須首先建立起CVS服務器。v為了CVS系統能夠正常運行,則必須保證一定的系統資源,一般需要32M就可以正常工作。Company name建立建立CVS服務器服務器v 1)建立CVSROOT目錄:v #groupadd cvsv #adduser cvsrootv 2)用cvsroot用戶登陸,修改/home/cvsroot的權限,賦予同組人讀寫的

26、權限。v $chmod 777v 3)建立CVS倉庫:v $cvs -d /home/cvsroot initCompany name建立建立CVS服務器服務器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 注意:上面所加入的行是單獨一整行, /usr/bin/cvs 是CVS版本的命令路徑, /home/cvsroot是所建立的CVSR

27、OOT的路徑。v 在/etc/services里加入:v cvsserver 2401/topCompany name建立建立CVS服務器服務器v cvsserver是任意的名稱,但是不能和已有服務重名,而且要求和/etc/inetd.conf中所加入行的第一項一致。v5)添加可以使用CVS服務的用戶到cvs組:v以root身份修改/etc/group,把需要使用CVS的用戶名加到cvs組里,修改后的/etc/group應該有下面這樣一行:v cvs:x:105:laser,gumpwuCompany name建立建立CVS服務器服務器v 6)重啟inetd使修改生效:v #killall -

28、HUP inetdv 這樣服務器設置完成,接下來進行客戶端的配置。v 1)設置環境變量CVSROOT:v $export CVSROOT=:pservser:laserthe_server-name:/home/cvsrootv 這里pservser是訪問方式,laser是可以使用CVS服務器的用戶名, the_server-name是CVS服務器的名稱或IP地址, /home/cvsroot是CVS服務器的CVSROOT目錄。Company name建立建立CVS服務器服務器v2)登錄CVS服務器:v輸入$cvs login登錄,輸入口令,口令和在CVS服務器上的口令一樣。成功登錄后系統將在

29、用戶主目錄建立一個.cvspass文件,以后就不必輸入口令。Company name建立建立CVS項目項目v使用CVS進行版本控制的第一步是是在倉庫中建立項目。你可以有幾種方法:v 建立一個目錄樹v 從其它版本控制系統建立文件v 從無到有建立一個目錄樹 Company name建立建立CVS項目項目v建立一個目錄樹v 當你開始使用CVS時,你可能已經有幾個項目可以使用CVS進行管理了。在這種情況下,最容易的方法就是使用:“import”命令。下面通過一個例子來講解如何使用它的。假定現在有一些想放到CVS中的文件在wdir中,并且你想讓它們放在數據倉庫中的如下目錄: $CVSROOT/yoyod

30、yne/rdir Company name建立建立CVS項目項目v 可以使用如下命令: $cdwdir $cvsinport-mInportedSourcesyoyodyne/rdiryoyostart 如果沒有使用-m參數記錄一個日志信息,CVS將調用一個編輯器(*譯者注:通常是vi)并且提示輸入信息。yoyo字符串是開發者標箋,start是發行標箋。他們沒有什么特別的意義,僅僅是因為CVS的需要才放在這里。 Company name建立建立CVS項目項目v 現在可以檢查一下它是否有效了,然后可以刪除原來的代碼目錄。 $cd $mvdirdir.orig $cvscheckoutyoyody

31、ne/dir $diff-rdir.origyoyodyne/dir $rm-rdir.orig. 為了避免偶然進入原來的目錄中去編輯文件,刪除原來的代碼是個好主意。當然,在你刪除之前保留一份備份到其它地方也是明智之舉。 “checkout”命令能使用模塊名作為參數(正如前面所有例子)或是一個相對于$CVSROOT的路徑,如同上面的例子。應當檢查CVS目錄中的權限情況是否合適,應當使它們屬于某一個特定的組。v 如果想import的一些文件是二進制代碼,你可以使用一些特殊的方法表明這些文件是否 是二進制文件。 Company name建立建立CVS項目項目v 從其它版本控制系統建立文件v 如果有

32、一個其它版本控制系統維護的項目,例如RCS,也許希望把這些文件放到CVS中,并且要保留這些文件的歷史。 v 從從RCSRCS: 如果你使用RCS,找到RCS文件,通常一個文件名叫foo.c的文件會有RCS/foo.c,v的RCS文件。(但它有可能在其它地方,請看RCS的文檔以得到相關信息)。如果文件目錄在CVS中不存在,那在CVS中創建它。然后把這些文件拷貝到CVS的倉庫目錄中(在倉庫中的名字必須是帶,v的原文件;這些文件直接放在CVS中的這個目錄下,而非RCS子目錄中)。這是在CVS中一個為數不多的直接進入CVS倉庫直接操作的情況,而沒使用CVS命令。然后就可以把它們在新的目錄下checko

33、ut了。當把RCS文件移動CVS中時,RCS文件應在未被鎖定的狀態,否則移動操作時CVS將會出現一些問題。Company name建立建立CVS項目項目v 從其它版本控制工具 從SCCSSCCS: 有一個sccsarcs的腳本文件可以做把SCCS的文件轉化成RCS文件,這個文件放在CVS原代碼目錄的contrib目錄中。注意: 你必須在一臺同時安裝了RCS和SCCS的機器上運行它。并且,正如其它在contrib.目錄中的其它腳本一樣。(你的方法也許是變化多端的) 從PVCSPVCS: 在contrb中有一個叫pves-to-rcs的腳本可以轉換PVCS到RCS文件。你必須在一臺同時有PVCS和

34、RCS的機器上運行它。 Company name建立建立CVS項目項目v 從無到有建立一個目錄樹v 建立一個新的項目,最容易的方法是建立一個空的目錄樹,如下所示: $mkdirtc $mkdirtc/man $mkdirtc/testing 在這之后,你可以import這個(空)目錄到倉庫中去。 $cdtc $cvsimport-mcreateddirectorystructureyoyodyne/diryoyo start 然后,當新增一個文件時,增加文件(或目錄)到倉庫中。請檢查$CVSROOT中的權限是否正確。 Company name定義模塊定義模塊v 在moduyes文件中定義模塊。

35、這不是嚴格需要的,但模塊能把相關的目錄和文件容易關聯起來。下面的例子可以充分演示如何定義模塊。 1.得到模塊文件的工作拷貝。 $cvscheckoutCVSROOT/modules $cdCVSROOT 2.編輯這個文件并寫入定義模塊的行。你可以使用下面的行定義模塊tc: tcyoyodyne/tc 3.提交你的更改到倉庫 $cvscommit-mAddedtcmodule.modules 4.發行模塊文件 $cd $cvsrelease-dCVSROOT Company name分支與合并分支與合并 v CVS允許你獨立出一個派生的代碼到一個分離的開發版本-分支。當你改變一個分支中的文件時,

36、這些更改不會出現在主開發版本和其它分支版本中。 在這之后你可以使用合并(merging)把這些變更從一個分支移動到另一個分支(或主開發版本)。合并涉及到使用“cvsupdate-j”命令,合并這些變更到一個工作目錄。 你可以確認(commit)這次版本,并且因此影響到拷貝這些變更到其它的分支。 Company name多個開發者同時工作多個開發者同時工作v 當多個開發者同時參與一個項目時,常常會發生沖突。一般經常發生的情況是兩個人想同時編輯一個文件的時候。它的解決方法之一是文件鎖定或是使用保留式的checkout,這種方法允許一個文件一次只允許一個人編輯。這是一些版本控制系統的唯一解決方式,包

37、括RCS和SCCS。現在在CVS通常使用保留式checkout的方法是使用CVSadmin-1命令。下面將講述可以使用適當的方法來避免兩個人同時編輯一個文件,而非使用軟件的方式強迫達到這一點。 Company name多個開發者同時工作多個開發者同時工作v 在CVS中默認的方法是unreservedcheckout-非保留式的導出。在這種方法下,開發者可以同時在他們的工作拷貝中編輯一個文件。第一個提交工作的沒有一種自動的方法可以知道另一個人在編輯文件。另一個人可能會在試圖提交時得到一個錯誤信息。他們必須使用CVS命令使他們的工作拷貝同倉庫的內容保持更新。這個操作是自動的。 CVS可以支持fac

38、ilitate多種不同的通信機制,而不會強迫去遵守某種規則,如resered checkouts那樣。以下的部分描述這些不同的方式是如何工作的,和選擇多種方式之間涉及到的一些問題。 Company name多個開發者同時工作多個開發者同時工作v 文件狀態 基于你對導出的文件使用過的操作,和這些文件在倉庫中的版本使用過的操作,我們可以 把一個文件分為幾個狀態。這個狀態可以由status命令得到,它們是: up-to-date: 對于正在使用的這個分支,文件同倉庫中的最后版本保持一致。 LocallyModified: 你修改過文件,但沒有commit。 Company name多個開發者同時工作

39、多個開發者同時工作vLocallyadded: 使用了“add”命令增加文件,但沒有“commitLocallyRemoved: 你使用了remove命令,但沒有commitNeedscheckout: 其他人提交了一個更新的版本。這個狀態的名字有些誤導,你應當使用update而非checkout來更新新的版本。 Company name多個開發者同時工作多個開發者同時工作v NeedsPatch: 象“Needscheckout”一樣,但CVS服務將只給出Patch(補丁)文件,而非整個文件。而給出Patch和給出整個文件的效果是相同的。 NeedsMerge: 一些人提交了一個更新版本,而

40、你卻修改過這些文件。 Filehadconflictsonmerge: 這同“LocallyModified”相象,只是“update命令給出了一個沖突信息。Company name多個開發者同時工作多個開發者同時工作v Unkown: CVS不知道關于這個文件的情況.例如,你創建了一個新文件,而沒有使用add命令為了幫助弄清楚文件的狀態,status也報告工作版本(working vevision),這是這個文件是從哪個版本來的,另外還報告倉庫版本(Repository vevision)。這是這個文件在倉庫中的這個版本分支的最后版本。 Company name多個開發者同時工作多個開發者同

41、時工作v 你應當把update和status命令放在一起來認識。你使用update使你的文件更新到最新狀態,你使用status命令來得到update命令將會做何種操作。(當然,倉庫中的狀態將可能會在你運行update之前變化)。事實上,如果你想使用一個命令得到比使用status正式的狀態信息,你可以使用: $cvs-n-q-update 這里-n選擇項表示不真正執行update,而只顯示狀態;-q選擇項表示不打印每個目錄的名字。 Company name多個開發者同時工作多個開發者同時工作v 使一個文件更新到最版本 當你想更新或是合并一個,使用update命令。對于一個不是最新版本的文件,這個

42、命令大略等同于checkout命令:最新版本從倉庫中提出并放到工作目錄中。 當你使用update命令時,你修改過的文件在任何情況下不會受到損害。如果在倉庫中沒有更新的版本,update時你的代碼沒有任何影響。當你編輯過一個文件,并且倉庫中有更新版本,那么update將合并所有的變更到你的工作目錄。 Company name多個開發者同時工作多個開發者同時工作v 例如,想象一個你導出了一個1.4版的文件并且開始編輯它,在某一時候其他人提交了1.5版,然后又提交了1.6版,如果你運行update命令,CVS將把1.4版到1.6版之間的變更放到你的文件中。如果在1.4版和1.6版之間的改變太靠近于的

43、你一些變更的話,那么一個覆蓋(overlop)沖突就發生了。在這種情況下將輸出一個警告信息,然后結果保留的文件中包含了有沖突代碼的兩個版本,由特別的符號所分隔開。Company name版本控制工具版本控制工具CVSv 建立一個新的CVS項目: 1. 進入到你的已有項目的目錄:$cd cvstest2. 運行命令: $cvs import -m “this is a cvstest project” stest v_0_0_1 start 說明:import 表示向cvs倉庫輸入項目文件; -m參數后面的字串是描述文本; cvstest 是項目名稱; v_0_0_1是這個分支的總標記; sta

44、rt 是每次 import 標識文件的輸入層次的標記。v 運行下面的命令: $cvs checkout cvstestv 從倉庫中檢索出cvstest項目的源文件Company name版本控制工具版本控制工具CVSv如果你已經做過一次checkout了,那么不需要重新checkout,只需要進入cvstest項目的目錄,更新一下就行了:v $cd cvstest $cvs updateCompany name版本控制工具版本控制工具CVSv 打印出狀態報告: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 欄,可能有四種狀態: Up-to-date:表明你獲得的文件是最新的; Locally Modified:表明你曾經修改過該文件,但還沒有提交,你的版本比倉庫里的新; Needing Patch:表明其它人已經修改過該文件并且已經提交了!你的版本比倉庫里的舊; Needs

46、 Merge:表明你曾經修改過該文件,但是別人也修改了這個文件,而且還提交給倉庫了! Company name版本控制工具版本控制工具CVSv1,你對某個文件做了修改,比如說改了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幫你檢查哪個文件需要提交。 Company name版本控制工具版本控制工具CVSv2,當開始工作時,可能先

47、做: $cvs status v如果發現有人改了ceo.c,可以更新: $cvs update ceo.c 或: $cvs update 把ceo.c這個文件更新為最新版本Company name版本控制工具版本控制工具CVSv還有一些命令,比如要增加一個文件 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 有五個基本的操作 模式(不包括包的編譯): 安裝,卸載,升級,查詢,校驗v要了解完整的細節和選項,可以使用 rpm -help Company name安裝安裝v 典型的 RPM 有著類似 foo-1.0-1.i386.rpm這樣的名稱, 其中指明了包名 (foo), 版本號 (1.0), 發行號 (1), 和硬件平臺 (i386)。安裝一個軟件包只需簡單的鍵入以下命令: v # rpm -ivh foo-1.0-1.i386.rpmrpm -ivh foo-1.0-1.i386.rpm v foo # # v RPM 將會打印出軟件包的名字( 并不一定要與文件名相同 ), 然后

49、打印出一連串的 # 號以表示安裝進度。 Company name安裝安裝v 盡管通常是使用v rpm -ivh foo-1.0-1.i386.rpm 來安裝包, 但也可以用v rpm -Uvh foo-1.0-1.i386.rpm 來替代。 -U 是包升級參數, 也可以用來安裝新包。 Company name軟件包已被安裝軟件包已被安裝v 如果軟件包已被安裝, 會出現以下信息: 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 選項, 這樣 RPM 將忽略該錯誤信息: v # rpm -ivh -replacepkgs foo-1.0-1.i386.rpmrpm -ivh -replacepkgs foo-1.0-1.i386.rpmv foo v # # Company name文件沖突文件沖突v 如果要安裝的軟件包中有一個文件已在安裝其它包時被安裝,會顯示以下信息: 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 忽略該錯誤信息, 請使用 -replacefiles 命令行選項: v # rpm -ivh -replacefiles foo-1.0-1.i386.rpmrpm -ivh -replacefiles foo-1.0-1.i386.rpm v foo # # Company name未解決依賴關系未解決依賴關系v 一個 RPM 包可能會 依賴 其它

52、軟件包, 也就是說要求在安裝了特定的軟件包之后才能安裝該軟件包。 如果在安裝這個軟件包時未解決這種存在的依賴關系, 會看到: 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 只有先安裝完所依賴的軟件包,才能解決這個問題。 如果想強制安裝 (這不是個好辦法,因為安裝后的軟件包未必能正常運行), 可以使用 -nodeps 命令行選項。 Company name卸載卸載v 卸載軟件包: v # rpm -e foorpm

53、-e foov # v 請注意請注意 v 注意這里使用軟件包的 名字 “foo” , 而不是原始軟件包的文件名: foo-1.0-1.i386.rpm。卸載軟件包時, 需要用原始包的實際文件名替換 foo 包名。 v 在卸載某個軟件包時,可能會發生依賴關系錯誤,這說明其它包與此包之間有安裝依賴關系。例如: v # rpm -e foorpm -e foov removing these packages would break dependencies: v foo is needed by bar-1.0-1 v # v 要使 RPM 在卸載此包時忽略該錯誤, 使用 -nodeps 命令行選項。 Company name升級升級v 升級軟件包和安裝軟件包十分類似。 v # rpm -Uvh foo-2.0-1.i386.rpmrpm -Uvh foo-2.0-1.i386.rpmv foov # # RPM 將自動卸載已安裝的老版本的 foo 軟件包,用戶無法看到有關信息。事實上

溫馨提示

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

評論

0/150

提交評論