鏈接庫lib和dl的概念,加載方式的區別


       使用LR進行基於windows socket協議做接口測試,只提供了lr_load_dll方法來動態加載動態鏈接庫。之前學習階段,對TinyXML的學習,使用的靜態鏈接庫,當時在程序調用的時候方法也跟LR里的不一樣,那問題來了:lib和dll的區別是什么,每種鏈接庫有多少種加載方式,怎么加載呢。

          鏈接庫可以向應用程序提供一些函數,變量和類。動態鏈接庫的動態調用(也叫顯式調用,手工加載)我是可以運用了,但是靜態調用(也叫隱式調用,自動加載)。靜態鏈接庫:lib中的函數不僅被連接,全部實現都被直接包含在最終生成的EXE文件中,只是實現是不可見的。動態鏈接庫:dll不必被包含在最終的EXE中,靜態調用時僅把函數名或者變量名或者類名鏈接到EXE文件中,而這些東西的實體都只有在運行時才從動態庫中導入到可執行文件中,動態調用的時候EXE文件執行時可以直接動態地引用和卸載DLL文件。同時,靜態鏈接庫中不能再包含其他的動態鏈接庫或靜態庫,而動態鏈接庫中可以包含其他的動態或靜態庫。

      如果編寫的dll庫,希望其他的應用程序,代碼能調用里面的函數,需要設置該函數為DLL導出函數(或變量、類),這樣才可供應用程序調用。例:extern "C" _declspec(dllexport) int Test(int a, int b);DLL內部函數只能在DLL程序內使用,應用程序無法調用它們。導出函數還有一個格式:采用模塊定義(.def)文件聲明,需要在庫工程中添加模塊文件,格式如下:LIBRARY 庫工程名稱 EXPORTS 導出函數名。

      靜態鏈接庫lib,一般都是靜態調用lib 用於靜態調用和頭文件*.h 結合使用。有三種方法:

     第一:lib文件直接加入到工程文件列表中
  在VC中選中工程名,單擊鼠標右鍵,然后選中"Add --》Existing Item",在彈出的文件對話框中選中要加入的LIB文件。然后在首先要使用該函數的地方加上該LIB的頭文件,如#include "..\lib.h"即可。把lib和.h文件都復制到工程下。(一般工程不采用此方法)

       A. 選擇添加

      B.添加后變成這樣

 

       C.使用該函數的地方加上該LIB的頭文件

  

      D.復制頭文件和lib到項目下

        第二: 設置工程的 Project Settings來加載DLL的LIB文件
  打開工程的 Project Settings菜單,選中Link,然后在Object/library modules下的文本框中輸入DLL的LIB文件,如you.lib(或者lib文件的路徑,包括文件名)。然后在首先要使用該函數的地方加上該LIB的頭文件,如#include "..\lib.h"即可,把lib和.h文件都復制到工程下。(一般工程采用此方法)


  第三:通過程序代碼的方式
  加入預編譯指令#pragma comment (lib,"*.lib"),這種方法優點是可以利用條件預編譯指令鏈接不同版本的LIB文件。因為,在Debug方式下,產生的LIB文件是Debug版本,如Regd.lib;在Release方式下,產生的LIB文件是Release版本,如Regr.lib。然后在首先要使用該函數的地方加上該LIB的頭文件,如#include "..\lib.h"即可(沒有頭文件當然就不用了)。
  當應用程序對DLL的LIB文件加載后,還需要把DLL對應的頭文件(*.h)包含到其中,在這個頭文件中給出了DLL中定義的函數原型,然后聲明。

       動態鏈接庫dll,一般分靜態調用和動態調用。通過調用API函數來完成對DLL的加載與卸載,能更加有效地使用內存,應用程序時往往采用此方式。

第一:動態調用:

A. 源代碼如下:

   

 B. 運行后,在工程的debu目錄下產生了dll文件。

 

 

C:復制到相關工程目錄下,如下以在loadrunner中使用為例子。

 

      

第二:靜態調用。(lib+.H+DLL)

1.把DLL,lib,.H拷到你目標工程的Debug目錄下; 

2.打開你的目標工程選中工程,選擇屬性菜單,在對話框的多頁顯示控件中選擇Link頁。然后在Object/library中選擇好lib;

3.目標工程Head Files加入:.h文件; 目標工程(*.cpp,需要調用DLL中的函數)中包含:#include   ".h " 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM