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

一. DLL的创建

1. 创建环境

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

2. 创建过程

新建My_Dll项目
DLL的生成、编写、调用总结_第1张图片
点击确定 —>下一步—>输入DLL工程的名称My_Dll—>创建。
3. 创建可能碰到的问题

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

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

4. 创建成功的标志

打开程序所在文件路径的Debug下可看到如下图所示的五个文件
DLL的生成、编写、调用总结_第3张图片

二. DLL内容编写

头文件:test.h

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

#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++
    DLL的生成、编写、调用总结_第4张图片

  3. 右键TEST_DLL工程—>属性—>链接器
    DLL的生成、编写、调用总结_第5张图片

  4. 右键TEST_DLL工程—>属性—>链接器
    DLL的生成、编写、调用总结_第6张图片

  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的生成、编写、调用总结_第7张图片

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

 #define TEST_EXPORTS

dllexport:导出(函数或类)

dllimport:导入

你可能感兴趣的:(C++,c++,visual,studio,开发语言)