乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      linux寶庫(kù)/編程技術(shù)/創(chuàng)建和使用庫(kù):靜態(tài)、共享和動(dòng)態(tài)

       todaytomo 2006-12-30
      創(chuàng)建和使用庫(kù):靜態(tài)、共享和動(dòng)態(tài)
      2004-04-23 15:18 pm
      作者:Norkai Laboratory
      來(lái)自:linux寶庫(kù) (http://www.)
      現(xiàn)存:http://www./1025.html
      聯(lián)系:linuxmine#gmail.com

      不明白?歡迎到 linux論壇 (http://bbs.) 參加討論!

      C語(yǔ)言中有一些函數(shù)不需要進(jìn)行編譯,有一些函數(shù)也可以在多個(gè)文憑中使用。一般來(lái)說(shuō),
      這些函數(shù)都會(huì)執(zhí)行一些標(biāo)準(zhǔn)任務(wù),如數(shù)據(jù)庫(kù)輸入 /輸出操作或屏幕控制等??梢允孪葘?duì)這些
      函數(shù)進(jìn)行編譯,然后將它們放置在一些特殊的目標(biāo)代碼文件中,這些目標(biāo)代碼文件就稱(chēng)為庫(kù)。
      庫(kù)文件中的函數(shù)可以通過(guò)連接程序與應(yīng)用程序進(jìn)行連接。這樣就不必在每次開(kāi)發(fā)程序時(shí)都對(duì)
      這些通用的函數(shù)進(jìn)行編譯了。

      不同類(lèi)型的應(yīng)用程序?qū)?huì)使用不同的函數(shù)庫(kù)。例如:libdbm庫(kù)中組包含了對(duì)數(shù)據(jù)庫(kù)文件
      進(jìn)行訪問(wèn)的dbm函數(shù),需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作的程序就會(huì)與該庫(kù)進(jìn)行連接。數(shù)學(xué)應(yīng)用程序?qū)?br> 使用數(shù)學(xué)庫(kù)libm,X-Windows應(yīng)用程序?qū)⑹褂肵lib庫(kù),libX11。另外,所有的程序都將使用
      標(biāo)準(zhǔn)的C函數(shù)庫(kù)。libc,該庫(kù)中包含了諸好內(nèi)存管理或輸入輸出操作的基本函數(shù),這些庫(kù)都
      存放在/usr/lib這些系統(tǒng)公用的目錄中,系統(tǒng)中的任何用戶(hù)都可以利用這些庫(kù)。當(dāng)然用戶(hù)也
      可以建立自己專(zhuān)用的庫(kù)函數(shù),供自己或其它指定的人員使用。

      庫(kù)可以有三種使用的形式:靜態(tài)、共享和動(dòng)態(tài)。靜態(tài)庫(kù)的代碼在編譯時(shí)就已連接到開(kāi)發(fā)
      人員開(kāi)發(fā)的應(yīng)用程序中,而共享庫(kù)只是在程序開(kāi)始運(yùn)行時(shí)才載入,在編譯時(shí),只是簡(jiǎn)單地指
      定需要使用的庫(kù)函數(shù)。動(dòng)態(tài)庫(kù)則是共享庫(kù)的另一種變化形式。動(dòng)態(tài)庫(kù)也是在程序運(yùn)行時(shí)載入,
      但與共享庫(kù)不同的是,使用的庫(kù)函數(shù)不是在程序運(yùn)行開(kāi)始,而是在程序中的語(yǔ)句需要使用該
      函數(shù)時(shí)才載入。動(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ī)模比較小。

      已經(jīng)開(kāi)發(fā)的大多數(shù)庫(kù)都采取共享庫(kù)的方式。ELF格式的可執(zhí)行文件使得共享庫(kù)能夠比較容
      易地實(shí)現(xiàn),當(dāng)然使用舊的a.out模式也可以實(shí)現(xiàn)庫(kù)的共享。Linux系統(tǒng)中目前可執(zhí)行文件的標(biāo)準(zhǔn)
      格式為ELF格式。

      GNU庫(kù)的使用必須遵守Library GNU Public License(LGPL許可協(xié)議)。該協(xié)議與GNU許可協(xié)
      議略有不同,開(kāi)發(fā)人員可以免費(fèi)使用GNU庫(kù)進(jìn)行軟件開(kāi)發(fā),但必須保證向用戶(hù)提供所用的庫(kù)函
      數(shù)的源代碼。

      系統(tǒng)中可用的庫(kù)都存放在/usr/lib和/lib目錄中。庫(kù)文件名由前綴lib和庫(kù)名以及后綴組
      成。根據(jù)庫(kù)的類(lèi)型不同,后綴名也不一樣。共享庫(kù)的后綴名由.so和版本號(hào)組成,靜態(tài)庫(kù)的后
      綴名為.a。采用舊的a.out格式的共享庫(kù)的后綴名為.sa。

      libname.so.major.minor
      libname.a
      這里的name可以是任何字符串,用來(lái)唯一標(biāo)識(shí)某個(gè)庫(kù)。該字符串可以是一個(gè)單字、幾個(gè)字
      符、甚至一個(gè)字母。數(shù)學(xué)共享庫(kù)的庫(kù)名為libm.so.5,這里的標(biāo)識(shí)字符為m,版本號(hào)為5。libm.a
      則是靜態(tài)數(shù)學(xué)庫(kù)。X-Windows庫(kù)名為libX11.so.6,這里使用X11作為庫(kù)的標(biāo)識(shí),版本號(hào)為6。

      使用gcc編譯器就可以將庫(kù)與自己開(kāi)發(fā)的程序連接起來(lái),例如:libc.so.5中包含了標(biāo)準(zhǔn)的輸
      入輸出函數(shù),當(dāng)連接程序進(jìn)行目標(biāo)代碼連接時(shí)會(huì)自動(dòng)搜索該程序并將其連接到生成的可執(zhí)行文件
      中。標(biāo)準(zhǔn)的輸入輸出庫(kù)中包含了許多基本的輸入輸出函數(shù),如printf函數(shù)等。也可以連接其它的
      一些系統(tǒng)函數(shù)庫(kù),如數(shù)學(xué)庫(kù)等,但與libc.so.5不同,大部分其它的系統(tǒng)庫(kù)需要在命令行中顯式
      指定所用的庫(kù)名。

      在/usr/lib和/lib目錄中可以找到絕大多數(shù)的共享庫(kù)。連接時(shí)將首先搜索這兩個(gè)目錄。有一
      些庫(kù)也可能存放在特定的目錄中,在/etc/ld.conf配置文件中給出了這些目錄的列表。連接程序
      也會(huì)對(duì)列出的這些目錄進(jìn)行搜索。在默認(rèn)情況下,Linux將首先搜索指定庫(kù)的共享版本,如果找
      不到,才會(huì)去搜索靜態(tài)版本。在對(duì)共享庫(kù)進(jìn)行更新或安裝新庫(kù)后,必須運(yùn)行l(wèi)dconfig命令更新
      /etc/ld.conf文件中相應(yīng)的項(xiàng)(如果使用RPM進(jìn)行安裝,一般會(huì)自動(dòng)進(jìn)行更新,不過(guò)也不能保證
      這一點(diǎn))。

      在gcc編譯器中引用可搜索到的目錄中的庫(kù)文件時(shí),需要使用-l選項(xiàng)和庫(kù)名。在gcc命令行上
      輸入-lm可以在程序中連接標(biāo)準(zhǔn)算術(shù)庫(kù),-l將首先使用libname.so進(jìn)行搜索,這里是libm.so。下
      面的例子將使用算術(shù)庫(kù)創(chuàng)建bookrecs程序,請(qǐng)注意這里的-lm選項(xiàng)。
      $ gcc main.c io.c -o bookrecs -lm

      系統(tǒng)中還有一些其它可用的庫(kù),常用的是libncurses.a庫(kù),包含了一些簡(jiǎn)單的鼠標(biāo)移動(dòng)例程。
      在命令行中使用-lncurses選項(xiàng)引用libncurses.so庫(kù)。下面的例子同時(shí)調(diào)用了數(shù)學(xué)和光標(biāo)庫(kù)。
      $ gcc mian.c io.c -o bookrecs -lm -lncurses

      在引用其它目錄中的庫(kù)時(shí),需要使用-ldir選項(xiàng)指定該目錄。該選項(xiàng)指定了搜索庫(kù)函數(shù)時(shí)其
      它路徑。在下面的例子中,用戶(hù)在連接時(shí)使用了mydir目錄中的myio.so庫(kù)文件。
      $ gcc main.c -o bookrecs -lmydir -lmyio (http://www.)


      a的是為了支持較老的a.out格式的可執(zhí)行文件的
      .so的是支持elf格式的可執(zhí)行文件的庫(kù)。

      靜態(tài)庫(kù)是指編譯連接時(shí),把庫(kù)文件的代碼全部加入到可執(zhí)行文件中,所以生成的文件較大,
      但運(yùn)行時(shí),就不再需要庫(kù)文件了。動(dòng)態(tài)庫(kù)正好相反,在編譯連接時(shí),沒(méi)有把庫(kù)文件的代碼加入
      到可執(zhí)行文件中,所以生成的文件較小,但運(yùn)行時(shí),仍需要加載庫(kù)文件

      .a是靜態(tài)庫(kù)文件,可以用ar 命令生成。
      .so是動(dòng)態(tài)庫(kù)文件,編譯時(shí)加上指定的選項(xiàng)即可生成,具體選項(xiàng)看相應(yīng)的系統(tǒng)文檔了。。。。

      IBM AIX下如下:
      $(CC) $(SHOPT) $(SHLIBS) a.o b.o -o lib$@$(DBBUILDTAIL)

      假設(shè)你有test1.c test2.c test3.c , 編寫(xiě)成動(dòng)態(tài)鏈接庫(kù)
      1. 先編譯成test1.o test2.o test3.o
      2. gcc -shared -W1, -soname,libvTest.so.1 -o libvTest.so.1.0 *.o

      我給你一篇文章吧,是IBM公司的人寫(xiě)的,我就是照著里面做的,另外你可以采用C++的方
      式寫(xiě),然后再套一層C寫(xiě)SO,最后可供外部以C的方式調(diào)用。還有一種方法就是將C++編寫(xiě)的SO
      以C++的方式提供給外界使用,就是在外部程序中引入類(lèi)的聲明及變量實(shí)例,就好象外部程序
      也是其中一部分一樣。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶(hù) 評(píng)論公約

        類(lèi)似文章 更多