程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言基礎知識 >> c++中.dll與.lib文件的生成與使用的詳解

c++中.dll與.lib文件的生成與使用的詳解

編輯:C語言基礎知識

c++中.dll與.lib文件的生成與使用的詳解

--------------------------------------------------------------------------------

兩種庫:

•  包含了函數所在的DLL文件和文件中函數位置的信息(入口),代碼由運行時加載在進程空間中的DLL提供,稱為動態鏈接庫dynamic link library。
•  包含函數代碼本身,在編譯時直接將代碼加入程序當中,稱為靜態鏈接庫static link library。
共有兩種鏈接方式:

•  動態鏈接使用動態鏈接庫,允許可執行模塊(.dll文件或.exe文件)僅包含在運行時定位DLL函數的可執行代碼所需的信息。
•  靜態鏈接使用靜態鏈接庫,鏈接器從靜態鏈接庫LIB獲取所有被引用函數,並將庫同代碼一起放到可執行文件中。

--------------------------------------------------------------------------------

兩種文件的區別

--------------------------------------------------------------------------------

使用lib需注意兩個文件:

•.h頭文件,包含lib中說明輸出的類或符號原型或數據結構。應用程序調用lib時,需要將該文件包含入應用程序的源文件中。
•.LIB文件。

使用dll需注意三個文件:

•.h頭文件,包含dll中說明輸出的類或符號原型或數據結構的.h文件。應用程序調用dll時,需要將該文件包含入應用程序的源文件中。
•.LIB文件,是dll在編譯、鏈接成功之後生成的文件,作用是當其他應用程序調用dll時,需要將該文件引入應用程序,否則產生錯誤(如果不想用lib文件或者沒有lib文件,可以用WIN32 API函數LoadLibrary、GetProcAddress裝載)。
•dll文件,真正的可執行文件,開發成功後的應用程序在發布時,只需要有.exe文件和.dll文件,並不需要.lib文件和.h頭文件。

--------------------------------------------------------------------------------

生成和使用方法

--------------------------------------------------------------------------------

操作系統:WIN7

開發軟件:VS2010

--------------------------------------------------------------------------------

1.生成lib文件

  首先,我們先建立一個控制台工程(新建->工程->控制台程序),添加add.cpp以及add.h文件。
代碼如下:

//sub.h
#ifndef _SUB_H
#define _SUB_H
void sub(int a,int b);
#endif

//sub.cpp
#include "sub.h"
#include <iostream>

void sub(int a,int b)
{
    std::cout<<(a-b)<<std::endl;
}

  由於在工程中,沒有main()函數,所以直接編譯出錯。這時,要右鍵點擊工程,並選擇工程屬性,出現下圖,選擇靜態鏈接庫即可。

  這時候再按F7,build solution即可產生lib文件。在Debug中只生成.lib文件。

2.生成dll文件

  生成dll文件的過程與上面的過程是一樣的,只是在選擇Dynamic Library(.dll)即可。在Debug中會生成一個.lib和.dll兩種文件。

--------------------------------------------------------------------------------

3.兩種文件的使用

  在使用時,靜態鏈接庫只要把.h和.lib文件加入到工程文件夾中即可。而動態鏈接庫要把.h、.lib和.dll文件加入到工程中。

代碼如下:

#include <iostream>
#include "sub.h"  //鏈接庫的頭文件
using namespaces std;

#pragma comment(lib,"sub.lib") //加入鏈接庫

int main()
{
    sub(5,4);
    return 0;
}

4.僅有.dll文件時候的使用方法

  在沒有.h和.lib文件時,需要函數指針和WIN32 API函數LoadLibrary、GetProcAddress裝載,只需要.dll文件即可(將.dll文件置入工程目錄中)。
代碼如下:

#include <iostream>
#include <windows.h>               //使用函數和某些特殊變量
typedef void (*DLLFunc)(int,int);  //確定調用函數的形參
int main()
{
    DLLFunc dllFunc;
    HINSTANCE hInstLibrary = LoadLibrary("sub.dll");//加載.dll

    if (hInstLibrary == NULL)
    {
        FreeLibrary(hInstLibrary);
    }
    dllFunc = (DLLFunc)GetProcAddress(hInstLibrary, "sub");//第二個參數為要調用的函數名稱
    if (dllFunc == NULL)
    {
        FreeLibrary(hInstLibrary);
    }
    dllFunc(5,4);
    FreeLibrary(hInstLibrary);
    return(1);
}

   最近一直在搞API這東西,用了curl、tinyxml和jsoncpp幾種開源的庫,在linux下使用倒是很方便,在windows下還是自己編譯的遇到了點問題,從新整理學習下,備用~~

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved