青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

逛奔的蝸牛

我不聰明,但我會很努力

   ::  :: 新隨筆 ::  ::  :: 管理 ::

共有兩種庫:
一種是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環境變量中的一系列目錄

From: http://m.shnenglu.com/ming81/archive/2013/03/04/198215.html

.h頭文件是編譯時必須的,lib是鏈接時需要的,dll是運行時需要的。

附加依賴項的是.lib不是.dll,若生成了DLL,則肯定也生成 LIB文件。如果要完成源代碼的編譯和鏈接,有頭文件和lib就夠了。如果也使動態連接的程序運行起來,有dll就夠了。在開發和調試階段,當然最好都有。

.h .lib .dll三者的關系是:

H文件作用是:聲明函數接口 

DLL文件作用是: 函數可執行代碼 

當我們在自己的程序中引用了一個H文件里的函數,編鏈器怎么知道該調用哪個DLL文件呢?這就是LIB文件的作用: 告訴鏈接器 調用的函數在哪個DLL中,函數執行代碼在DLL中的什么位置 ,這也就是為什么需要附加依賴項 .LIB文件,它起到橋梁的作用。如果生成靜態庫文件,則沒有DLL ,只有lib,這時函數可執行代碼部分也在lib文件中

目前以lib后綴的庫有兩種,一種為靜態鏈接庫(Static Libary,以下簡稱“靜態庫”),另一種為動態連接庫(DLL,以下簡稱“動態庫”)的導入庫(Import Libary,以下簡稱“導入庫”)。靜態庫是一個或者多個obj文件的打包 ,所以有人干脆把從obj文件生成lib的過程稱為Archive,即合并到一起。比如你鏈接一個靜態庫,如果其中有錯,它會準確的找到是哪個obj有錯,即靜態lib只是殼子。動態庫一般會有對應的導入庫,方便程序靜態載入動態鏈接庫 ,否則你可能就需要自己LoadLibary調入DLL文件,然后再手工GetProcAddress獲得對應函數了。有了導入庫,你只需要鏈接導入庫后按照頭文件函數接口的聲明調用函數就可以了。導入庫和靜態庫的區別很大,他們實質是不一樣的東西。靜態庫本身就包含了實際執行代碼、符號表等等,而對于導入庫而言,其實際的執行代碼位于動態庫中,導入庫只包含了地址符號表等,確保程序找到對應函數的一些基本地址信息。

一般的動態庫程序有lib文件和dll文件。lib文件是必須在編譯期就連接到應用程序中的,而dll文件是運行期才會被調用的。 如果有dll文件,那么對應的lib文件一般是一些索引信息,具體的實現在dll文件中。如果只有lib文件,那么這個lib文件是靜態編譯出來的,索引和實現都在其中。靜態編譯的lib文件有好處:給用戶安裝時就不需要再掛動態庫了。但也有缺點,就是導致應用程序比較大,而且失去了動態庫的靈活性,在版本升級時,同時要發布新的應用程序才行。在動態庫的情況下,有兩個文件,而一個是引入庫(.LIB)文件,一個是DLL文件,引入庫文件包含被DLL導出的函數的名稱和位置,DLL包含實際的函數和數據,應用程序使用LIB文件鏈接到所需要使用的DLL文件,庫中的函數和數據并不復制到可執行文件中,因此在應用程序的可執行文件中,存放的不是被調用的函數代碼,而是DLL中所要調用的函數的內存地址,這樣當一個或多個應用程序運行是再把程序代碼和被調用的函數代碼鏈接起來,從而節省了內存資源。從上面的說明可以看出,DLL和.LIB文件必須隨應用程序一起發行,否則應用程序將會產生錯誤。

靜態庫和共享庫都是一個obj文件的集合 ,但靜態鏈接后,執行程序中存在自己所需obj的一份拷貝,而動態鏈接后,執行程序僅僅是包含對共享庫的一個引用。共享庫相當于一個由多個obj文件組合而成的obj文件,在鏈接后其所有代碼被加載,不管需要的還是不需要的。
似乎可以得出一個結論:
  靜態鏈接后的程序比動態鏈接的所用存儲空間大,因為執行程序中包含了庫中代碼拷貝;
  而動態鏈接的程序比靜態鏈接的所用的運行空間大,因為它將不需要的代碼也加載到運行空間。


