DLL的生成、编写、调用总结

本文详细介绍了如何在Visual Studio 2022中创建DLL,包括创建过程、解决缺少.lib和.exp文件的方法、DLL内容的编写以及如何在另一个项目中调用DLL。通过定义和使用预处理器宏实现导出和导入功能,并展示了DLL调用的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. DLL的创建

1. 创建环境

VS2022(注:其他VS大同小异)

2. 创建过程

新建My_Dll项目
在这里插入图片描述
点击确定 —>下一步—>输入DLL工程的名称My_Dll—>创建。
3. 创建可能碰到的问题

点击完成后编辑DLL工程,之后编译,发现Debug文件下没有.lib和.exp文件

解决方法:
​ 右键工程头文件->添加->新建项->模块定义文件(.def)->输入任意名称->添加,之后重新编译就可以了。
在这里插入图片描述
原因:
​ 没有给工程添加def链接。vs一般会自动给工程添加def链接,如果没自动添加,就手动添加即可。添加方法:项目属性->链接器->输入->模块定义文件->在里面添上*.def

4. 创建成功的标志

打开程序所在文件路径的Debug下可看到如下图所示的五个文件
在这里插入图片描述

二. DLL内容编写

头文件:test.h

#pragma once
#include <iostream>
//! 其他头文件
...

#ifdef  MYDLL_EXPORTS
#define DLL_TEST_API__declspec(dllexport)
#else
#define DLL_TEST_API__declspec(dllimport)
#endif

//! 导出函数声明
DLL_TEST_API void test();

//! 导出类声明
class DLL_TEST_API CMyTest
{
public:
    void function();
   ...... //<成员方法
private:
   ...... //<成员变量
};

源文件:test.cpp

#include"test.h"

//! 函数定义
DLL_TEST_API void test()
{
  //! ...具体实现...
  std::cout << "函数调用" << std::endl;
}

//! 类定义
void CMyTest::function()
{
  //! ...具体实现...
  std::cout << "类方法调用" << std::endl;
}

三. DLL调用

  1. 在此解决方案下添加—>新建项,添加新的TEST_DLL工程。

  2. 右键TEST_DLL工程—>属性—>C/C++
    在这里插入图片描述

  3. 右键TEST_DLL工程—>属性—>链接器
    在这里插入图片描述

  4. 右键TEST_DLL工程—>属性—>链接器
    在这里插入图片描述

  5. TEST_DLL工程添加源文件main.cpp,然后编写相应的调用DLL逻辑即可。

    #include"test.h"
    
    int main()
    {
        test();
        
        CMyTest tmp;
        tmp.function();
        
        system("pause");
        return 0;
    }
    

    编译运行之后可看到DLL的调用效果,即可得到如下俩行打印:

    函数调用
    类方法调用
    

    注意:

    如果编译报错:error LNK2019: 无法解析的外部符号 ,则在main.cpp中添加代码#include"test.cpp"即可

    该报错原因:类模板的定义和声明都应该放在头文件中,因为如果放在源文件,无法将成员函数实例化

四.dll编写时宏的解释

如上文dll编写时的宏:

#ifdef  TEST_EXPORTS
#define DLL_TEST_API __declspec(dllexport)
#else
#define DLL_TEST_API __declspec(dllimport)
#endif

**TEST_EXPORTS:**在新建DLL工程时,编译器会在工程的 —> 属性 —> C/C++ —> 命令行 —> 所有选项,加入/D “TEST_EXPORTS”,这个名称根据dll的名称而改变。
在这里插入图片描述

目的是在该项目上下文定义一个名为“DLL_EXPORTS”的宏定义, 相当于在上述宏的前边加了

 #define TEST_EXPORTS

dllexport表示:符号DLL_TEST_API是从本DLL导出的符号(函数或类)

dllimport表示:符号DLL_TEST_API是从别的DLL导入的符号

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值