靜態鏈接庫LIB和動態鏈接庫DLL的區別 創建和示例


1.什么是靜態連接庫,什么是動態鏈接庫
? 靜態鏈接庫與動態鏈接庫都是共享代碼的方式,如果采用靜態鏈接庫,則無論你愿不愿意, lib 中的指令都全部被直接包含在最終生成的 EXE 文件中了但是若使用 DLL,該 DLL 不必被包含在最終 EXE 文件中,EXE 文件執行時可以“動態”地引用和卸載這個與 EXE 獨立的 DLL 文件靜態鏈接庫和動態鏈接庫的另外一個區別在于靜態鏈接庫中不能再包含其他的動態鏈接庫或者靜態庫,而在動態鏈接庫中還可以再包含其他的動態或靜態鏈接 庫。靜態鏈接庫與靜態鏈接庫調用規則總體比較如下。?

對于靜態鏈接庫(比較簡單):
首先靜態鏈接庫的使用需要庫的開發者提供生成庫的.h頭文件和.lib文件。

生成庫的.h頭文件中的聲明格式如下:
extern "C" 函數返回類型 函數名(參數表);
在調用程序的.cpp源代碼文件中如下:
#include "..\lib.h"
#pragma comment(lib,"..\\debug\\libTest.lib")?
//指定與靜態庫一起鏈接

第二因為靜態鏈接庫是將全部指令都包含入調用程序生成的EXE文件中。因此如果用的是靜態鏈接庫,那么也就不存在“導出某個函數提供給用戶使用”的情況,要想用就得全要!要不就都別要!:)

對于動態鏈接庫:
動態鏈接庫的使用需要庫的開發者提供生成的.lib文件和.dll文件。或者只提供dll文件
首先我們必須先注意到DLL內的函數分為兩種:?
(1)DLL 導出函數,可供應用程序調用;?
(2)DLL 內部函數,只能在 DLL 程序使用,應用程序無法調用它們。

因此調用程序若想調用DLL中的某個函數就要以某種形式或方式指明它到底想調用哪一個函數



靜態庫與導入庫的區別:

導入庫和靜態庫的區別很大,他們實質是不一樣的東西。靜態庫本身就包含了實際執行代碼、符號表等等,而對于導入庫而言,其實際的執行代碼位于動態庫中,導入庫只包含了

地址符號表等,確保程序找到對應函數的一些基本地址信息。

靜態鏈接與動態鏈接:

靜態鏈接方法:#pragma comment(lib, "test.lib") ,靜態鏈接的時候,載入代碼就會把程序會用到的動態代碼或動態代碼的地址確定下來

靜態庫的鏈接可以使用靜態鏈接,動態鏈接庫也可以使用這種方法鏈接導入庫

動態鏈接方法:LoadLibrary()/GetProcessAddress()和FreeLibrary(),使用這種方式的程序并不在一開始就完成動態鏈接,而是直到真正調用動態庫代碼時,載入程序才計算(被調用的那部分)動態代碼的邏輯地址,然后等到某個時候,程序又需要調用另外某塊動態代碼時,載入程序又去計算這部分代碼的邏輯地址,所以,這種方式使程序初始化時間較短,但運行期間的性能比不上靜態鏈接的程序。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254867.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254867.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254867.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【譯】x86程序員手冊37-第10章 初始化

Chapter 10 Initialization 第10章 初始化 After a signal on the RESET pin, certain registers of the 80386 are set to predefined values. These values are adequate to enable execution of a bootstrap program, but additional initialization must be performed by s…

在ubuntu中安裝minicom時出現device /dev/tty8 is locked解決辦法

未正常關閉minicom yesaiduywf-ubuntu: ~$ ls /var/lock LCK..ttyS0 subsys yesaiduywf-ubuntu: ~$ kill 0 yesaiduywf-ubuntu: ~$ ls /var/lock subsys yesaiduywf-ubuntu: ~$ sudo minicom Welcome to minicom 2.3 或者刪除/var/lock下面以LCK開頭的文件轉載于:https://www.…

秒殺多線程第二篇 多線程第一次親密接觸 CreateThread與_beginthreadex本質區別

本文將帶領你與多線程作第一次親密接觸,并深入分析CreateThread與_beginthreadex的本質區別,相信閱讀本文后你能輕松的使用多線程并能流暢準確的回答CreateThread與_beginthreadex到底有什么區別,在實際的編程中到底應該使用CreateThread還是…

halcon get_image_pointer1獲取圖像指針

目錄get_image_pointer1(算子)描述參數get_image_pointer1(算子) get_image_pointer1 - 訪問單通道圖像的指針。 get_image_pointer1(Image : : : Pointer, Type, Width, Height) 描述 運算符get_image_pointer1返回指向圖像I…

如何傳輸文件到linux服務器?

我們知道,云主機文件傳輸是一件相對復雜的事情,經常需要搭建FTP服務器或者是借助其他工具來完成。下面為大家介紹一種簡單易操作的傳輸文件到Linux服務器的方法。 Linux文件傳輸同Windows文件傳輸一樣,我們為每一臺Linux主機配置了一個1G的網…

C++學習筆記(五)--指針、NULL、引用

1. C中已經定義了NULL為0:#define NULL 0 指針p可以指向空值NULL即 p NULL;表示該指針變量不指向任何變量。   注意:指針未初始化與指針為NULL不同,   p NULL;是有值的,為0;   而在定義時:int *p;這時候碎雖然…

Sort函數的用法

