VC++动态库的创建与调用整理

一、动态链接库与静态链接库描述

    DLL可以看成一种仓库,它提供一些可以拿来用的变量、函数或类。在仓库的发展史上经理了“无库-静态链接库-动态链接库”的时代。静态链接库与动态链接库都是共享代码的方式,静态链接库,lib中的指令都被直接包含在最终生成的EXE文件中了;动态链接库,不必包含在最终的EXE文件中,它执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或者静态链接库。

二、动态链接库的创建

lib.h:

#ifndef LIB_H
#define LIB_H

extern "C" int __declspec(dllexport)add(int x, int y);

#endif
lib.cpp:

#include "lib.h"

int add(int x, int y)
{
    return x + y;
}

生成dll与lib:

 三、动态链接库的调用

1)静态方式:

#include <stdio.h>
#include "../lib/lib.h"

#pragma comment(lib, "../Debug/lib.lib")

int main()
{
    int num = 2;
    int num2 = 6;
    int sum = add(num, num2);
    printf("两数总和:%d\n", sum);

    getchar();
    return 0;
}

生成结果:

2)动态方式:

 #include <stdio.h>
#include <windows.h>

typedef int(*lpAddFun)(int, int); //宏定义函数指针类型

int main()
{
    HINSTANCE hDLL; //句柄
    lpAddFun addFun; //函数指针
    hDLL = LoadLibrary("../Debug/lib.dll");
    if (hDLL != NULL)
    {
        addFun = (lpAddFun)GetProcAddress(hDLL, "add");
        if (addFun != NULL)
        {
            int result = addFun(2, 6);
            printf("两数总和:%d\n", result);
        }
        FreeLibrary(hDLL);
    }
    getchar();
    return 0;
}

生成结果:

 说明:另外一种方式是通过.def文件导出DLL的:

注意: 这个生成的动态库与之前的一种是同一种类型,调用方式也是一样的可以动态与静态两种方式。

总结:除了最基本的C++动态库以外,还可以生成win32动态库,MFC规则库,MFC扩展库,以及后来的Qt动态库或者静态库。C++动态库与win32动态库调用方式基本类似,MFC的库可能会需要额外引入依赖头文件;QT动态库需要用自身的方式来调用有静态与动态方式(QLibrary),这里不再描述。

猜你喜欢

转载自blog.csdn.net/leiyang2014/article/details/125834660