天天看点

静态链接库和动态链接库详解

一.静态库

         用通俗的话讲,静态库就是将代码编译到一个二进制文件下(通常扩展名为.LIB).然后客户

端调用程序,只需要包含相关的.h文件及LIB库文件一起链接到exe文件中.可执行程序发布后,不

再需要该.lib文件了.

二.动态库

   最终将编译出.lib与.dll文件. 注意.lib文件与上面的静态库虽然扩展名相同,但有本质的

   区别.动态库中的lib文件是动态库的引入库. 该引入库包含被DLL导出的函数和变量的"符号

   名".而静态库中的.lib包含了函数和数据,动态库的函数和数据是编译到.dll中.动态链接库调

   用方式分为隐式调用与显示调用(也称静态调用与动态调用)。

三.静态库的使用

1.下面来看看如何生成一个静态库

   (1)新建静态库工程,新建DllStaticLib.h及新建DllStaticLib.cpp文件

   (2)DllStaticLib.h代码如下:

静态链接库和动态链接库详解

   #ifndef _DLL_STATIC_LIB_H__

静态链接库和动态链接库详解

   #define _DLL_STATIC_LIB_H__

静态链接库和动态链接库详解
静态链接库和动态链接库详解

   extern "C"{

静态链接库和动态链接库详解

      int add(int x,int y);

静态链接库和动态链接库详解

   }

静态链接库和动态链接库详解
静态链接库和动态链接库详解
静态链接库和动态链接库详解

   #endif

静态链接库和动态链接库详解

   (3)DllStaticLib.cpp代码如下:

静态链接库和动态链接库详解

   #include "DllStaticLib.h"

静态链接库和动态链接库详解

   #include "stdafx.h"

静态链接库和动态链接库详解
静态链接库和动态链接库详解

   int add(int x,int y)

静态链接库和动态链接库详解

   {

静态链接库和动态链接库详解

        return x+y;

静态链接库和动态链接库详解

   }

(4)最终生成DllStaticLib.lib静态库文件

