windows下创建与使用动态链接库

    xiaoxiao2021-03-25  61

    Windows下创建与使用动态库

    创建动态库(.dll

    Linux相比,在Windows系统下创建动态库要稍微麻烦一些。首先,需要一个DllMain函数做出初始化的入口(创建win32控制台程序时,勾选DLL类型会自动生成这个文件):

    dllmain.cpp入口文件

    // dllmain.cpp : Defines the entry point for the DLL application.

    #include "stdafx.h"

     

    BOOL APIENTRY DllMain( HMODULE hModule,

                           DWORD  ul_reason_for_call,

                           LPVOID lpReserved

                         )

    {

        switch (ul_reason_for_call)

        {

        case DLL_PROCESS_ATTACH:

        case DLL_THREAD_ATTACH:

        case DLL_THREAD_DETACH:

        case DLL_PROCESS_DETACH:

            break;

        }

        return TRUE;

    }

    通常在导出函数的声明时需要有_declspec(dllexport)关键字:

    DynamicMath.h头文件

    #pragma once

    class DynamicMath

    {

    public:

        __declspec(dllexport) DynamicMath(void);

        __declspec(dllexport) ~DynamicMath(void);

     

        static __declspec(dllexportdouble add(double a, double b);//加法

        static __declspec(dllexportdouble sub(double a, double b);//减法

        static __declspec(dllexportdouble mul(double a, double b);//乘法

        static __declspec(dllexportdouble div(double a, double b);//除法

     

        __declspec(dllexportvoid print();

    };

    生成动态库需要设置工程属性,打开工程属性面板è配置属性è常规,配置类型选择动态库。

    图:v动态库项目属性设置

    Build项目即可生成动态库。

    使用动态库

    创建win32控制台测试程序:

    TestDynamicLibrary.cpp测试程序

    #include "stdafx.h"

    #include "DynamicMath.h"

     

    #include 

    using namespace std;

     

    int _tmain(int argc_TCHARargv[])

    {

        double a = 10;

        double b = 2;

     

        cout << "a + b = " << DynamicMath::add(a, b) << endl;

        cout << "a - b = " << DynamicMath::sub(a, b) << endl;

        cout << "a * b = " << DynamicMath::mul(a, b) << endl;

        cout << "a / b = " << DynamicMath::div(a, b) << endl;

     

        DynamicMath dyn;

        dyn.print();

     

        system("pause");

        return 0;

    }

    方法一:

    l  工程属性面板è通用属性è “框架和引用è添加引用,将显示添加引用对话框。项目选项卡列出了当前解决方案中的各个项目以及可以引用的所有库。 项目选项卡中,选择 DynamicLibrary 单击确定

    l  添加DynamicMath.h 头文件目录,必须修改包含目录路径。打开工程属性面板è配置属性è “C/C++”è” 常规,在附加包含目录属性值中,键入DynamicMath.h 头文件所在目录的路径或浏览至该目录。

    编译运行OK

    图:动态库测试结果(vs

    方法二:

    l  属性面板è配置属性è “链接器è常规,附加依赖库目录中输入,动态库所在目录;

    l  属性面板è配置属性è “链接器è输入,附加依赖库中输入动态库编译出来的DynamicLibrary.lib

    这里可能大家有个疑问,动态库怎么还有一个DynamicLibrary.lib文件?即无论是静态链接库还是动态链接库,最后都有lib文件,那么两者区别是什么呢?其实,两个是完全不一样的东西。

    StaticLibrary.lib的大小为190KBDynamicLibrary.lib的大小为3KB,静态库对应的lib文件叫静态库,动态库对应的lib文件叫【导入库】。实际上静态库本身就包含了实际执行代码、符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。

    Windows下显式调用动态库

    应用程序必须进行函数调用以在运行时显式加载 DLL。为显式链接到 DLL,应用程序必须:

    l  调用 LoadLibrary(或相似的函数)以加载 DLL 和获取模块句柄。

    l  调用 GetProcAddress,以获取指向应用程序要调用的每个导出函数的函数指针。由于应用程序是通过指针调用 DLL 的函数,编译器不生成外部引用,故无需与导入库链接。

    l  使用完 DLL 后调用 FreeLibrary

    本文转自:http://www.cnblogs.com/skynet/p/3372855.html

    转载请注明原文地址: https://ju.6miu.com/read-35094.html

    最新回复(0)