1. 程式人生 > >windows環境下lib和dll的區別和聯絡詳細

windows環境下lib和dll的區別和聯絡詳細

c++中共有兩種庫:
1、LIB包含了函式所在的DLL檔案和檔案中函式位置的資訊(入口),程式碼由執行時載入在程序空間中的DLL提供,稱為動態連結庫dynamic link library。
(這種方式更靈活,寫的程式體積小,但是需要.exe和dll同時釋出)
2、LIB包含函式程式碼本身,在編譯時直接將程式碼加入程式當中,稱為靜態連結庫static link library。(這種方式不是很靈活,因為lib被編譯到.exe中,寫出的程式體積大,但是隻需要釋出exe即可,不需要dll檔案)
共有兩種連結方式:
1、動態連結使用動態連結庫,允許可執行模組(.dll檔案或.exe檔案)僅包含在執行時定位DLL函式的可執行程式碼所需的資訊。


2、靜態連結使用靜態連結庫,連結器從靜態連結庫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檔案,可以用WIN32API函式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環境變數中的一系列目錄

相關推薦

windows環境libdll區別聯絡詳細

c++中共有兩種庫: 1、LIB包含了函式所在的DLL檔案和檔案中函式位置的資訊(入口),程式碼由執行時載入在程序空間中的DLL提供,稱為動態連結庫dynamic link library。(這種方式更靈活,寫的程式體積小,但是需要.exe和dll同時釋出)2、LIB包含

Windows環境python爬蟲常用庫工具的安裝(UrlLib、Re、Requests、Selenium、lxml、Beautiful Soup、PyQuery 、PyMySQL等等)

本文列出了使用python進行爬蟲時所需的常用庫和工具的安裝過程,基本上只有幾行命令列的功夫就可以搞定,還是十分簡單的。 一、UrlLib 與 Re 這兩個庫是python的內建庫,若系統中已經成功安裝了python的話,這兩個庫一般是沒有什麼問題的。 驗證 開啟命令列,進入

python3.6 windows環境paramiko模組的安裝使用

今天安裝paramiko,整整折騰了一天,各種踩坑,現把安裝過程記錄下來: 環境: Python3.6 Windows2008 64位 一、安裝pycrypto 1、下載原始碼 解壓原始碼,執行c

Python2.7在Windows環境的下載、安裝配置

本文轉載自作者:小玉一、下載首先選擇一個Python版本,我選擇的是“Python 2.7.13”版本的,也可以選擇Python3.X的版本,根據個人喜好決定。在選擇的版本頁裡找到需要下載的安裝包,如下圖所示:點選連結就可以直接下載了。二、安裝找到剛剛下載好的安裝包,雙擊執行

Windows環境IOS APP打包上傳AppStore詳細流程

我們知道在上架蘋果應用過程中,申請釋出證書需要用到鑰匙串,上傳ipa需要用到xcode或Application loader提交構建版本,這都需要Mac蘋果機。 本文介紹如何在Windows環境下申請證書和上傳IPA流程。 http://bbs.reactnative

windows環境phpPhp擴充套件編譯,擴充套件dll檔案編譯

工作過程中需要編譯php擴充套件的dll格式檔案 , 經過1天的折騰,終於編譯出來了,下面以編譯php5.3.28 下runkit擴充套件為例 , 官方的windows環境下php編譯過程參考下面這兩篇文章: php5.3.28 , runkit 編譯的過程基本就是

Android 開發之Windows環境Android Studio安裝使用教程(圖文詳細步驟)

9.png 虛擬機 jdk版本 編寫 clip 開發平臺 集成開發 arc 電腦安裝 鑒於谷歌最新推出的Android Studio備受開發者的推崇,所以也跟著體驗一下。 一、介紹Android Studio Android Studio 是一個Android

windows環境zookeeper安裝使用