2.调用静态库

  (1)现在只要使用DllStaticLib.lib,DllStaticLib.h文件.

     (注意让VC能搜索到该文件,设置VC相关的包含目录与库目录.

  (2)调用代码如下:

静态链接库和动态链接库详解

#include "stdafx.h"

静态链接库和动态链接库详解

#include <conio.h>

静态链接库和动态链接库详解

#include "DllStaticLib.h"//要设置VC包含目录,以便编译时能找到头文件

静态链接库和动态链接库详解
静态链接库和动态链接库详解

//要设置VC库目录,以便编译链接时可以找到该DllStaticLib.lib

静态链接库和动态链接库详解

#pragma comment(lib,"DllStaticLib.lib")

静态链接库和动态链接库详解
静态链接库和动态链接库详解

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

静态链接库和动态链接库详解

{

静态链接库和动态链接库详解

    printf("%d\n",add(3,5));

静态链接库和动态链接库详解
静态链接库和动态链接库详解

    _getch();

静态链接库和动态链接库详解

    return 0;

静态链接库和动态链接库详解

}

四. 动态链接库的使用

1.生成动态链接库

  (1)新建动态链接库工程,加入TestDll.h及TestDll.cpp文件

  (2)TestDll.h代码如下:

静态链接库和动态链接库详解

#ifndef _TEST_DLL_H__

静态链接库和动态链接库详解

#define _TEST_DLL_H__

静态链接库和动态链接库详解
静态链接库和动态链接库详解

#ifdef TESTDLL_EXPORTS

静态链接库和动态链接库详解

#define TESTDLL_API __declspec(dllexport)

静态链接库和动态链接库详解

#else

静态链接库和动态链接库详解

#define TESTDLL_API __declspec(dllimport)

静态链接库和动态链接库详解

#endif

静态链接库和动态链接库详解
静态链接库和动态链接库详解

extern "C" TESTDLL_API int sum(int x,int y);

静态链接库和动态链接库详解
静态链接库和动态链接库详解

#endif

 (3)TestDll.cpp代码如下:

静态链接库和动态链接库详解

#include "TestDll.h"

静态链接库和动态链接库详解
静态链接库和动态链接库详解

int sum(int x,int y)

静态链接库和动态链接库详解

{

静态链接库和动态链接库详解

    return x+y;

静态链接库和动态链接库详解

}

  (3)注意,将工程中设置属性定义TESTDLL_EXPORTS宏,以便确定该工程为DLL导出

  (4)最终生成TestDll.lib及TestDll.dll文件

2.隐式调用Dll库

  (1)新建win32控制台工程,加入DllClient.cpp

  (2)示例代码如下:

静态链接库和动态链接库详解

#include <iostream>

静态链接库和动态链接库详解

#include <conio.h>

静态链接库和动态链接库详解

#include "TestDll.h" //要设置VC包含目录,以便编译时能找到头文件

静态链接库和动态链接库详解

using namespace std;

静态链接库和动态链接库详解
静态链接库和动态链接库详解
静态链接库和动态链接库详解

//要设置VC库目录,以便编译链接时可以找到该DllStaticLib.lib

静态链接库和动态链接库详解

#pragma  comment(lib,"TestDll.lib")

静态链接库和动态链接库详解
静态链接库和动态链接库详解

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

静态链接库和动态链接库详解

{

静态链接库和动态链接库详解
静态链接库和动态链接库详解

    printf("%d\n",sum(8,9));

静态链接库和动态链接库详解

    _getch();

静态链接库和动态链接库详解

    return 0;

静态链接库和动态链接库详解

}

(3)说明,隐式调用需要lib文件,但是exe编译后,就不再需要lib,只需要dll文件即可.

     以下显式调用不需要lib文件,只需要提供dll文件.随exe运行与结束装载或释放dll文件.

3.显式调用Dll库

(1)同上新建win32工程.加入cpp文件,代码如下:

静态链接库和动态链接库详解

#include <iostream>

静态链接库和动态链接库详解

#include <conio.h>

静态链接库和动态链接库详解

#include <windows.h>

静态链接库和动态链接库详解

using namespace std;

静态链接库和动态链接库详解
静态链接库和动态链接库详解

typedef int FUN_SUM(int x,int y);

静态链接库和动态链接库详解
静态链接库和动态链接库详解

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

静态链接库和动态链接库详解

{

静态链接库和动态链接库详解
静态链接库和动态链接库详解

    HINSTANCE hDll; //DLL句柄

静态链接库和动态链接库详解
静态链接库和动态链接库详解

    hDll = LoadLibrary(L"TestDll.dll");

静态链接库和动态链接库详解

    if (hDll != NULL)

静态链接库和动态链接库详解

    {

静态链接库和动态链接库详解

        FUN_SUM *sum = (FUN_SUM*)GetProcAddress(hDll, "sum");

静态链接库和动态链接库详解

        if(sum)

静态链接库和动态链接库详解

        {

静态链接库和动态链接库详解

            cout<<(*sum)(9,10)<<endl;

静态链接库和动态链接库详解

        }

静态链接库和动态链接库详解

        else

静态链接库和动态链接库详解

        {

静态链接库和动态链接库详解

            cout<<"获取sum函数指针失败!"<<endl;

静态链接库和动态链接库详解

        }

静态链接库和动态链接库详解
静态链接库和动态链接库详解

        FreeLibrary(hDll);

静态链接库和动态链接库详解

    }

静态链接库和动态链接库详解

    else

静态链接库和动态链接库详解

    {

静态链接库和动态链接库详解

        cout<<"装载TestDll.dll失败!"<<endl;

静态链接库和动态链接库详解

    }

静态链接库和动态链接库详解

    _getch();

静态链接库和动态链接库详解

    return 0;

静态链接库和动态链接库详解

}

创建动态链接库项目:

1、打开Microsoft Visual Studio 2010,选择File->New->Project。

2、在New Project中选择Installed Templates->Visual C++->Win32。

3、选择Win32 Console Application,设置名称:simpledll,设置解决方案名:zdddll。

4、单击OK,在出现的Win32 Application Wizard的Overview对话框中点击Next。

5、在Application Settings中,选择Application type下的DLL。

6、勾选Additional options下的Empty project。

7、单击Finish创建项目。

向动态链接库添加类:

1、添加新类头文件。右键单击simpledll项目,Add->New Item,选择Header File(.h),设置名称为simpledll,单击Add。

2、添加新类源文件。右键单击simpledll项目,Add->New Item,选择C++ File(.cpp),设置名称为simpledll,单击Add。

3、为新类添加内容。