【0004】關於.lib後綴文件的認識

1.百度百科html

.lib是一種文件名後綴,表明的是靜態數據鏈接庫,在windows操做系統中起到連接程序和函數(或子過程)的做用,至關於Linux中的·a或·o、.so文件。ios

意義

LIB文件中存放的是函數調用的信息,值得一提的是數據庫有靜態數據庫(.lib文件)和動態數據庫(.dll文件)。

靜態編譯

靜態編譯將導出聲明和實現都放在lib中。編譯後全部代碼都嵌入到 宿主程序
靜態編譯的優勢是編寫出來的程序不須要調用DLL和載入函數,直接能夠當成程序的一部分來使用。
靜態編譯的缺點也是顯而易見的,使用靜態編譯的程序體積會比動態編譯大,緣由是函數的實現被嵌入爲程序代碼的一部分。

動態編譯

動態LIB文件至關於一個C語言中的h文件,是函數導出部分的聲明,而不將實現過程嵌入到程序自己中,編譯後只是將函數地址存在宿主程序中,運行到調用函數是調用DLL並載入函數來實現函數的具體操做。

詳細說明

LIB文件是不對外公開的,除非有專門的LIB查看工具,不然不能查看LIB文件中對函數的具體實現過程
有幾個選擇:
一、若是你查看有同名的dll文件,能夠經過vc自帶的depends查看dll接口
二、經過msdn看你使用的該lib包含的函數名,來查找其對應的頭文件,頭文件裏面有整個lib的函數聲明(可能不全)
三、查看vc或者其餘工具 安裝目錄下的src目錄,查看函數的 代碼
四、使用lib文件的方法:
1-在object/library modules使用全路徑名;
2-把*.lib放在VC的Lib目錄中
3-修改project setting的Link->Input中的Addtional library path,加入你的目錄。
LIB文件是庫文件(與DLL文件相相似),供其它程序調用的,直接打不開。
五、查看LIB和DLL文件均可以經過OLLYDBG中LOADDLL插件來反彙編查看各個函數的過程。
 

內容

一個lib文件是obj文件的集合。固然,其中還夾雜着其餘一些 輔助信息,目的是爲了讓 編譯器可以準確找到對應的obj文件。咱們能夠經過tlib.exe(在tc2.0下的根目錄)來對lib文件進行操做,你能夠把本身生成的obj文件經過tlib命令加入到一個lib文件中,也能夠把lib文件內的obj文件進行刪除操做,還能夠把內部的obj文件給提取出來。明白了lib文件的大體結構以及對它的具體操做,在學習C語言的過程當中,就會又多了一個切入點對C語言具體實現進行研究。
 

使用步驟

在command下,把當前目錄設置爲tlib.exe所在目錄,而後輸入tlib命令回車,此時顯示的內容就是對tlib命令的詳細解釋,語法以下:
Syntax: TLIB libname [/C] [/E] commands, listfile
libname library file pathname
commands sequence of operations to be performed (optional)
listfile file name for listing file (optional)
A command is of the form: <symbol>modulename, where <symbol> is:
+ add modulename to the library
- remove modulename from the library
* extract modulename without removing it
-+ or +- replace modulename in library
-* or *- extract modulename and remove it
/C case-sensitive library
/E create extended dictionary
具體解釋:
tlib libname [/C] [/E] commands, listfile
/C:大小寫敏感標誌。該選項不經常使用,此參數爲可選項。
/E:創建擴展字典。創建擴展字典能夠加速大的庫文件的鏈接過程,此參數一樣爲可選項。
操做命令(可選項):
+ obj文件名 把指定obj文件添加到lib文件中
- obj文件名 把指定obj文件從lib文件中刪除
* obj文件名 導出指定的obj文件(導出後對應的obj文件在lib文件內仍然存在)
-+ obj文件名 替換指定的obj文件(前提是在lib文件中存在與指定obj文件同名的obj)
-* obj文件名 導出指定的obj文件(導出後把對應的obj文件從lib文件內刪除)
lib文件中obj文件列表(可選項)
此參數說明了命令運行後,生成的對應lib文件的列表文件名。它記錄了當前lib文件內obj文件列表
 

與dll區別