快速排序sort的用法&#xff1a;&#xff08;適用于int float double char 。。。&#xff09; 記得加頭文件&#xff01; 記得加頭文件&#xff01; 記得加頭文件&#xff01; 頭文件&#xff1a; #include <algorithm> using namespace std ; // 兩行都要寫 數組排…

crf與bitrate對照表

crf與bitrate對照表 (2011-06-21 17:45:59)一些關于crf的備忘&#xff1a; 1、相較于bitrate方式&#xff0c;cpu占用與內存占用均會下降&#xff1b; 2、銳化濾鏡會讓crf的碼率上升&#xff1b; 3、vbv對crf依然有效&#xff1b; 4、crf18就接近無損&#xff0c;字幕組慣用20-…

秒殺多線程第三篇 原子操作 Interlocked系列函數

上一篇《多線程第一次親密接觸 CreateThread與_beginthreadex本質區別》中講到一個多線程報數功能。為了描述方便和代碼簡潔起見&#xff0c;我們可以只輸出最后的報數結果來觀察程序是否運行出錯。這也非常類似于統計一個網站每天有多少用戶登錄&#xff0c;每個用戶登錄用一個…

Vue 教程第九篇—— 動畫和過度效果

過渡效果 SPA 中組件的切換有一種生硬的隱藏顯示感覺&#xff0c;為了更好的用戶體驗&#xff0c;讓組件切換時淡出淡入&#xff0c;Vue 提供了專門的組件 transition。 過濾效果應用場景 條件渲染 (使用 v-if)條件展示 (使用 v-show)動態組件組件根節點過渡狀態 enter&#xf…

halcon create_ocr_class_svm 使用SVM分類器創建OCR分類器

目錄create_ocr_class_svm&#xff08;算子&#xff09;描述參數create_ocr_class_svm&#xff08;算子&#xff09; create_ocr_class_svm - 使用支持隨機向量機制創建OCR分類器。 create_ocr_class_svm&#xff08;:: WidthCharacter&#xff0c;HeightCharacter&#xff0…

碼率跟視頻質量有關系

碼率跟視頻質量有關系.首先要清楚, 相同的視頻編碼方式下, 碼率越高肯定畫面越清晰. 但是高到一定值, 再往上的畫面改善程度就不明顯了, 只會增大文件體積. 所以碼率選的合適, 才可以保證清晰度又保持文件不會太大. 個人經驗如果是h.264編碼(當前最好的視頻壓縮編碼方案), …

SQL 字符串分割表函數

1 --字符串分割表函數2 declare str varchar(1000)3 declare split varchar(10) 4 5 declare i int;6 declare count int;7 8 declare ChildStr varchar(1000);9 declare splitStr varchar(1000); 10 declare Index int; 11 12 declare table as table (rowId int,splitStr va…

語句:分支語句、switch case ——7月22日

語句的類型包括&#xff1a;聲明語句、表達式語句、選擇語句、循環語句、跳轉語句、異常語句 1&#xff0e;聲明語句引&#xff1a;入新的變量或常量。 變量聲明可以選擇為變量賦值。 在常量聲明中必須賦值。 例如&#xff1a; int i 0;//聲明變量i 并賦值&#xff0c;也可以不…

halcon write_ocr_trainf 將訓練字符存儲到文件中

目錄write_ocr_trainf&#xff08;運算符&#xff09;描述參數write_ocr_trainf&#xff08;運算符&#xff09; write_ocr_trainf - 將訓練字符存儲到文件中。 write_ocr_trainf&#xff08;Character&#xff0c;Image :: Class&#xff0c;TrainingFile ? 描述 運算符w…

碼率計算文章

http://bbs.dvbcn.com/showtopic-41431-1.html

PostgreSQL Oracle 兼容性之 - INDEX SKIP SCAN (遞歸查詢變態優化) 非驅動列索引掃描優化...

標簽 PostgreSQL , Oracle , index skip scan , 非驅動列條件 , 遞歸查詢 , 子樹 背景 對于輸入條件在復合索引中為非驅動列的&#xff0c;如何高效的利用索引掃描&#xff1f; 在Oracle中可以使用index skip scan來實現這類CASE的高效掃描&#xff1a; INDEX跳躍掃描一般用在W…

如何確定鏡頭CCD靶面尺寸?

在組建機器視覺系統時&#xff0c;需要選用適合實際應用的產品。今天&#xff0c;中國機器視覺商城的培訓課堂為您帶來的是關于工業鏡頭CCD靶面尺寸的確定方法。 在選擇鏡頭時&#xff0c;我們通常要注意一個原則&#xff1a;即小尺寸靶面的CCD可使用對應規格更大的鏡頭&#x…

lua去掉字符串中的UTF-8的BOM三個字節

廢話不多說&#xff0c;還是先說點吧&#xff0c;項目中lua讀取的text文件如果有BOM&#xff0c;客戶端解析就會報錯&#xff0c;所以我看了看&#xff0c;任務編輯器swGameTaskEditor 在寫入文件的時候&#xff0c;也不知道為什么有的文件就是UTF-8BOM格式&#xff1b;但一般都…

JQuery對象與DOM對象的區別與轉換

1.jQuery對象和DOM對象的區別 DOM對象&#xff0c;即是我們用傳統的方法(javascript)獲得的對象&#xff0c;jQuery對象即是用jQuery類庫的選擇器獲得的對象; eg: var domObj document.getElementById("id"); //DOM對象var $obj $("#id"); //jQuery對象;…