使用Automake生成Makefile及動(dòng)態(tài)庫和靜態(tài)庫的創(chuàng)建.doc_第1頁
使用Automake生成Makefile及動(dòng)態(tài)庫和靜態(tài)庫的創(chuàng)建.doc_第2頁
使用Automake生成Makefile及動(dòng)態(tài)庫和靜態(tài)庫的創(chuàng)建.doc_第3頁
使用Automake生成Makefile及動(dòng)態(tài)庫和靜態(tài)庫的創(chuàng)建.doc_第4頁
使用Automake生成Makefile及動(dòng)態(tài)庫和靜態(tài)庫的創(chuàng)建.doc_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

使用Automake生成Makefile及動(dòng)態(tài)庫和靜態(tài)庫的創(chuàng)建使用Automake 創(chuàng)建和使用靜態(tài)庫1. 目錄結(jié)構(gòu)如下:c-sharpview plaincopy1. example2. |src目錄(存放源代碼文件)3. |hello.c4. |lib目錄(存放用來生成庫的文件)5. |test.c用來生成靜態(tài)庫libhello.a6. |include目錄(存放程序中使用的頭文件)7. |hello.h2. 編寫的各個(gè)目錄下的源文件c-sharpview plaincopy1. hello.h文件2. externvoidprint(char*);3. test.c文件4. #include5. voidprint(char*msg)6. 7. print(“%s/n”,msg);8. 9. hello.c文件10. #include“hello.h”11. intmain()12. 13. print(“Hellostaticlibrary!”);/這里用到的是靜態(tài)庫中的函數(shù)14. return0;15. 3. 編寫lib/Makefile.am 文件c-sharpview plaincopy1. noinst_LIBRARIES=libhello.a2. libhello_a_SOURCES=test.c3. AUTOMAKE_OPTIONS=foreign第一行noinst 表示生成的是靜態(tài)庫,不需要make install ,直接制定它的位置和名字就可以使用。第二行表示用來生成靜態(tài)庫的源文件。如果要把靜態(tài)庫生成到其他地方,可以在=后面加上路徑(建議用絕對(duì)路徑,并將所要用到的靜態(tài)庫生成在同一個(gè)文件夾下,如lib)。第三行AUTOMAKE_OPTIONS 是Automake 的選項(xiàng)。Automake 主要是幫助開發(fā) GNU 軟件的人員來維護(hù)軟件,所以在執(zhí)行Automake 時(shí),會(huì)檢查目錄下是否存在標(biāo)準(zhǔn) GNU 軟件中應(yīng)具備的文件,例如 NEWS、AUTHOR、 ChangeLog 等文件。設(shè)置為foreign 時(shí),Automake會(huì)改用一般軟件的標(biāo)準(zhǔn)來檢查。如果不加這句的話,需要在autoconf之前,先執(zhí)行touch NEWSREADME AUTHORS ChangeLog 來生成NEWS、AUTHOR、 ChangeLog 等文件4. 編寫src/Makefile.am 文件c-sharpview plaincopy1. AUTOMAKE_OPTIONS=foreign2. INCLUDES=-I./include3. bin_PROGRAMS=hello4. hello_SOURCES=hello.c5. hello_LDADD=./lib/libhello.a第二行指定頭文件的位置,-I 是idirafter 的縮寫。./include 指定頭文件的位置,.是上一級(jí)目錄,也就是這里的example 目錄。第三行指定生成可執(zhí)行文件名hello,在這里可執(zhí)行文件生成在src 下,建議將可執(zhí)行文件生成到一個(gè)特定的文件夾下,讓它和源代碼分開,如/root/test 目錄下。寫法為:c-sharpview plaincopy1. bin_PROGRAMS=/root/test/hello,后面的第四、五行也相對(duì)應(yīng)地變?yōu)椋?. _root_test_hello_SOURCES=hello.c3. _root_test_hello_LDADD=./lib/libhello.a第四行指定生成可執(zhí)行文件hello 的源代碼文件,如果hello.c 在其他目錄下,需要加上完整的路徑。第五行指定需要使用靜態(tài)庫的位置。5. 生成靜態(tài)庫文件lib/libhello.a。執(zhí)行autoscan 生成configure.scan 文件,將它重命名為configure.in 并修改其內(nèi)容。c-sharpview plaincopy1. #configure.in2. #Processthisfilewithautoconftoproduceaconfigurescript.3. AC_PREREQ(2.59)4. AC_INIT(libhello.a,1.1,)5. AM_INIT_AUTOMAKE6. #Checksforprograms.7. AC_PROG_CC8. #Checksforlibraries.9. AC_PROG_RANLIB/需要加入的內(nèi)容,因?yàn)槭褂昧遂o態(tài)庫10. #Checksforheaderfiles.11. #Checksfortypedefs,structures,andcompilercharacteristics.12. #Checksforlibraryfunctions.13. AC_OUTPUT(Makefile)14. AC_INIT(FILE)該宏用來檢查源代碼所在路徑,autoscan 會(huì)自動(dòng)產(chǎn)生,一般無須修改它。AM_INIT_AUTOMAKE(PACKAGE,VERSION)這個(gè)是使用 Automake 所必備的宏,PACKAGE 是所要產(chǎn)生軟件的名稱,VERSION 是版本編號(hào)。也可以把包和版本號(hào)等信息放在AC_INIT(FILE) 宏里。AC_PROG_CC檢查系統(tǒng)可用的C 編譯器,若源代碼是用C 寫的就需要這個(gè)宏。AC_OUTPUT(FILE)設(shè)置 configure 所要產(chǎn)生的文件,若是Makefile ,configure 便會(huì)把它檢查出來的結(jié)果填充到Makefile.in 文件后產(chǎn)生合適的 Makefile。 后面的FILE 是一個(gè)Makefile 的輸出列表,你可以選著將要輸出的Makefile 的位置和個(gè)數(shù)。建議只在src 中輸出Makefile。在lib 目錄下依次執(zhí)行 aclocal 、autoconf、automake -add-missing、./configure、make,此時(shí)在該目錄下就可以看到生成的靜態(tài)庫文件libhello.a6. 在src 目錄下,執(zhí)行autoscan 生成configure.scan 文件,將它重命名為configure.in 并修改其內(nèi)容。c-sharpview plaincopy1. #configure.in2. #Processthisfilewithautoconftoproduceaconfigurescript.3. AC_PREREQ(2.59)4. AC_INIT(hello,1.1,)5. AM_INIT_AUTOMAKE6. AC_CONFIG_SRCDIR(hello.c)7. #Checksforprograms.8. AC_PROG_CC9. #Checksforlibraries.10. #Checksforheaderfiles.11. #Checksfortypedefs,structures,andcompilercharacteristics.12. #Checksforlibraryfunctions.13. AC_OUTPUT(Makefile)7. 在src 目錄下依次執(zhí)行 aclocal 、autoconf、automake -add-missing、./configure、make,生成可執(zhí)行文件hello8. 執(zhí)行make install 進(jìn)行安裝,最后輸入hello 來運(yùn)行程序,查看效果:Hello static library!執(zhí)行成功!使用gcc 創(chuàng)建和使用靜態(tài)庫1. 編寫mylib.h 文件c-sharpview plaincopy1. #ifndef_mylib_h_2. #define_mylib_h_3. voidwelcome();4. voidoutstring(constchar*str);5. #endif2. 編寫mylib.c 文件,用來生成靜態(tài)庫。c-sharpview plaincopy1. #include2. voidwelcome()3. 4. printf(“welcometolibmylib/n”);5. 6. voidoutstring(constchar*str)7. 8. if(str!=NULL)9. printf(“%s”,str);10. 3. 編譯源文件,產(chǎn)生目標(biāo)代碼gcc o mylib.o c mylib.c4. 將上面產(chǎn)生的目標(biāo)文件加入到靜態(tài)庫中,并把靜態(tài)庫拷貝到系統(tǒng)默認(rèn)的路徑c-sharpview plaincopy1. arrcslibmylib.amylib.o2. cplibmylib.a/usr/lib/5. 編寫測(cè)試程序來使用剛才創(chuàng)建的靜態(tài)庫 libmylib.ac-sharpview plaincopy1. #include“mylib.h”2. #include3. Intmain()4. 5. printf(“createanduselibrary:/n”);6. welcome();7. outstring(“Itsasuccessful/n”);8. 6. 編譯使用庫函數(shù)的程序c-sharpview plaincopy1. gccotesttest.c-lmylib運(yùn)行./test 查看結(jié)果。使用Automake 創(chuàng)建和使用動(dòng)態(tài)庫動(dòng)態(tài)庫與靜態(tài)庫的差別在于:動(dòng)態(tài)庫是在程序執(zhí)行的時(shí)候加載到內(nèi)存,供調(diào)用函數(shù)使用。1. 目錄結(jié)構(gòu)如下:c-sharpview plaincopy1. example2. |src目錄(存放源代碼文件)3. |hello.c4. |lib目錄(存放用來生成庫的文件)5. |test.c用來生成動(dòng)態(tài)庫libhello.la6. |include目錄(存放程序中使用的頭文件)7. |hello.h2. 編寫各個(gè)目錄下的源文件如下:c-sharpview plaincopy1. hello.h文件2. externvoidprint(char*);3. test.c文件4. #include5. voidprint(char*msg)6. 7. print(“%s/n”,msg);8. 9. hello.c文件10. #include“hello.h”11. intmain()12. 13. print(“Hellostaticlibrary!”);/這里用到的是動(dòng)態(tài)庫中的函數(shù)14. return0;15. 3. 在lib 目錄下編譯需要生成動(dòng)態(tài)庫的文件,生成動(dòng)態(tài)庫,并安裝到系統(tǒng)的標(biāo)準(zhǔn)庫中,供程序調(diào)用。具體步驟如下:(1) 編寫Makefile.am 文件c-sharpview plaincopy1. AUTOMAKE_OPTIONS=foreign2. lib_LTLIBRARIES=libhello.la3. libhello_la_SOURCES=test.c這里lib_LTLIBRARIES 的意思是生成的動(dòng)態(tài)庫,然后指定動(dòng)態(tài)庫依賴的源文件test.c ,若有多個(gè)源文件用空格隔開。(2) 在lib 目錄下,用命令autoscan 產(chǎn)生configure.scan 文件,并改名為configure.in。 這里需加上宏AC_PROG_LIBTOOL,表示利用libtool 來自動(dòng)生成動(dòng)態(tài)庫c-sharpview plaincopy1. #configure.in2. #Processthisfilewithautoconftoproduceaconfigurescript.3. AC_PREREQ(2.59)4. AC_INIT(hello,1.0,)5. AM_INIT_AUTOMAKE6. AC_CONFIG_SRCDIR(test.c)7. #AC_CONFIG_HEADER(config.h)8. #Checksforprograms.9. AC_PROG_CC10. #Checksforheaderfiles.11. #Checksfortypedefs,structures,andcompilercharacteristics.12. #Checksforlibraryfunctions.13. AC_PROG_LIBTOOL14. AC_CONFIG_FILES(Makefile)15. AC_OUTPUT(3) 執(zhí)行命令aclocal、libtoolize -f -c 、autoconf、automake -add-missing、./configure、make、make install 將動(dòng)態(tài)庫安裝到系統(tǒng)的標(biāo)準(zhǔn)庫中,以供調(diào)用(一般為/usr/local/lib)。注:libtoolize 提供了一種標(biāo)準(zhǔn)的方式來將libtool 支持加入一個(gè)軟件包,而GNU libtool 是一個(gè)通用庫支持腳本,將使用動(dòng)態(tài)庫的復(fù)雜性隱藏在統(tǒng)一、可移植的接口中。4. 生成src 目錄下的hello 可執(zhí)行文件(1) 編寫src/Makefile.am 文件c-sharpview plaincopy1. AUTOMAKE_OPTIONS=foreign2. INCLUDES=-I./include3. bin_PROGRAMS=hello4. hello_SOURCES=hello.c5. hello_LDADD=-lhello-ldir 指定編譯時(shí)搜索庫的路徑。與靜態(tài)庫不同的是,創(chuàng)建動(dòng)態(tài)庫時(shí)不用指定庫路徑,編譯器自動(dòng)在標(biāo)準(zhǔn)庫中查找libhello.so 文件。(2) 執(zhí)行autoscan 生成configure.scan 文件,將它重命名為configure.in 并修改其內(nèi)容。c-sharpview plaincopy1. #configure.in2. #Processthisfilewithautoconftoproduceaconfigurescript.3. AC_PREREQ(2.59)4. AC_INIT(hello,1.0,)5. AM_INIT_AUTOMAKE6. AC_CONFIG_SRCDIR(hello.c)7. #AC_CONFIG_HEADER(config.h)8. #Checksforprograms.9. AC_PROG_CC10. #Checksforheaderfiles.11. #Checksfortypedefs,structures,andcompilercharacteristics.12. #Checksforlibraryfunctions.13. AC_CONFIG_FILES(Makefile)14. AC_OUTPUT(3) 在src 目錄下編譯并生成目標(biāo)文件,執(zhí)行命令aclocal、libtoolize -f -c 、autoconf、automake -add-missing、./configure、make,此時(shí)你一定會(huì)覺得,成功近在咫尺了。再執(zhí)行目標(biāo)文件./hello,結(jié)果卻在你的意料之外:./hello: error while loading shared libraries: libhello.so.0 : cannot open shared object file:No such file or directory在執(zhí)行目標(biāo)文件的時(shí)候,Shell 找不到共享庫的位置,需要我們手工載入庫路徑。5. shell 搜索動(dòng)態(tài)庫路徑位置的兩種方法(1) 使用命令導(dǎo)入動(dòng)態(tài)庫的路徑,命令如下:export LD_LIBRARY_PATH=dir (如/usr/local/lib)(2) 修改/etc/ld.so.conf 文件,加入搜索路徑,修改后用ldconfig 命令載入修改。將自己可能存放庫文件的路徑都加入到/etc/ld.so.conf 中是明智的選擇 _。添加方法也極其簡(jiǎn)單,將庫文件的絕對(duì)路徑直接寫進(jìn)去就OK 了,一行一個(gè)。例如:/usr/local/lib/usr/lib/lib需要注意的是:這種搜索路徑的設(shè)置方式對(duì)于程序連接時(shí)的庫(包括共享庫和靜態(tài)庫)的定位已經(jīng)足夠了,但是對(duì)于使用了共享庫的程序的執(zhí)行還是不夠的。這是 因?yàn)闉榱思涌斐绦驁?zhí)行時(shí)對(duì)共享庫的定位速度,避免使用搜索路徑查找共享庫的低效率,所以是直接讀取庫列表文件 /etc/ld.so.cache 從中進(jìn)行搜索的。/etc/ld.so.cache 是一個(gè)非文本的數(shù)據(jù)文件,不能直接編輯,它是根據(jù) /etc/ld.so.conf 中設(shè)置的搜索路徑由/sbin/ldconfig 命令將這些搜索路徑下的共享庫文件集中在一起而生成的(ldconfig 命令要以 root 權(quán)限執(zhí)行)。因此,為了保證程序執(zhí)行時(shí)對(duì)庫的定位,在 /etc/ld.so.conf 中進(jìn)行了庫搜索路徑的設(shè)置之后,還必須要運(yùn)行 /sbin/ldconfig 命令更新 /etc/ld.so.cache文件之后才可以。ldconfig ,簡(jiǎn)單的說,它的作用就是

溫馨提示

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

評(píng)論

0/150

提交評(píng)論