• C++动态库


    C++动态库

    动态库文件(Dynamic Link Library,DLL)是程序在运行时所需要调用的库。静态库文件是程序在编译时所需要调用的库。

    1 环境介绍

    VS版本:VS2017

    编程语言:C++

    2 功能介绍

    使用VS2017项目模板创建C++动态库生成工程,编写功能函数,并生成动态库;然后再创建一个C++工程调用动态库中的功能函数进行测试。

    3 创建动态库

    3.1 新建“具有导出项的(DLL)动态链接库”模板

    在“新建项目”窗口中,选择“Visual C++ -> Windows桌面 -> 具有导出项的(DLL)动态链接库”,并设置项目名称和位置。本示例的名称设为Dll_Library,存放在G:\C++\Practices中。
    在这里插入图片描述

    3.2 实现功能函数

    创建完成后,该项目下会自动生成一个示例模板:Dll_Library.hDll_Library.cpp。在.h文件中进行函数申明或类定义,在.cpp文件中进行实现。

    3.2.1 Dll_Library.h

    #ifdef DLLLIBRARY_EXPORTS
    #define DLLLIBRARY_API __declspec(dllexport)
    #else
    #define DLLLIBRARY_API __declspec(dllimport)
    #endif
    
    // 模板中自动提供的示例
    // 此类是从 dll 导出的
    class DLLLIBRARY_API CDllLibrary 
    {
    public:
    	CDllLibrary(void);
    	// TODO: 在此处添加方法。
    	static void Print();
    };
    
    extern DLLLIBRARY_API int nDllLibrary;
    extern DLLLIBRARY_API int fnDllLibrary(void);
    
    // 自己编写的功能函数
    extern DLLLIBRARY_API void Print(void);
    extern DLLLIBRARY_API int sum(int a, int b);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    3.2.2 Dll_Library.cpp

    // Dll_Library.cpp : 定义 DLL 的导出函数。
    
    #include "pch.h"
    #include "framework.h"
    #include "Dll_Library.h"
    #include 
    using namespace std;
    
    // 这是导出变量的一个示例
    DLLLIBRARY_API int nDllLibrary = 0;
    
    // 这是导出函数的一个示例。
    DLLLIBRARY_API int fnDllLibrary(void)
    {
    	cout << "调用fnDllLibrary成功" << endl;
    	 return 0;
    }
    
    // 这是已导出类的构造函数。
    DLLLIBRARY_API CDllLibrary::CDllLibrary()
    {
    	 return;
    }
    // 这是实现导出类中的成员函数
    DLLLIBRARY_API void CDllLibrary::Print()
    {
    	cout << "通过CDllLibrary进行Print" << endl;
    }
    
    // 实现自己定义的功能函数
    DLLLIBRARY_API void Print(void) 
    {
    	cout << "直接进行Print" << endl;
    }
    
    DLLLIBRARY_API int sum(int a, int b)
    {
    	int c = a + b;
    	return c;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    3.3 编译生成动态库

    右键点击项目,选择“生成”来编译生成动态库。
    在这里插入图片描述
    在这里插入图片描述

    3.4 调用动态库中功能函数

    在“新建项目”窗口中,选择“Visual C++ -> Windows桌面 -> 控制台应用”,并设置项目名称和位置。本示例的名称设为UseDLL,存放在G:\C++\Practices中。

    3.4.1 UseDLL.cpp

    #include "Dll_Library.h"
    #include 
    // 使用DLLLIBRARY.lib
    #pragma comment(lib, "DLLLIBRARY.lib")
    
    using namespace std;
    int main()
    {
    	int a = fnDllLibrary();
    	
    	 cout << "DLL中的变量nDllLibrary:" << nDllLibrary << endl;
    	
    	 CDllLibrary::Print();
    	 Print();
    	 int b = sum(12, 34);
    	 cout << "求和:" << b << endl;
    	 return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    3.4.2 链接.h头文件

    由于Dll_Library.h不在UseDLL项目目录中,会提示#include "Dll_Library.h"引用失败。

    3.4.2.1 复制Dll_Library.h到UseDLL项目目录中

    该方法虽然能够解决该问题,但是在后续修改Dll_Library项目后仍需要重新复制。

    3.4.2.2 在UseDLL中配置附加包含目录

    右键点击UseDLL项目,选择“属性”,在属性页窗口中:

    1. 将“配置”选择为“所有配置”,“平台”选择为“所有平台”;
    2. 在“配置属性 -> C/C++ -> 常规 -> 附加包含目录”中添加Dll\_Library.h所在目录的路径。
      在这里插入图片描述

    3.4.3 链接.lib文件

    在使用 #pragma comment(lib, "DLLLIBRARY.lib")时,默认和UseDLL的.cpp文件在同一文件夹下。将DLLLIBRARY.lib文件复制到UseDLL.cpp的同一文件夹下也能够解决问题,但后续修改时仍然需要复制。

    3.4.3.1 在UseDLL中配置附加库目录

    右键点击UseDLL项目,选择“属性”,在属性页窗口中:

    1. 在“配置属性 -> 链接器 -> 输入 -> 附加依赖项”中添加 DLLLIBRARY.lib。
      在这里插入图片描述

    3.4.4 链接.dll文件

    当调试运行程序时,会出现“找不到.dll文件”的错误,需要将dll文件拷贝到项目运行目录下,此示例下需要拷贝到G:\C++\Practices\UseDLL\Debug下,通常在程序发布时要这么做,但是在调试时不建议这么做,因为后续修改时需要重新拷贝复制。

    3.4.4.1 在UseDLL中配置调试环境

    右键点击UseDLL项目,选择“属性”,在属性页窗口中:

    1. 在“配置属性 -> 调试 -> 环境”中添加DLLLIBRARY.dll所在的目录路径。
      在这里插入图片描述

    3.5 运行结果

    在这里插入图片描述

  • 相关阅读:
    CLIP(Contrastive Language-Image Pretraining)
    港联证券:股票浮筹比例的指标怎么用?
    Flask 学习-63.Session 使用
    入行数字IC验证的一些建议
    HTML5 新元素
    对话ACE第五期:到底什么才是真正的HTAP?
    如何把JavaWeb项目部署到服务器
    移动电源外贸出口亚马逊UL2056测试报告周期
    什么是AI开源大模型宇宙?
    切记这三点 避免你的虾皮Shopee店铺被计分
  • 原文地址:https://blog.csdn.net/qq_33021529/article/details/134341842