lib

lib

代碼名稱
LIB有兩種,一種是靜态庫,比如C-Runtime庫,這種LIB中有函數的實現代碼,一般用在靜态連編上,它是将LIB中的代碼加入目标模塊(EXE或者DLL)文件中,所以鍊接好了之後,LIB文件就沒有用了。一種LIB是和DLL配合使用的,裡面沒有代碼,代碼在DLL中,這種LIB是用在靜态調用DLL上的,所以起的作用也是鍊接作用,鍊接完成了,LIB也沒用了。至于動态調用DLL的話,根本用不上LIB文件。目标模塊(EXE或者DLL)文件生成之後,就用不着LIB文件了。[1]
  • 中文名:
  • 外文名:lib
  • 所屬學科:
  • 屬于:一種是靜态庫
  • 比如:C-Runtime庫
  • 包含:一般用在靜态連編上

單詞解釋

adj.解放的(等于liberal);解放論者的

n.解放運動(等于liberation);解放運動組織;釋放

打開方法

用編程語言,打開lib文件的辦法有三個:

1、在object/librarymodules使用全路徑名;

2、把*.lib放在VC的Lib目錄中

3、修改projectsetting的Link->Input中的Addtionallibrarypath,加入你的目錄。

加載方法

1.LIB文件直接加入到工程文件列表中

在VC中打開FileView一頁,選中工程名,單擊鼠标右鍵,然後選中"AddFilestoProject"菜單,在彈出的文件對話框中選中要加入DLL的LIB文件即可。

2.設置工程的ProjectSettings來加載DLL的LIB文件

打開工程的ProjectSettings菜單,選中Link,然後在Object/librarymodules下的文本框中輸入DLL的LIB文件。

3.通過程序代碼的方式

加入預編譯指令#pragmacomment(lib,"路徑*.lib"),這種方法優點是可以利用條件預編譯指令鍊接不同版本的LIB文件。因為,在Debug方式下,産生的LIB文件是Debug版本,如Regd.lib;在Release方式下,産生的LIB文件是Release版本,如Regr.lib。

當應用程序對DLL的LIB文件加載後,還需要把DLL對應的頭文件(*.h)包含到其中,在這個頭文件中給出了DLL中定義的函數原型,然後聲明。

文件

Lib格式隻有四種類型的節(Section),即FirstSec,SecondSec,LongnameSec和ObjSec;其中SecondSec與LongnameSec是可選節,很多Lib文件中都沒有。而開頭的Singature隻是一個标識,它相當于COFF目标文件中的魔法數字。它是一個長度為8的字符串,值為“!n”。

FirstSec,顧名思義,就是第一個節。它包含了庫中所有的符号名以及這些符号所在的目标文件在庫中的位置(絕對偏移)。

SecondSec就是第二節。它的内容和FirstSec是相同的。不同的是,SecondSec是一個有序表,通過它來查找庫中的符号比通過FirstSec來查找要快很多。

LongnameSec是長名稱節。這一節是一個字符串表。它包含了所有長目标文件名。如果後面的ObjSec中沒有給出相應的目标文件名,我們就要到這一節中來查找。

ObjSec就是目标文件節。這些節中存儲着不同的目标文件的原始數據。

在庫文件中,每一節都有兩個部分。一個部分是頭,另一個部分才是該節的數據;數據緊跟在頭的後面。頭描述了該節數據的類型、長度等信息。這些頭的格式都是相同的。其結構用C語言描述如下:

typedefstruct{

charName;//名稱

charTime;//時間

charUserID;//用戶ID

charGroupID;//組ID

charMode;//模式

charSize;//長度

charEndOfHeader;//結束符

}SectionHeader;

可以看到,頭中的數據全都是字符串。用字符串的好處是可以提高格式的兼容性,因為在不同的機器上,數據的排列方式是不同的。有的機器是以Little-Endian方式工作,還有的是以Big-Endian方式工作,它們互不兼容(這兩種方式的區别!?請看我的《COFF格式》一文,其中的文件頭一節有說明)。用字符串就不會有這種問題(後面我們将會遇到)。但它也有不方便的地方,就是必須把字符串轉換成數值,多了一個步驟。

在這個結構中,最常用的Name、Size以及EndOfHeader三個成員。Name就是節的名稱啦!Size也很好理解,就是該節數據的長度。要注意的就是這個EndOfHeader成員了!這個成員标志着頭的結束,其内容為“`n”(注意,這裡沒有打錯,是兩個字符“`”和“n”)。怎麼樣?有點奇怪吧?為什麼要有這個結束符?每一節的頭長度一定,每節中的數據長度也知道。按順序向下讀不行嗎?答案是:不行!因為每一節之間存在間隙!通常是一個字節或零個字節。如果是零個字節倒好,按順序向下讀是OK的。可是如果不為零的話,這樣讀就要錯位了。要知道錯位沒有,隻好用一個結束符來定位了。如果在讀頭的時候發現結束符不對,那就要一個字節一個字節地向下查找,直到找到結束符,才能算是對齊了。切記!切記!

當然,通過FirstSec或SecondSec中給出的偏移來讀數據就不存在這個問題。不會發生錯位,放心讀吧!

讓我們來看看每一節中的數據是什麼樣子。

FirstSec

第一節,通常就是Lib中的每一個小節。它的名稱是“/”。其數據部分的結構如下:

typedefstruct{

unsignedlongSymbolNum;//庫中符号的數量

unsignedlongSymbolOffset[n];//符号所在目标節的偏移

charStrTable[m];//符号名稱字符串表

}FirstSec;

第一個成員SymbolNum是符号的數量。注意!它是以Big-Endian方式儲存的(x86平台上的數據是以Little-Endian方式儲存的。這裡應該注意轉換。後面給出的convert函數可以在Little-Endian格式與Big-Endian格式之間進行相互轉換)。

第二個成員SymbolOffset是一個數組,它的長度n就是符号的數量,也就是SymbolNum。這個數組儲存了每一個符号所在的目标節的偏移。我們可以方便地通過它來查找符号所在的目标文件。注意!它也是以Big-Endian格式儲存的。

第三個成員StrTable是一個字符串表,它的長度m就是SectionHeader.Size的值減去(SymbolNum+1)*4。其結構很簡單,就是一堆以‘0’結尾的字符串(和COFF文件中的字符串表結構相同)。在有的系統中,它還可能是以“/n”這兩個字符結尾的字符串的集合。

很簡單的一個結構,不過有兩個成員的長度是不定的。怎麼才能方便地從Lib中讀出這些數據,留給大家自己想吧!下面我隻給出一個進行Little-Endian與Big-Endian互轉的函數。

inlinevoidconvert(void*p//要轉換的數據的指針

,size_tsize=4//數據的長度,long為4,short為2

){

char*buf=(char*)p;

chartemp;

for(size_ti=0;i

temp=buf[i];

buf[i]=buf[size-i-1];

buf[size-i-1]=temp;

}

}

SecondSec

第二節

這一節與第一節很相似!它通常也就是Lib文件的第二個節。它的名字也是“/”(注意:文件中第一個叫“/”的節是第一節,第二個就是第二節)。不過它的結構與第一節有些不同,如下:

typedefstruct{

unsignedlongObjNum;//ObjSec的數量

unsignedlongObjOffset[x];//每一個ObjSec的偏移

unsignedlongSymbolNum;//庫中符号的數量

unsignedshortSymbolIdx[n];//符号在ObjOffset表中的索引

charStrTable[m];//符号名稱字符串表

}SecondSec;

第一個成員ObjNum是庫中ObjSec的數量。

第二個成員ObjOffset是一個偏移表,它記錄了庫中所有ObjSec的偏移。這個表的記錄數x就是ObjNum。

第三個成員SymbolNum與FirstSec中的SymbolNum意義相同。

第四個成員SymbolIdx變成了一個索引,它記錄了相應名稱字符串在ObjOffset這個表中的位置,我們要通過兩次索引才能找到我們所要符号的ObjSec位置。它的項目數n為SymbolNum。但請注意,這個索引是unsignedshort型,不再是unsignedlong型。

第五個成員StrTable結構與FirstSec中的一樣。不過,它的長度m為SectionHeader.Size的值減去((ObjNum+1)*4+(SymbolNum+2)*2)。

值得注意的是,這裡的所有數據都是Little-Endian格式的。千萬不要弄錯了!LongnameSec

這個小節就是一個字符串表,它的名稱為“//”,其結構同FirstSec.StrTable。這裡就不多說了。

ObjSec

這一節中的數據就是COFF文件的原始數據,把它讀出來存成文件,就是一個COFF文件。它的格式請參考《COFF格式》一文。

要指出的是它的命名方式有些特殊。如果Obj文件的名稱少于16個字符,它就會被保存在SectionHeader的Name成員中,以‘/’字符結尾。如果無法保存在Name成員中,則Name成員的第一個字符就為‘/’,之後再跟上這個名稱在LongnameSec中的偏移。

例如:

!n

LongNameSec:

This_Is_Long_Name00010

This_Is_Long_Name00020

ObjSec1:

Name:“shortname/”

ObjSec2:

Name:“/0”//這裡使用了第一個長文件名This_Is_Long_Name0001

ObjSec3:

Name:“/22”//這裡使用了第二個長文件名This_Is_Long_Name0002

含義

在新能源産業領域,LIB是指液體锂離子電池(LithiumIonBattery),液态锂離子電池是指Li+嵌入化合物為正、負極的二次電池。正極采用锂化合物LiCoO2或LiMn2O4和LiFePO4,負極采用锂-碳層間化合物,電解質是液體的六氟磷酸锂。锂離子電池由于工作電壓高、體積小、質量輕、能量高、無記憶效應、無污染、自放電小、循環壽命長,是21世紀發展的理想能源。

标記信息庫

LIB(labelInformationBase),标簽信息庫

對路由表中的每一條IGP的IP前綴來說,第一台LSR都會進行本地捆綁,也就是說,為IPv4前綴捆綁标簽。然後LSR再将該捆綁的标簽分發給所有LSP鄰居。這些接收到的标簽轉換為遠程标簽。之後鄰居将該遠程和本地标簽存儲于一張特殊的表中,這張表就是标簽信息庫(LIB)。

上一篇:RSA

下一篇:Heritage

相關詞條

相關搜索

其它詞條