版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1后綴名后綴名說(shuō)明說(shuō)明.c.cC C語(yǔ)言源代碼文件語(yǔ)言源代碼文件.C/.cc/.cxx.C/.cc/.cxxC+C+源代碼文件源代碼文件.h.h程序所包含的頭文件程序所包含的頭文件.i.i已經(jīng)預(yù)處理過(guò)的已經(jīng)預(yù)處理過(guò)的C C語(yǔ)言源代碼文件語(yǔ)言源代碼文件.ii.ii已經(jīng)預(yù)處理過(guò)的已經(jīng)預(yù)處理過(guò)的C+C+源代碼文件源代碼文件.m.mObjective-CObjective-C語(yǔ)言源代碼文件語(yǔ)言源代碼文件.s.s匯編語(yǔ)言源代碼文件匯編語(yǔ)言源代碼文件.S.S經(jīng)過(guò)預(yù)編譯的匯編語(yǔ)言源代碼文件經(jīng)過(guò)預(yù)編譯的匯編語(yǔ)言源代碼文件.a/.so.a/.so編譯后的庫(kù)代碼編譯后的庫(kù)代碼.o.o編譯后的目標(biāo)文件編譯后的目標(biāo)文
2、件GNU C/C+編譯器的使用gcc通過(guò)擴(kuò)展名來(lái)判斷文件的類(lèi)型,從而確定用何種方式處理該文件通過(guò)擴(kuò)展名來(lái)判斷文件的類(lèi)型,從而確定用何種方式處理該文件2GNU C/C+編譯器的使用gcc 編譯器選項(xiàng)和參數(shù)參數(shù)含義-o Place the output into -c Compile and assemble, but do not link-ggdbProduce debugging information for use by GDB.-Othe compiler tries to reduce code size and execution time,without performing a
3、ny optimizations that take a great deal of com-pilation time.-gProduce debugging information in the operating systems native format. GDB can work with this debugging information.-I Add the directory dir to the list of directories to be searched for header files. Directories named by -I are searched
4、before the-L Search the library named library when linking3GNU C/C+編譯器的使用1、直接通過(guò)編譯生成目標(biāo)代碼可執(zhí)行文件:、直接通過(guò)編譯生成目標(biāo)代碼可執(zhí)行文件:$gcc hello.c o hello2、如果一個(gè)程序包含有多個(gè)源文件,則也可直接生成目標(biāo)代碼:、如果一個(gè)程序包含有多個(gè)源文件,則也可直接生成目標(biāo)代碼:void f1()printf(“%sn”, function 1);void f2()printf(%sn, function 2);main()f1();f2();$gcc f1.c f2.c main.c o mai
5、n4 Linux上廣泛使用的C語(yǔ)言編譯器是GNU C編譯器,GNU C建立在自由軟件基金會(huì)的編程許可證的基礎(chǔ)上,可以自由發(fā)布。在Linux下,一個(gè)完整的C語(yǔ)言開(kāi)發(fā)環(huán)境到少包括以下三個(gè)組成部分: 函數(shù)庫(kù)glibc (在/usr/lib和/lib目錄中) 編譯器gcc 系統(tǒng)頭文件glibc_header (*.h) glibc是構(gòu)成一個(gè)完整的C語(yǔ)言開(kāi)發(fā)環(huán)境所必不可少的組成部分,也是Linux下C語(yǔ)言的主要函數(shù)庫(kù)。 glibc_header中包含了系統(tǒng)編譯源代碼所需要的聲明文件,如果缺少系統(tǒng)頭文件,很多用到系統(tǒng)功能的C程序?qū)o(wú)法編譯。(包含在/usr/include/及其子目錄中)5 GNU C/C
6、+函數(shù)庫(kù)定義:是一些預(yù)先編譯好的函數(shù)的集合,那些函數(shù)都是按照可再使用的原則編寫(xiě)的。它們通常是一組相互關(guān)聯(lián)的用來(lái)完成某項(xiàng)常見(jiàn)工作的函數(shù)構(gòu)成(比如c庫(kù)里面的標(biāo)準(zhǔn)輸入輸出函數(shù)、時(shí)間函數(shù)和數(shù)學(xué)函數(shù)等)。函數(shù)庫(kù)中的函數(shù)可以通過(guò)連接程序與應(yīng)用程序進(jìn)行連接,而不必在每次開(kāi)發(fā)程序時(shí)都對(duì)這些通用的函數(shù)進(jìn)行編譯。不同類(lèi)型的應(yīng)用程序?qū)?huì)使用不同的函數(shù)庫(kù)。如數(shù)學(xué)應(yīng)用將使用數(shù)學(xué)庫(kù)libm(/usr/lib/libm.a, /usr/lib/libm.so),標(biāo)準(zhǔn)的C庫(kù)libc(/usr/lib/libc.a,/usr/lib/libc.so)。注意:*.h只是對(duì)函數(shù)的聲明(declaration),函數(shù)的定義是在具體的
7、函數(shù)庫(kù)中6所有的程序都將使用標(biāo)準(zhǔn)的C函數(shù)庫(kù)libc,該庫(kù)中包含了內(nèi)存管理或輸入輸出操作的基本函數(shù),這些庫(kù)都存放在/usr/lib或/lib這些系統(tǒng)公用的目錄中,系統(tǒng)中的任何用戶(hù)都可以利用這些庫(kù)。注:用戶(hù)可以自己定義自己的函數(shù)庫(kù)!庫(kù)可以有三種使用的形式: 靜態(tài)庫(kù)(*.a):代碼在編譯時(shí)就已連接到開(kāi)發(fā)人員開(kāi)發(fā)的應(yīng)用程序中。靜態(tài)庫(kù)在程序編譯時(shí)會(huì)被連接到目標(biāo)代碼中,程序運(yùn)行時(shí)將不再需要該靜態(tài)庫(kù) 共享庫(kù)(shared object,以*.so作為后綴):只是在程序開(kāi)始運(yùn)行時(shí)才載入,在編譯時(shí),只是簡(jiǎn)單地指定需要使用的庫(kù)函數(shù)。 動(dòng)態(tài)庫(kù):是共享庫(kù)的另一種變化形式,也是在程序運(yùn)行時(shí)載入,使用的庫(kù)函數(shù)不是在程序運(yùn)
8、行開(kāi)始,而是在程序中的語(yǔ)句需要使用該函數(shù)時(shí)才載入。類(lèi)似于windows OS中的DLL文件。7共享庫(kù)的生成方法 動(dòng)態(tài)庫(kù)可以在程序運(yùn)行期間釋放動(dòng)態(tài)庫(kù)所占用的內(nèi)存,騰出空間供其他程序使用。 由于共享庫(kù)和動(dòng)態(tài)庫(kù)并沒(méi)有在程序中包括庫(kù)函數(shù)的內(nèi)容,只是包含了對(duì)庫(kù)函數(shù)的引用,因此代碼的規(guī)模比較小。生成用戶(hù)共享庫(kù)的方法: gcc test1.c test2.c test3.c -fPIC -shared -o libtest.so使用自定義的庫(kù)進(jìn)行編譯、連接 gcc test.c -L. libtest.so -o test8靜態(tài)庫(kù)的生成方法 靜態(tài)庫(kù)的生成方法:Step1: 編譯而不連接 $ gcc test
9、1.c -c -o test1.o $ gcc test2.c -c -o test2.o $ gcc test3.c -c -o test3.oStep2: 生成ar命令生成靜態(tài)庫(kù)$ar rcs libtest.a test1.o test2.o test3.oStep3: 使用靜態(tài)庫(kù)編譯和連接,生成可執(zhí)行文件 gcc test.c -L. libtest.a -o test9 系統(tǒng)中可用的庫(kù)都存放在/usr/lib和/lib目錄中。庫(kù)文件名由前綴lib和庫(kù)名以及后綴組成。根據(jù)庫(kù)的類(lèi)型不同,后綴名也不一樣。 共享庫(kù)名的格式:庫(kù)的名稱(chēng).so.主版本號(hào).次版本號(hào) 靜態(tài)庫(kù)名的格式:庫(kù)的名稱(chēng).a例如
10、:libm.so.5 數(shù)學(xué)共享庫(kù)的標(biāo)識(shí)字符為m,版本號(hào)為5libm.a 靜態(tài)數(shù)字庫(kù)libc.a 為標(biāo)準(zhǔn)C庫(kù)10函數(shù)庫(kù)存放的標(biāo)準(zhǔn)目錄: /lib系統(tǒng)必備共享庫(kù) /usr/lib標(biāo)準(zhǔn)共享庫(kù)和靜態(tài)庫(kù) /usr/i486-linux-libc5/liblibc5兼容性函數(shù)庫(kù) /usr/X11R6/libX11R6的函數(shù)庫(kù) /usr/local/lib 本地函數(shù)庫(kù)11頭文件存放的目錄: /usr/include系統(tǒng)頭文件 /usr/local/include本地頭文件共享庫(kù)及相關(guān)配置文件在/etc目錄中,其中:ld.so.conf包含共享庫(kù)的搜索位置ldconfig 共享庫(kù)管理工具,一般在更新了共享庫(kù)之
11、后要運(yùn)行該命令ldd可查看可執(zhí)行文件所使用的共享庫(kù)e.g. #ldd test, 查看test文件的共享庫(kù)依賴(lài):機(jī)群系統(tǒng)并行程序調(diào)試環(huán)境 DENNET19Makefile里主要包含了五個(gè)東西:里主要包含了五個(gè)東西:顯式規(guī)則:顯式規(guī)則:要生成的文件,文件的依賴(lài)文件,生成的命令要生成的文件,文件的依賴(lài)文件,生成的命令 隱晦規(guī)則:隱晦規(guī)則:自動(dòng)推導(dǎo)目標(biāo)文件和依賴(lài)文件名的關(guān)系自動(dòng)推導(dǎo)目標(biāo)文件和依賴(lài)文件名的關(guān)系變量定義:運(yùn)行變量定義:運(yùn)行make時(shí),時(shí),變量都會(huì)被擴(kuò)展到相應(yīng)的引用位置上變量都會(huì)被擴(kuò)展到相應(yīng)的引用位置上文件指示文件指示: (1)在一個(gè)在一個(gè)Makefile中引用另一個(gè)中引用另一個(gè)Makef
12、ile,與,與c語(yǔ)言中語(yǔ)言中的的#include一樣,使用一樣,使用“include foo.make”這種方式(如果是這種方式(如果是“-include foo.make”,則表示忽略,則表示忽略foo.make中的錯(cuò)誤);中的錯(cuò)誤);(2)根據(jù)某些情況指根據(jù)某些情況指定定Makefile中的有效部分,就像中的有效部分,就像C語(yǔ)言中的預(yù)編譯語(yǔ)言中的預(yù)編譯#if一樣;一樣;(3)定義定義一個(gè)多行的命令一個(gè)多行的命令注釋?zhuān)鹤⑨專(zhuān)? Makefile中的命令,必須要以中的命令,必須要以Tab鍵開(kāi)始鍵開(kāi)始 機(jī)群系統(tǒng)并行程序調(diào)試環(huán)境 DENNET20Makefile的一般命名規(guī)則為:的一般命名規(guī)則為:
13、常規(guī)命名順序:常規(guī)命名順序:GNUmakefile makefile Makefile特定名稱(chēng):特定名稱(chēng):Makefile.linuxmake f Make.linuxmake file Make.linuxMakefile最常用,一方面因?yàn)轱@目,另一方面符合大多數(shù)人的習(xí)慣最常用,一方面因?yàn)轱@目,另一方面符合大多數(shù)人的習(xí)慣 機(jī)群系統(tǒng)并行程序調(diào)試環(huán)境 DENNET21 讀入所有的讀入所有的Makefile; 讀入被讀入被include的其它的其它Makefile; 初始化文件中的變量;初始化文件中的變量; 推導(dǎo)隱晦規(guī)則,并分析所有規(guī)則;推導(dǎo)隱晦規(guī)則,并分析所有規(guī)則; 為所有的目標(biāo)文件創(chuàng)建依賴(lài)關(guān)系
14、鏈;為所有的目標(biāo)文件創(chuàng)建依賴(lài)關(guān)系鏈; 根據(jù)依賴(lài)關(guān)系,決定哪些目標(biāo)要重新生成;根據(jù)依賴(lài)關(guān)系,決定哪些目標(biāo)要重新生成; 執(zhí)行生成命令執(zhí)行生成命令。 23規(guī)則的定義 規(guī)則中的項(xiàng)目定義必須從最左邊開(kāi)始,一個(gè)規(guī)則中的第二行以后的行必須以tab健開(kāi)始。 規(guī)則的格式如下: targets :prerequisitescommands 或 targets :prerequisites;commandscommands當(dāng)目標(biāo)是庫(kù)文件時(shí),目標(biāo)內(nèi)的成員名。例如目標(biāo)x.a(y.o)的目標(biāo)名為x.a,成員名為y.o30Makefile文件中的符號(hào)“%” %可以理解為統(tǒng)配符??墒褂盟x或重定義模式規(guī)則。 例如:%.o:
15、%.cgcc c $ 定義了一個(gè)規(guī)則: 所有目標(biāo)文件*.o依賴(lài)C語(yǔ)言源程序*.c; 且生成方法為gcc -c $ 。31Makefile文件中的符號(hào)“=”或“:=” 符號(hào)“=”或“:=”用于修改已經(jīng)定義的變量或在已定義變量的基礎(chǔ)上定義新變量。 例如已知:var1 = a.c b.c c.c則var2 = $(var1:.c=.o)定義var2 =a.o b.o c.o而var1 += d.c重定義var1,其值為var1 = a.c b.c c.c d.c32“:=”與“=”的區(qū)別 “:=”與“=”是有區(qū)別的。 當(dāng)使用“=”時(shí),變量將做遞歸或擴(kuò)展 “:=”只作簡(jiǎn)單替換。廈門(mén)大學(xué)通訊工程系Mak
16、efile的Phony目標(biāo) .PHONY: target 不是實(shí)際的文件目標(biāo) 常用于clean這類(lèi)并不產(chǎn)生實(shí)際文件的目標(biāo) 34Makefile中的常用目標(biāo) clean:用于對(duì)項(xiàng)目環(huán)境進(jìn)行準(zhǔn)備,清除已經(jīng)生成的目標(biāo)文件等以便重新編譯; install:用于對(duì)整個(gè)項(xiàng)目的成品進(jìn)行安裝; uninstall:則是用于對(duì)安裝的項(xiàng)目進(jìn)行卸載。35Makefile示例1/文件文件f1.c的內(nèi)容的內(nèi)容f1(int arg)printf(”F1: you passed: %dn”,arg);/文件文件f2.c的內(nèi)容:的內(nèi)容:f2(char *arg)printf(”F2: you passed: %sn”,arg
17、);/文件文件f3.c的內(nèi)容的內(nèi)容#include main()fprintf(stderr,”Begine:n”);f1(15);f2(”Hello World!”);fprintf(stderr,”:Endn”);exit(0); 36Makefile示例2 它們之間的關(guān)系如下圖37項(xiàng)目編譯過(guò)程分析項(xiàng)目編譯過(guò)程分析 按照gcc的工作過(guò)程,對(duì)模塊的編譯和鏈接過(guò)程可分為: (1)生成目標(biāo)代碼gcc -c f1.cgcc -c f2.cgcc -c f3.c (2) 生成可執(zhí)行程序 gcc -o f f1.o f2.o f3.o38Makefile內(nèi)容f: f1.o f2.o f3.ogcc -
18、o f f1.o f2.o f3.of1.o: f1.cgcc c f1.cf2.o: f2.cgcc c f2.cf3.o: f3.cgcc c f3.c39Makefile的使用 有了Makefile文件,可以使用make命令對(duì)此項(xiàng)目進(jìn)行編譯。編譯方法為: make 或 make f 若要編譯單個(gè)項(xiàng)目,比方說(shuō)f1.o,可以使用以下方法: make f1.o40增加all、clean和install目標(biāo)的Makefileall : f#make all to build ff : f1.o f2.o f3.ogcc -o f f1.o f2.o f3.of1.o: f1.cgcc c f1.
19、cf2.o: f2.cgcc c f2.cf3.o: f3.cgcc c f3.cclean:rm f f?.o#make all and install f to /usr/bin with permission 755install: allinstall m 755 /usr/local/bin自動(dòng)化編譯自動(dòng)化編譯 Autoconf介紹內(nèi)容大綱 學(xué)習(xí)目的 Autoconf介紹 Autoconf框架圖 Autoconf流程 Autoconf優(yōu)化 Autoconf小結(jié) FAQ學(xué)習(xí)目的 如何方便在linux系統(tǒng)上寫(xiě)c/c+等工程的一種技巧,從而提高工程化的能力; 方便的閱讀理解開(kāi)源代碼; 容易
20、理解掌握整個(gè)工程源碼的架構(gòu); 寫(xiě)出優(yōu)秀而漂亮的代碼框架。Autoconf介紹 無(wú)論是在Linux還是在Unix環(huán)境中,make都是一個(gè)非常重要的編譯命令。 可以通過(guò)查閱make的幫助文檔來(lái)手工編寫(xiě)Makefile,當(dāng)然我們更愿意自動(dòng)生成Makefile。 要想了解更多的自動(dòng)化編譯的知識(shí),不僅僅要熟悉Makefile的語(yǔ)法,還要熟悉m4規(guī)則。 實(shí)踐還證明:光靠這些規(guī)則理論是不夠的,我們要學(xué)會(huì)在實(shí)踐中創(chuàng)造規(guī)則、完善理論。Autoconf框架圖Autoconf流程-如何寫(xiě)configure.in在開(kāi)始antoconf之前,了解一下Autoconf依賴(lài)于: Bash, Coreutils, Diffu
21、tils, Grep, M4, Make, Perl, Sed.autoscan程序可以用來(lái)為軟件包創(chuàng)建configure.in文件。autoscan在以命令行參數(shù)中指定的目錄為根(如果未給定參數(shù),則以當(dāng)前目錄為根)的目錄樹(shù)中檢查源文件。它為通常的輕便問(wèn)題搜索源文件,并且為那個(gè)包創(chuàng)建一個(gè) configure.scan文件,這個(gè)文件就是configure.in的前身。autoscan程序是perl語(yǔ)言寫(xiě)的。將configure.scan文件重命名成configure.in或者configure.ac,并編輯之。configure.in文件中的內(nèi)容都是以AC_INIT開(kāi)頭,以AC_OUTPUT結(jié)束
22、。Autoconf流程-如何寫(xiě)configure.in confiugre.in文件的一般布局 AC_INIT 測(cè)試程序 測(cè)試函數(shù)庫(kù) 測(cè)試頭文件 測(cè)試類(lèi)型定義 測(cè)試結(jié)構(gòu) 測(cè)試編譯器特性 測(cè)試庫(kù)函數(shù) 測(cè)試系統(tǒng)調(diào)用 AC_OUTPUTAutoconf流程-如何寫(xiě)configure.in宏宏含義含義AC_INIT(FILE)用來(lái)檢查源代碼所在的路徑。AM_INIT_AUTOMAKE(PACKAGE, VERSION)這個(gè)宏是必須的,它描述了我們將要生成的軟件包的名字及其版本號(hào):PACKAGE是軟件包的名字,VERSION是版本號(hào)。當(dāng)你使用make dist命令時(shí),它會(huì)給你生成一個(gè)類(lèi)似hellowor
23、ld-1.0.tar.gz的軟件發(fā)行包,其中就有對(duì)應(yīng)的軟件包的名字和版本號(hào)。AC_PROG_CC檢查系統(tǒng)所用的C編譯器。AC_CHECK_LIB (library, function, action-if-found, action-if-not-found, other-libraries)該宏用來(lái)檢查lib庫(kù)中是否存在指定的函數(shù)。當(dāng)測(cè)試成功時(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要輸出的Make
24、file的名字。AC_LANG_CPLUSPLUS對(duì)C+語(yǔ)言的支持。AC_PROG_LIBTOOL對(duì)libtool工具的支持。AC_CHECK_HEADERS檢查系統(tǒng)中或環(huán)境路徑中是否存在指定的頭文件,和AC_CHECK_LIB一樣支持條件語(yǔ)句。AC_CHECK_FUNCS檢查library functions,和AC_CHECK_LIB一樣支持條件語(yǔ)句。Autoconf流程-如何編寫(xiě)m4文件 m4是傳統(tǒng)Unix的宏處理的安裝啟動(dòng)的應(yīng)用,其對(duì)應(yīng)的是.m4文件記錄了很多無(wú)法理解的宏。 詳細(xì)的介紹見(jiàn)官方網(wǎng)站:/software/m4/ M4文件定義的宏一般需要在c
25、onfigure.in文件中調(diào)用,使用aclocal來(lái)進(jìn)行解析 aclocal也是一個(gè)perl腳本程序,aclocal根據(jù)configure.in文件的內(nèi)容,自動(dòng)生成aclocal.m4文件。 .m4文件很有趣,很多gcc無(wú)法完成的工作,m4可以方便的幫助完成;特別是環(huán)境依賴(lài)、系統(tǒng)移植性等方面。Autoconf流程-如何編寫(xiě)m4文件 M4文件的寫(xiě)法貌似shell腳本,不過(guò)更多的是宏的寫(xiě)法,比如定義一個(gè)宏: AC_DEFUN 其他常用的宏: AC_ARG_ENABLE AC_ARG_WITH AM_CONDITIONAL AC_SUBST AS_IFAutoconf流程-autoheader 負(fù)
26、責(zé)生成config.h.in文件。 該工具通常會(huì)從“acconfig.h”文件中復(fù)制用戶(hù)附加的符號(hào)定義,因此此處沒(méi)有附加符號(hào)定義,所以不需要?jiǎng)?chuàng)建“acconfig.h”文件。Autoconf流程-如何編寫(xiě)automake automake要用的腳本配置文件是Makefile.am,用戶(hù)需要自己創(chuàng)建相應(yīng)的文件。之后,automake工具轉(zhuǎn)換成Makefile.in。 automake有相對(duì)應(yīng)的一些參數(shù)可以配置,比如-a等等可執(zhí)行文件可執(zhí)行文件靜態(tài)庫(kù)靜態(tài)庫(kù)測(cè)試文件測(cè)試文件noinst_PROGRAMS = foofoo_SOURCES =foo_LDADD =foo_LDFLAGS =foo_DE
27、PENDENCIES =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流程-如何編寫(xiě)automake 目前automake支持三種目錄層次:flat、shallow和deep。 Flat指的是所有文件都位于同一個(gè)目錄中 就是所有源文件、頭文件以及其他庫(kù)文件都位于當(dāng)前目
28、錄中,且沒(méi)有子目錄。Termutils就是這一類(lèi)。 shallow指的是主要的源代碼都儲(chǔ)存在頂層目錄,其他各個(gè)部分則儲(chǔ)存在子目錄中。 就是主要源文件在當(dāng)前目錄中,而其它一些實(shí)現(xiàn)各部分功能的源文件位于各自不同的目錄。Automake本身就是這一類(lèi)。 deep指的是所有源代碼都被儲(chǔ)存在子目錄中;頂層目錄主要包含配置信息。 就是所有源文件及自己寫(xiě)的頭文件位于當(dāng)前目錄的一個(gè)子目錄中,而當(dāng)前目錄里沒(méi)有任何源文件。 GNU cpio和GNU tar就是這一類(lèi)。Yahoo的ydm、dcp等工程也屬于這一類(lèi)。 flat類(lèi)型是最簡(jiǎn)單的,deep類(lèi)型是最復(fù)雜的。但是實(shí)際工程中我們經(jīng)常用到的是deep類(lèi)型的。Aut
29、oconf流程-如何編寫(xiě)automakeMakefile.am中盡量使用相對(duì)路徑,系統(tǒng)預(yù)定義了兩個(gè)基本路徑: $(top_srcdir) 工程最頂層目錄,用于引用源程序; $(top_builddir) 定義了生成目標(biāo)文件上最上層目錄,用于引用.o等編譯出來(lái)的目標(biāo)文件。Makefile.am中也類(lèi)似于m4一樣,定義了很多的宏,比如:includedir 頭文件的路徑,等同于-I;也可以使用libfooincludedir指定特定的庫(kù)引用的頭文件路徑;include_HEADERS 定義需要安裝的頭文件,也可以libfooinclude_HEADERS來(lái)指定特定的庫(kù)需要安裝的頭文件;一般和lib
30、fooincludedir結(jié)合使用;Autoconf流程-如何編寫(xiě)automakedata_DATA 需要安裝數(shù)據(jù)文件AUTOMAKE_OPTIONS 由于GNU對(duì)自己發(fā)布的軟件有嚴(yán)格的規(guī)范,比如必須附帶許可證聲明文件COPYING等,否則automake執(zhí)行時(shí)會(huì)報(bào)錯(cuò)。automake提供了三種軟件等級(jí):foreign、gnu和gnits,讓用戶(hù)選擇采用,默認(rèn)等級(jí)為gnu。在本例使用foreign等級(jí),它只檢測(cè)必須的文件。bin_PROGRAMS或lib_LIBRARIES 定義要產(chǎn)生的執(zhí)行文件名。如果要產(chǎn)生多個(gè)執(zhí)行文件,每個(gè)文件名用空格隔開(kāi)。 對(duì)于可執(zhí)行文件和靜態(tài)庫(kù)類(lèi)型,如果只想編譯,不想安
31、裝到系統(tǒng)中,可以用 noinst_PROGRAMS代替bin_PROGRAMS,noinst_LIBRARIES代替lib_LIBRARIES。Autoconf流程-如何編寫(xiě)automake Makefile.am還可以支持pkgconfig,對(duì)于pc文件也有相應(yīng)的宏的定義: pcdatadir pc文件的安裝目錄 pcdata_DATA 安裝的pcdata的文件名稱(chēng)Autoconf流程-如何編寫(xiě)automakeMakefile.am還提供了一些全局變量供所有的目標(biāo)體使用:INCLUDES 鏈接時(shí)所需要的頭文件LDADD 鏈接時(shí)所需要的庫(kù)文件LDFLAGS 鏈接時(shí)所需要的庫(kù)文件選項(xiàng)標(biāo)志EXTR
32、A_DIST 源程序和一些默認(rèn)的文件將自動(dòng)打入.tar.gz包,其它文件若要進(jìn)入.tar.gz包可以用這種辦法,比如配置文件,數(shù)據(jù)文件等等。SUBDIRS 在處理本目錄之前要遞歸處理哪些子目錄Autoconf流程-如何編寫(xiě)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除的文件Autoc
33、onf流程autoconf autoconf是一個(gè)用于生成可以自動(dòng)地配置軟件源碼包,用以適應(yīng)多種UNIX類(lèi)系統(tǒng)的shell腳本工具,其中autoconf需要用到 m4,便于生成腳本。 通過(guò)configure.in和aclocal.m4文件,使用autoconf生成configure文件,很復(fù)雜的configure文件吧! 運(yùn)行configure文件,生成了我們要的Makefile文件Autoconf優(yōu)化-rpm方案 我們知道,創(chuàng)建一個(gè)rpm包,需要用到一個(gè)spec文件,來(lái)注明rpm包的生成信息。 在工程項(xiàng)目中一般通常解決方法是在文件的根目錄放一個(gè)*.spec.in(用來(lái)生成spec文件)或sp
34、ec文件,這里我結(jié)合了.rpmmacros采用了生成spec文件的方式: # define rpm build root RPMBUILDTOPDIR = $(shell unset RPMBUILDTOPDIR; if -f $HOME/.rpmmacros ; then export RPMBUILDTOPDIR=grep _topdir $HOME/.rpmmacros|awk print $2; else export RPMBUILDTOPDIR=/usr/src/redhat; fi; echo $RPMBUILDTOPDIR;)Autoconf優(yōu)化-rpm方案 下面的這些有點(diǎn)像M
35、akefile吧,但是這個(gè)是在Makefile.am文件中: .PHONY: rpm rpm: 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/SPECSrpmbuild -ba $RPMBUILDTOPDIR/SPECS/PACKAGE.spec 這
36、樣就可以通過(guò)make rpm命令來(lái)生成rpm了,值得注意的是如果沒(méi)有在.rpmmacros文件內(nèi)指定_topdir,則需要sudo權(quán)限來(lái)根據(jù)系統(tǒng)變量來(lái)生成rpm。Autoconf小結(jié)-補(bǔ)充 Libtool工具添加需要注意libtoolize步驟 針對(duì)CFLAGS和CXXFLAGS對(duì)默認(rèn)GNU的編譯選項(xiàng)的更改 針對(duì)一個(gè)lib可以拆分成兩個(gè)lib data_DATA需要指定datadir變量的位置 AC_HEADER_STDC等宏的合理添加 make dist 等各種包的打法 autoreconf的使用Autoconf小結(jié)-FAQ依賴(lài)的其他項(xiàng)目是從代碼編譯的,同時(shí)他們的makefile是自己寫(xiě)的一
37、套其他項(xiàng)目從代碼進(jìn)行編譯的話(huà),可以一次性把編譯好的lib和頭文件放到你工程下的lib和include目錄下,而不是你每次修改自己工程的源文件都需要make一下其他的項(xiàng)目。我們的目的并不是讓別人遵從我們的想法,而是宣揚(yáng)我們的想法是多么的好,甚至你有更好的想法,我們會(huì)一起改進(jìn)autoconf。make的時(shí)候發(fā)生的錯(cuò)誤有時(shí)候奇奇怪怪的,比如鏈接起來(lái)了其他代碼片段一般在make出現(xiàn)錯(cuò)誤了,可以從錯(cuò)誤代碼原因進(jìn)行分析,只要你遵守“游戲規(guī)則”,是不會(huì)產(chǎn)生鏈接到其它的代碼片段的。這個(gè)autoconf如何和java源碼一起編譯我們可以寫(xiě)Makefile.am,方法如同寫(xiě)Makefile一樣,把java里面的編
38、譯器,比如ant包含進(jìn) 來(lái),完成我們的make過(guò)程即可。Autoconf小結(jié)-FAQ執(zhí)行./configure時(shí)候出現(xiàn)循環(huán)等問(wèn)題請(qǐng)重新執(zhí)行aclocal;autoheader;libtoolize -force;automake -a; autoreconf一系列命令,然后./configure,如果make再出現(xiàn)問(wèn)題,請(qǐng)make clean后再次make。怎么確定不需要執(zhí)行aclocal等一系列命令一般來(lái)說(shuō),修改configure.in(ac)或增加(減少)m4文件都需要進(jìn)行執(zhí)行aclocal等一系列命令,其他比如修改Makefile.am等不需要執(zhí)行。我不會(huì)用autoconf,也不會(huì)寫(xiě)ma
39、kefile學(xué),除非你不想用c/c+。用的多了,經(jīng)常會(huì)碰到一些問(wèn)題,該找誰(shuí)?Google和gnu的網(wǎng)站建議你選用的版本控制系統(tǒng)包括:rcs,cvs,svn,git,Mercurial,Bazzar等等。http:/sccs.berlios.de/目前是5.06版本發(fā)行號(hào)級(jí)別號(hào)分支號(hào)順序號(hào)標(biāo)識(shí)一組相似且兼容的版本標(biāo)識(shí)同一發(fā)行版本里各文件存在的主要差異標(biāo)識(shí)在特定級(jí)別上的修改標(biāo)識(shí)在一個(gè)特定分支上的修改$ admin i program gram $ get gram $ get -e gram$ delta gramGit 使用簡(jiǎn)介使用簡(jiǎn)介2011/09/20
40、Linux下的分布式版本管理系統(tǒng)下的分布式版本管理系統(tǒng) git是一個(gè)版本控制系統(tǒng)。 官方的解釋是:版本控制(Revision control)是一種軟件工程技巧,籍以在開(kāi)發(fā)的過(guò)程中,確保由不同人所編輯的同一檔案都得到更新。 大家怎么合作開(kāi)發(fā)軟件呢? 用信件信件?效率太低。用郵件郵件,不好實(shí)現(xiàn)多人溝通。用google group吧,可開(kāi)發(fā)階段中的源代碼沒(méi)法科學(xué)管理。用自建的網(wǎng)站吧,需要人力物力財(cái)力來(lái)支撐。GitGit Git是一個(gè)版本控制工具 它采用了分布式版本庫(kù)的方式,不必服務(wù)器端軟件支持,使源代碼的發(fā)布和交流極其方便。 很多有名的軟件都使用Git來(lái)進(jìn)行版本控制,如Linux內(nèi)核集中式版本管理
41、的流程集中式版本管理的缺點(diǎn):1、 服務(wù)器壓力太大,數(shù)據(jù)庫(kù)容量暴增。 2、 如果不能連接到服務(wù)器上,基本上不可以工作,看上面第二步,如果服務(wù)器不能連接上,就不能提交,還原,對(duì)比等等。 3、不適合開(kāi)源開(kāi)發(fā)(開(kāi)發(fā)人數(shù)非常非常多,但是Google app engine就是用svn的)。但是一般集中式管理的有非常明確的權(quán)限管理機(jī)制(例如分支訪問(wèn)限制) ,可以實(shí)現(xiàn)分層管理,從而很好的解決開(kāi)發(fā)人數(shù)眾多的問(wèn)題。集中式版本管理的優(yōu)點(diǎn): 1、 管理方便,邏輯明確,符合一般人思維習(xí)慣。 2、 易于管理,集中式服務(wù)器更能保證安全性。 3、 代碼一致性非常高。 4、 適合開(kāi)發(fā)人數(shù)不多的項(xiàng)目開(kāi)發(fā)。 5、大部分軟件配置管理
42、的大學(xué)教材都是使用svn和vss。分布式管理的工作流程分布式管理的優(yōu)缺點(diǎn)優(yōu)點(diǎn): 適合分布式開(kāi)發(fā),強(qiáng)調(diào)個(gè)體。 公共服務(wù)器壓力和數(shù)據(jù)量都不會(huì)太大。 速度快、靈活。 任意兩個(gè)開(kāi)發(fā)者之間可以很容易的解決沖突。 離線(xiàn)工作。 缺點(diǎn): 資料少(起碼中文資料很少)。 學(xué)習(xí)周期相對(duì)而言比較長(zhǎng)。 不符合常規(guī)思維。 代碼保密性差,一旦開(kāi)發(fā)者把整個(gè)庫(kù)克隆下來(lái)就可以完全公開(kāi)所有代碼和版本信息。Git 和其他版本控制系統(tǒng)的主要差別 直接快照,而非比較差異直接快照,而非比較差異 Git 只關(guān)心文件數(shù)據(jù)的整體是否發(fā)生變化,而大多數(shù)其他系統(tǒng)則只關(guān)心文件內(nèi)容的具體差異。這類(lèi)系統(tǒng)(CVS,Subversion,Perforce,B
43、azaar 等等)差別2 近乎所有操作都可本地執(zhí)行近乎所有操作都可本地執(zhí)行 在 Git 中的絕大多數(shù)操作都只需要訪問(wèn)本地文件和資源,不用連網(wǎng)。但如果用 CVCS 的話(huà),差不多所有操作都需要連接網(wǎng)絡(luò)。因?yàn)?Git 在本地磁盤(pán)上就保存著所有有關(guān)當(dāng)前項(xiàng)目的歷史更新,所以處理起來(lái)速度飛快。差別3 時(shí)刻保持?jǐn)?shù)據(jù)完整性時(shí)刻保持?jǐn)?shù)據(jù)完整性 在保存到 Git 之前,所有數(shù)據(jù)都要進(jìn)行內(nèi)容的校驗(yàn)和(checksum)計(jì)算,并將此結(jié)果作為數(shù)據(jù)的唯一標(biāo)識(shí)和索引。換句話(huà)說(shuō),不可能在你修改了文件或目錄之后,Git 一無(wú)所知。這項(xiàng)特性作為 Git 的設(shè)計(jì)哲學(xué),建在整體架構(gòu)的最底層。所以如果文件在傳輸時(shí)變得不完整,或者磁盤(pán)損
44、壞導(dǎo)致文件數(shù)據(jù)缺失,Git 都能立即察覺(jué)。差別4 多數(shù)操作僅添加數(shù)據(jù)多數(shù)操作僅添加數(shù)據(jù) 常用的 Git 操作大多僅僅是把數(shù)據(jù)添加到數(shù)據(jù)庫(kù)。因?yàn)槿魏我环N不可逆的操作,比如刪除數(shù)據(jù),要回退或重現(xiàn)都會(huì)非常困難。概念解釋概念解釋 Gerrit 基于web的代碼審核系統(tǒng)。Gerrit 為 Git 引入的代碼審核是強(qiáng)制性的,就是說(shuō)除非特別的授權(quán)設(shè)置,向 Git 版本庫(kù)的推送(Push)必須要經(jīng)過(guò) Gerrit 服務(wù)器,修訂必須經(jīng)過(guò)代碼審核的一套工作流之后,才可能經(jīng)批準(zhǔn)并納入正式代碼庫(kù)中 三種狀態(tài)三種狀態(tài) 對(duì)于任何一個(gè)文件,在 Git 內(nèi)都只有三種狀態(tài):已提交(committed),已修改(modified
45、)和已暫存(staged)。已提交表示該文件已經(jīng)被安全地保存在本地?cái)?shù)據(jù)庫(kù)中了;已修改表示修改了某個(gè)文件,但還沒(méi)有提交保存;已暫存表示把已修改的文件放在下次提交時(shí)要保存的清單中。gitgit概念解釋概念解釋 repository:一個(gè)repository就是一組代碼或文本的集合 master:主分支,倉(cāng)庫(kù)建立時(shí)自動(dòng)創(chuàng)建 HEAD:指向你項(xiàng)目中的當(dāng)前開(kāi)發(fā)branch commit:一個(gè)commit包含一次代碼的變更信息, 每git commit一次代碼, 生成一個(gè)commit remote:遠(yuǎn)程倉(cāng)庫(kù)基本的 Git 工作流程 1. 在工作目錄中修改某些文件。 2. 對(duì)這些修改了的文件作快照,并保存到
46、暫存區(qū)域。 3. 提交更新,將保存在暫存區(qū)域的文件快照轉(zhuǎn)儲(chǔ)到 git 目錄中。安裝安裝 Git 概括起來(lái)主要有兩種,一種是通過(guò)編譯源代碼來(lái)安裝;另一種是使用為特定平臺(tái)預(yù)編譯好的安裝包。 在 Fedora 上用 yum 安裝: $ yum install git-coregit git 命令命令 linux環(huán)境下git常用操作命令: git init git clone git log, git show, git diff git add, git commit, git push, git pull git config git branch git clonegit clone git c
47、lone:將項(xiàng)目倉(cāng)庫(kù)中的所有內(nèi)容都拷貝到本地 git支持多種協(xié)議, ssh, git, http, https, ftp, ftps, and rsync protocols. 格式:git clone+URL git clone ssh:/19:23228/test/projectgit loggit log git log:查看log git log p/顯示詳細(xì)log,包括文件的改動(dòng) git log /顯示包含此文件改動(dòng)的log git log -author=“user1“ /查看這個(gè)作者的log git log -grep=“reset” /查看包含該字串的log git log -name-status/列出修改的文件名
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 定向鉆排水管道泥沙清理專(zhuān)項(xiàng)施工方案
- 基礎(chǔ)沉注漿加固施工方案
- 地下室金剛砂地坪施工樣板施工技術(shù)方案
- 二層商鋪外架專(zhuān)項(xiàng)施工方案
- 2025年沁源縣招教考試備考題庫(kù)含答案解析(奪冠)
- 2025年蘇州工業(yè)職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)帶答案解析
- 珠寶公司會(huì)員日活動(dòng)執(zhí)行方案
- 2025年漳州職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)附答案解析
- 2026年上海建橋?qū)W院?jiǎn)握新殬I(yè)傾向性測(cè)試題庫(kù)附答案解析
- 2025年六盤(pán)水幼兒師范高等專(zhuān)科學(xué)校單招職業(yè)傾向性測(cè)試題庫(kù)帶答案解析
- 家具廠長(zhǎng)崗位職責(zé)
- CJT511-2017 鑄鐵檢查井蓋
- 2024年高考語(yǔ)文考前專(zhuān)題訓(xùn)練:現(xiàn)代文閱讀Ⅱ(散文)(解析版)
- 躁狂發(fā)作的護(hù)理診斷及護(hù)理措施
- 第六節(jié)暫準(zhǔn)進(jìn)出口貨物課件
- 通信工程冬季施工安全培訓(xùn)
- 中醫(yī)外科乳房疾病診療規(guī)范診療指南2023版
- 壓實(shí)瀝青混合料密度 表干法 自動(dòng)計(jì)算
- 田口三次設(shè)計(jì)
- 《我的戒煙》閱讀答案
- GB/T 324-2008焊縫符號(hào)表示法
評(píng)論
0/150
提交評(píng)論