(1)lib是編譯時須要的,dll是運行時須要的。
若是要完成 源代碼的編譯,有lib就夠了。
若是要使動態鏈接的程序運行起來,有dll就夠了。
在開發和調試階段,固然最好都有。
(2)通常的動態庫程序有lib文件和dll文件。lib文件是必須在編譯期就鏈接到應用程序中的,而dll文件是運行期纔會被調用的。若是有dll文件,那麼對應的lib文件通常是一些索引信息,具體的實如今dll文件中。若是隻有lib文件,那麼這個lib文件是 靜態編譯出來的,索引和實現都在其中。靜態編譯的lib文件有好處:給用戶安裝時就不須要再掛動態庫了。但也有缺點,就是致使應用程序比較大,並且失去了動態庫的靈活性,在 版本升級時,同時要發佈新的應用程序才行。
(3)在動態庫的狀況下,有兩個文件,一個是引入庫(.LIB)文件,一個是DLL文件,引入庫文件包含被DLL導出的函數的名稱和位置,DLL包含實際的函數和數據,應用程序使用LIB文件連接到所須要使用的DLL文件,庫中的函數和數據並不複製到 可執行文件中,所以在應用程序的可執行文件中,存放的不是被調用的函數代碼,而是DLL中所要調用的函數的 內存地址,這樣當一個或多個應用程序運行時再把程序代碼和被調用的函數代碼連接起來,從而節省了內存資源。從上面的說明能夠看出,DLL文件必須隨應用程序一塊兒發行,不然應用程序將會產生錯誤。

加載方法

直接加入
在VC中打開File View一頁,選中工程名,單擊鼠標右鍵,而後選中"Add Files to Project"菜單,在彈出的文件對話框中選中要加入DLL的LIB文件便可。
 

設置

打開工程的 Project Settings菜單,選中Link,而後在Object/library modules下的文本框中輸入DLL的LIB文件。
 

程序代碼

加入 預編譯指令#pragma comment (lib,"*.lib"),這種方法優勢是能夠利用條件預編譯指令連接不一樣版本的LIB文件。由於,在Debug方式下,產生的LIB文件是Debug版本,如Regd.lib;在Release方式下,產生的LIB文件是Release版本,如Regr.lib。
當應用程序對DLL的LIB文件加載後,還須要把DLL對應的頭文件(*.h)包含到其中,在這個頭文件中給出了DLL中定義的函數原型,而後聲明。
詳解

==========================================================================================================================================數據庫

 

2. 博客參考轉載:LIB和DLL的區別與使用windows

參考網址:http://www.cppblog.com/amazon/archive/2009/09/04/95318.html數據結構

共有兩種庫:
一種是LIB包含了函數所在的DLL文件和文件中函數位置的信息(入口),代碼由運行時加載在進程空間中的DLL提供,稱爲動態連接庫dynamic link library。
一種是LIB包含函數代碼自己,在編譯時直接將代碼加入程序當中,稱爲靜態連接庫static link library。
共有兩種連接方式:
動態連接使用動態連接庫,容許可執行模塊(.dll文件或.exe文件)僅包含在運行時定位DLL函數的可執行代碼所需的信息。
靜態連接使用靜態連接庫,連接器從靜態連接庫LIB獲取全部被引用函數,並將庫同代碼一塊兒放到可執行文件中。

關於lib和dll的區別以下:
(1)lib是編譯時用到的,dll是運行時用到的。若是要完成源代碼的編譯,只須要lib;若是要使動態連接的程序運行起來,只須要dll。
(2)若是有dll文件,那麼lib通常是一些索引信息,記錄了dll中函數的入口和位置,dll中是函數的具體內容;若是隻有lib文件,那麼這個lib文件是靜態編譯出來的,索引和實現都在其中。使用靜態編譯的lib文件,在運行程序時不須要再掛動態庫,缺點是致使應用程序比較大,並且失去了動態庫的靈活性,發佈新版本時要發佈新的應用程序才行。
(3)動態連接的狀況下,有兩個文件:一個是LIB文件,一個是DLL文件。LIB包含被DLL導出的函數名稱和位置,DLL包含實際的函數和數據,應用程序使用LIB文件連接到DLL文件。在應用程序的可執行文件中,存放的不是被調用的函數代碼,而是DLL中相應函數代碼的地址,從而節省了內存資源。DLL和LIB文件必須隨應用程序一塊兒發行,不然應用程序會產生錯誤。若是不想用lib文件或者沒有lib文件,能夠用WIN32 API函數LoadLibrary、GetProcAddress裝載。

使用lib需注意兩個文件:
(1).h頭文件,包含lib中說明輸出的類或符號原型或數據結構。應用程序調用lib時,須要將該文件包含入應用程序的源文件中。
(2).LIB文件,略。

使用dll需注意三個文件:
(1).h頭文件,包含dll中說明輸出的類或符號原型或數據結構的.h文件。應用程序調用dll時,須要將該文件包含入應用程序的源文件中。
(2).LIB文件,是dll在編譯、連接成功以後生成的文件,做用是當其餘應用程序調用dll時,須要將該文件引入應用程序,不然產生錯誤。若是不想用lib文件或者沒有lib文件,能夠用WIN32 API函數LoadLibrary、GetProcAddress裝載。
(3).dll文件,真正的可執行文件,開發成功後的應用程序在發佈時,只須要有.exe文件和.dll文件,並不須要.lib文件和.h頭文件。

使用lib的方法:
靜態lib中,一個lib文件其實是任意個obj文件的集合,obj文件是cpp文件編譯生成的。在編譯這種靜態庫工程時,根本不會遇到連接錯誤;即便有錯,也只會在使用這個lib的EXT文件或者DLL工程裏暴露出來。
在VC中新建一個static library類型的工程Lib,加入test.cpp文件和test.h文件(頭文件內包括函數聲明),而後編譯,就生成了Lib.lib文件。
別的工程要使用這個lib有兩種方式:
(1)在project->link->Object/Library Module中加入Lib.lib文件(先查詢工程目錄,再查詢系統Lib目錄);或者在源代碼中加入指令#pragma comment(lib, 「Lib.lib」)。
(2)將Lib.lib拷入工程所在目錄,或者執行文件生成的目錄,或者系統Lib目錄中。
(3)加入相應的頭文件test.h。

使用DLL的方法:
使用動態連接中的lib,不是obj文件的集合,即裏面不會有實際的實現,它只是提供動態連接到DLL所須要的信息,這種lib能夠在編譯一個DLL工程時由編譯器生成。
建立DLL工程的方法(略)。
(1)隱式連接
第一種方法是:經過project->link->Object/Library Module中加入.lib文件(或者在源代碼中加入指令#pragma comment(lib, 「Lib.lib」)),並將.dll文件置入工程所在目錄,而後添加對應的.h頭文件。函數

#include "stdafx.h"
#include "DLLSample.h"

#pragma comment(lib, "DLLSample.lib")    //你也能夠在項目屬性中設置庫的連接

int main()
{
        TestDLL(123);   //dll中的函數,在DllSample.h中聲明
        return(1);
}

(2)顯式連接
須要函數指針和WIN32 API函數LoadLibrary、GetProcAddress裝載,使用這種載入方法,不須要.lib文件和.h頭文件,只須要.dll文件便可(將.dll文件置入工程目錄中)。工具

#include <iostream>
#include <windows.h>         //使用函數和某些特殊變量
typedef void (*DLLFunc)(int);
int main()
{
        DLLFunc dllFunc;
        HINSTANCE hInstLibrary = LoadLibrary("DLLSample.dll");

        if (hInstLibrary == NULL)
        {
          FreeLibrary(hInstLibrary);
        }
        dllFunc = (DLLFunc)GetProcAddress(hInstLibrary, "TestDLL");
        if (dllFunc == NULL)
        {
          FreeLibrary(hInstLibrary);
        }
        dllFunc(123);
        std::cin.get();
        FreeLibrary(hInstLibrary);
        return(1);
}

LoadLibrary函數利用一個名稱做爲參數,得到DLL的實例(HINSTANCE類型是實例的句柄),一般調用該函數後須要查看一下函數返回是否成功,若是不成功則返回NULL(句柄無效),此時調用函數FreeLibrary釋放DLL得到的內存。
GetProcAddress函數利用DLL的句柄和函數的名稱做爲參數,返回相應的函數指針,同時必須使用強轉;判斷函數指針是否爲NULL,若是是則調用函數FreeLibrary釋放DLL得到的內存。此後,可使用函數指針來調用實際的函數。
最後要記得使用FreeLibrary函數釋放內存。

注意:應用程序如何找到DLL文件?
使用LoadLibrary顯式連接,那麼在函數的參數中能夠指定DLL文件的完整路徑;若是不指定路徑,或者進行隱式連接,Windows將遵循下面的搜索順序來定位DLL:
(1)包含EXE文件的目錄
(2)工程目錄
(3)Windows系統目錄
(4)Windows目錄
(5)列在Path環境變量中的一系列目錄post

相關文章
相關標籤/搜索