萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> 編程語言綜合 >> VC++動態鏈接庫(DLL)編程之靜態鏈接庫

VC++動態鏈接庫(DLL)編程之靜態鏈接庫

   對靜態鏈接庫的講解不是本文的重點,但是在具體講解DLL之前,通過一個靜態鏈接庫的例子可以快速地幫助我們建立“庫”的概念。

VC++動態鏈接庫(DLL)編程之靜態鏈接庫 三聯

  圖1 建立一個靜態鏈接庫

  如圖1,在VC++6.0中new一個名稱為libTest的static library工程(單擊此處下載本工程附件),並新建lib.h和lib.cpp兩個文件,lib.h和lib.cpp的源代碼如下:

  //文件:lib.h

  #ifndef LIB_H

  #define LIB_H

  extern "C" int add(int x,int y);   //聲明為C編譯、連接方式的外部函數

  #endif

  //文件:lib.cpp

  #include "lib.h"

  int add(int x,int y)

  {

  return x + y;

  }

  編譯這個工程就得到了一個.lib文件,這個文件就是一個函數庫,它提供了add的功能。將頭文件和.lib文件提交給用戶後,用戶就可以直接使用其中的add函數了。

  標准Turbo C2.0中的C庫函數(我們用來的scanf、printf、memcpy、strcpy等)就來自這種靜態庫。

  下面來看看怎麼使用這個庫,在libTest工程所在的工作區內new一個libCall工程。libCall工程僅包含一個main.cpp文件,它演示了靜態鏈接庫的調用方法,其源代碼如下:

  #include

  #include "..lib.h"

  #pragma comment( lib, "..debuglibTest.lib" )  //指定與靜態庫一起連接

  int main(int argc, char* argv[])

  {

  printf( "2 + 3 = %d", add( 2, 3 ) );

  }  靜態鏈接庫的調用就是這麼簡單,或許我們每天都在用,可是我們沒有明白這個概念。代碼中#pragma comment( lib , "..debuglibTest.lib" )的意思是指本文件生成的.obj文件應與libTest.lib一起連接。

  如果不用#pragma comment指定,則可以直接在VC++中設置,如圖2,依次選擇tools、options、directories、library files菜單或選項,填入庫文件路徑。圖2中加紅圈的部分為我們添加的libTest.lib文件的路徑。

VC++動態鏈接庫(DLL)編程之靜態鏈接庫

  圖2 在VC中設置庫文件路徑

  這個靜態鏈接庫的例子至少讓我們明白了庫函數是怎麼回事,它們是哪來的。我們現在有下列模糊認識了:

  (1)庫不是個怪物,編寫庫的程序和編寫一般的程序區別不大,只是庫不能單獨執行;

  (2)庫提供一些可以給別的程序調用的東東,別的程序要調用它必須以某種方式指明它要調用之。

copyright © 萬盛學電腦網 all rights reserved