針對上面的知識2 個問題:

1) DLL和.LIB文件必須隨應用程序一起發行,否則應用程序將會產生錯誤。 
我的答案:lib應該不需要吧。

2)如果是某個程序中調用了一個動態庫(通過header文件,lib+dll來調用),則對動態庫的某個函數的內容修改了,但接口不改,則調用此動態庫的程序需重新編譯連接嗎?如果是通過loadlibary動態加載,需要重新編譯連接嗎?

我的答案:通過header+lib+dll調用的話需要重新編譯連接,但是通過loadlibrary來使用的話,不需要重新編譯連接。
第2個答案錯了 應該是不需要重新編譯 接口不變的話 .lib都不用更新
From: 
http://m.shnenglu.com/mzty/archive/2010/11/28/134901.html

    1) 節省內存。同一個軟件模塊,若是以源代碼的形式重用,則會被編譯到不同的可執行程序中,同時運行這些exe時這些模塊的二進制碼會被重復加載到內存中。如 果使用dll,則只在內存中加載一次,所有使用該dll的進程會共享此塊內存(當然,像dll中的全局變量這種東西是會被每個進程復制一份的)。
    
    2) 不需編譯的軟件系統升級,若一個軟件系統使用了dll,則該dll被改變(函數名不變)時,系統升級只需要更換此dll即可,不需要重新編譯整個系統。事實上,很多軟件都是以這種方式升級的。例如我們經常玩的星際、魔獸等游戲也是這樣進行版本升級的。
    
    3) Dll庫可以供多種編程語言使用,例如用c編寫的dll可以在vb中調用。這一點上DLL還做得很不夠,因此在dll的基礎上發明了COM技術,更好的解決了一系列問題。

 

 

