二. 靜態鏈接庫

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

 

建立一個靜態鏈接庫

在VC++6.0中new一個名稱爲libTest的Win32 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 <stdio.h>
#include "../lib.h"
#pragma comment( lib, "..//debug//libTest.lib" )  //指定與靜態庫一起連接
int main(int argc, char* argv[])
{
printf( "2 + 3 = %d", add( 2, 3 ) );
}


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

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

 

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

  (1)庫不是個怪物,編寫庫的程序和編寫一般的程序區別不大,只是庫不能單獨執行;
  (2)庫提供一些可以給別的程序調用的東東,別的程序要調用它必須以某種方式指明它要調用之。

  以上從靜態鏈接庫分析而得到的對庫的懵懂概念可以直接引申到動態鏈接庫中,動態鏈接庫與靜態鏈接庫在編寫和調用上的不同體現在庫的外部接口定義及調用方式略有差異。

發佈了27 篇原創文章 · 獲贊 1 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章