retain ID sync zookeepe hat net can which ble 一.簡介 zooKeeper是一個分布式的,開放源碼的分布式應用程序協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要組件。它是一個

Windows環境寫Linux sh腳本的一次挖坑填坑

utf-8 技術分享 成功 格式 挖坑 名稱 d+ 執行 man 最近在研究Docker集群和安裝的時候,需要準備若幹臺機器。所以我為節約時間,打算批量復制VM機器,然後用sh腳本命令執行機器名稱和IP等基礎配置信息的修改。 具體操作:我在windows環境下,

Windows環境的RTKPlot_Qt版本編譯時遇到的問題解決方法

-s debug otc 命令 rcv 目的 我們 自帶 不知道 在使用了 RTKLIB開源包自帶的 rtkplot.exe後,知道了它所具有的功能,就想著如何模仿它做出一個 demo。一開始看的是之前下載的 2.4.2版本的 RTKLIB,裏面是使用 Delphi開

windows環境搭建Java開發環境(一):jdk安裝配置

變量 win jns jdk安裝 分享 tool 直接 www. 技術 一、資源下載   官網:http://www.oracle.com/technetwork/java/javase/downloads/index.html   本人安裝的是jdk1.8,百度雲資源:鏈

Learing-Python【0】:Windows環境Python2Python3的安裝

一行 str rip 打開 spa ont exe 分享圖片 tps 一、下載 可以在官網下載最新版本, 也可以在以下鏈接中找想安裝的版本下載下來,這裏以Python3.6和Python2.7為例 https://www.python.org/ftp/python/

windows環境curl 安裝使用

原文:https://blog.csdn.net/qq_21126979/article/details/78690960?locationNum=10&fps=1 一、curl 安裝 curl下載地址:https://curl.haxx.se/download.html,如下圖所示: &nbs

windows環境的zookeeper安裝使用

簡介 ZooKeeper是一個分散式的,開放原始碼的分散式應用程式協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要元件。它是一個為分散式應用提供一致性服務的軟體,提供的功能包括:配置維護、域名服務、分散式同步、組服務等。 ZooKeepe

Windows環境hadoop安裝配置

1.下載Hadoop http://www.apache.org/dyn/closer.cgi/hadoop/common 2.解壓 hadoop-2.7.3.tar.gz 點右鍵“解壓到hadoop-2.7.3” 資料夾路徑 xxx/xxxx/hadoop-2.7.3 複製

Springboot 2.0.x 簡單整合Rabbit MQ 並實現訊息傳送消費【Windows 環境

文章目錄 Springboot 2.0.x 簡單整合Rabbit MQ 並實現訊息傳送和消費【Windows 環境下】 1、rabbit mq 基礎支援,安裝 Erlang 環境 2、安裝 ra

windows環境,Mysql的主從複製主主複製

一、Mysql的主從配置 1.找到配置檔案         找到配置檔案是主從複製的第一個難點。很多新手都容易找錯配置檔案,一般my.ini配置檔案所在的位置都是隱藏的。一般人都以為配置檔案為C:\Program Files\MySQL\MySQL S

Windows環境Anacondaselenium庫安裝使用

最近準備利用python實現自動化chrome網頁操作,這裡將準備安裝過程總結: 1、安裝anaconda       由於anaconda集成了python和整合開發環境spyder,安裝anaco

Windows環境的golang的環境安裝設定

    別人都說安裝golang的開發環境很麻煩,雖然老師把golang的環境打包成一個安裝包,只要一鍵安裝就可以了,但我想試一下自己弄,結果還真是遇到了麻煩。     首先介紹一下golang語言。

Windows環境編譯OpenCV3.1OpenCV_contrib

參考 https://segmentfault.com/a/1190000003496009 說明一下,當我編譯OpenCV_contrib時,已經是要配合OpenCV3.1的版本才能編譯通過,所以有要自己編譯OpenCV_contrib的請儘量使用較新的OpenCV版本。