posted on 2013-03-14 14:38 逛奔的蝸牛 閱讀(2437) 評論(0)  編輯 收藏 引用 所屬分類: C/C++Qt
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲在线不卡| 欧美精品激情blacked18| 99国产精品| 亚洲国产导航| 亚洲欧美日韩成人| 欧美成人激情在线| 亚洲一区二区黄色| 欧美视频一区二| 在线播放不卡| 欧美一区二区三区男人的天堂 | 欧美日韩在线视频一区二区| 1000部精品久久久久久久久| 亚洲欧美日韩精品久久| 99re6热只有精品免费观看 | 欧美激情国产日韩| 欧美成人亚洲| 亚洲国产精品va在线看黑人动漫 | 欧美激情综合网| 亚洲高清不卡在线| 久久精品久久综合| 亚洲视频在线观看网站| 国产精品久久久久久久久久久久| 亚洲精品免费在线| 亚洲精品日本| 欧美大尺度在线观看| 在线日本高清免费不卡| 亚洲成人在线视频播放| 亚洲一区二区欧美| 欧美日韩午夜在线| 99精品国产在热久久婷婷| 激情一区二区| 欧美一级夜夜爽| 亚洲性av在线| 欧美午夜一区| 国产视频丨精品|在线观看| 久久精品国产精品亚洲综合| 亚洲在线第一页| 国产午夜久久久久| 久久久久国色av免费观看性色| 亚洲欧美日韩在线不卡| 国内一区二区三区在线视频| 久久久久国产精品一区| 欧美不卡激情三级在线观看| 91久久中文| 亚洲人成人一区二区三区| 国产精品成人观看视频免费| 亚洲欧美国产另类| 久久狠狠婷婷| 91久久精品国产91久久性色| 亚洲经典视频在线观看| 国产精品你懂的在线| 久久精品水蜜桃av综合天堂| 欧美成人一区在线| 亚洲性人人天天夜夜摸| 亚洲欧美日韩成人| 欧美视频在线观看视频极品| 中文国产亚洲喷潮| 久久久精品999| 欧美一区1区三区3区公司| 亚洲国产成人91精品| 亚洲欧洲精品一区| 欧美调教vk| 欧美成人高清视频| 欧美欧美天天天天操| 久久精品一区二区三区不卡| 久久综合色88| 亚洲一区国产一区| 欧美a级片一区| 亚洲欧美日韩视频二区| 美女图片一区二区| 亚洲一区二区三区四区视频| 99亚洲精品| 91久久精品国产91久久性色| 亚洲性夜色噜噜噜7777| 一本色道久久综合亚洲二区三区| 亚洲欧美日本视频在线观看| 欧美调教vk| 亚洲啪啪91| 永久91嫩草亚洲精品人人| 宅男精品视频| 在线精品视频在线观看高清| 亚洲欧美日韩国产中文| 99国产精品| 久久久久免费| 久久三级视频| 亚洲人体影院| 最近中文字幕mv在线一区二区三区四区 | 亚洲人被黑人高潮完整版| 欧美在线电影| 一区二区三区 在线观看视频| 久久这里只精品最新地址| 亚洲一区二区三区视频播放| 欧美精品在欧美一区二区少妇| 久久视频这里只有精品| 国产日韩精品一区二区三区| 最新国产成人在线观看| 免费日韩av电影| 久久人人97超碰精品888| 亚洲欧美精品一区| 亚洲欧美日韩国产另类专区| 欧美成人精品三级在线观看| 亚洲高清在线播放| 影音先锋亚洲视频| 久久久久久999| 久久久久久国产精品一区| 国产人成一区二区三区影院| 亚洲精品小视频| 亚洲亚洲精品三区日韩精品在线视频| 米奇777在线欧美播放| 亚洲黄色三级| 欧美日韩国产精品| 91久久在线观看| 亚洲天堂网在线观看| 欧美日韩成人综合在线一区二区| 99re6这里只有精品视频在线观看| 亚洲精品美女在线观看| 亚洲欧美日韩在线不卡| 亚洲天天影视| 欧美日韩国产在线| 亚洲综合999| 亚洲小说欧美另类社区| 日韩一级大片| 亚洲精品日韩在线观看| 免费观看成人鲁鲁鲁鲁鲁视频 | 亚洲福利精品| 久久一区激情| 久久久欧美一区二区| 亚洲国产99| 麻豆av一区二区三区久久| 免费亚洲一区| 亚洲视频在线观看网站| 欧美日韩综合在线| 久久黄色小说| 蜜桃精品久久久久久久免费影院| 亚洲免费av片| 国产精品chinese| 亚洲欧美影音先锋| 亚洲电影网站| 在线一区视频| 亚洲第一精品在线| 欧美精品久久一区二区| 午夜综合激情| 欧美电影免费观看网站| 亚洲欧洲日韩综合二区| 国产一区二区三区精品欧美日韩一区二区三区 | 欧美大片网址| 国产精品mm| 久久www成人_看片免费不卡| 久久久亚洲人| 亚洲在线免费视频| 激情懂色av一区av二区av| 欧美日韩国产亚洲一区| 香蕉av777xxx色综合一区| 亚洲人成在线观看一区二区| 午夜在线观看欧美| 在线不卡中文字幕播放| 国产精品夜夜嗨| 久久一日本道色综合久久| 亚洲欧美日本日韩| 亚洲第一在线视频| 久久综合激情| 亚洲欧美日韩综合| 亚洲大片一区二区三区| 国内精品福利| 欧美性久久久| 欧美午夜精品久久久久免费视| 欧美一区2区视频在线观看| 99精品国产在热久久| 久久久久久久高潮| 亚洲午夜极品| 亚洲一区二区三区四区中文| 韩国一区电影| 久久久国产精品亚洲一区| 亚洲美女视频在线观看| 国产精品r级在线| 欧美日韩国语| 欧美成ee人免费视频| 久久久久久久网| 亚洲自拍电影| 日韩视频免费在线| 亚洲日本一区二区三区| 美女91精品| 欧美成人精品影院| 久久久7777| 免费欧美在线| 久久视频在线看| 一区二区三区四区国产| 亚洲天堂免费在线观看视频| 亚洲电影在线免费观看| 亚洲欧洲精品成人久久奇米网| 国产精品一区毛片| 国产亚洲欧美中文| 国产精品永久免费视频| 国产一区二区三区久久久| 国产精品久久看| 国产精品成人一区二区三区吃奶 | 欧美日韩小视频| 欧美极品在线观看| 欧美国产精品v| 欧美激情一级片一区二区|