美文网首页
C++编写dll与调用

C++编写dll与调用

作者: 寽虎非虫003 | 来源:发表于2020-07-23 10:04 被阅读0次

    重要参考

    c++ dll编写与加载;
    C++编程笔记:dll的生成与使用;
    8.DLL导出C++类;

    在 Visual Studio 中创建 C/C++ DLL
    最主要的参考就是这个vs的官方文件。

    C#调用C++类(内含OpenCV代码);
    C#调用DLL库的方法
    c sharp调用Cpp DLL实战篇(使用opencv3库与qt库).md

    一、vs准备

    1、建立dll项目
    2、建立控制台项目

    二、文件

    2.1 头文件

    DllTest.h

    #pragma once
    #ifndef DLLTEST_H
    #define DLLTEST_H
    
    /**
     * 在dll项目中导出,在调用项目中导入.
     */
    #ifdef DLLTEST_EXPORTS
    #define DLLTEST_API __declspec(dllexport)
    #else
    #define DLLTEST_API __declspec(dllimport)
    #endif
    
    /**
     * 扩展为C编码.
     */
    #define EXTERN_C extern "C" 
    
    //整合两个编码
    #define EX_API EXTERN_C DLLTEST_API
    
    /**
     * 测试结构体的导出.
     */
    struct stA
    {
        int a;
        double b;
    
        stA():a(0),b(0.0){}
        stA(int n,double d):a(n),b(d){}
    };
    
    /**
     * 测试类的导出,注意这里没有拓展成C编码.
     */
    class DLLTEST_API Car
    {
    public:
        Car();
        ~Car();
    
        int getWheels();
    
    private:
        int m_nWheels;
        double m_height;
    };
    
    /**
     * 测试普通函数的导出,使用拓展为C编码.
     */
    EX_API int add(int a, int b);
    EX_API int sub(int a, int b);
    
    #endif // !DLLTEST_H
    
    
    

    2.2实现

    /*****************************************************************//**
     * \file   DllTest.cpp
     * \brief  具体的实现
     * 实现不需要使用导出宏
     * 
     * \author pc-1
     * \date   July 2020
     *********************************************************************/
    #include"pch.h"
    #include"DllTest.h"
    #include<iostream>
    
    using namespace std;
    
    Car::Car()
    {
        m_nWheels = 4;
        m_height = 1.5;
    }
    
    Car::~Car()
    {
    }
    
    int add(int a, int b)
    {
        cout << "called add(a,b)" << endl;
        return a + b;
    }
    
    int sub(int a, int b)
    {
        cout << "called sub(a,b)" << endl;
        return a - b;
    }
    
    int Car::getWheels()
    {
        cout << "call get Wheels" << endl;
        return m_nWheels;
    }
    

    三、调用

    3.1 创建调用项目

    在菜单栏上,选择“文件”>“新建”>“项目”,打开“创建新项目”对话框。
    [图片上传失败...(image-8df1f-1595469787799)]

    我创建的项目名称为CallTest

    3.2项目代码

    CallTest.cpp

    /*****************************************************************//**
     * \file   CallTest.cpp
     * \brief  测试调用生成的dll
     * 
     * \author pc-1
     * \date   July 2020
     *********************************************************************/
    #include <iostream>
    
    //包含所需dll中的头文件
    #include"DllTest.h"
    
    using namespace std;
    int main()
    {
        //测试单独的函数的调用
        int ad = add(1, 1);
        cout << ad << endl;
        int su = sub(3, 2);
        cout << su << endl;
    
        //分割线
        cout << "=======================" << endl;
    
        //测试结构体的调用,和正常包含头文件无异
        stA A(1, 3.0);
        cout << "A:" << A.a << ", " << A.b << endl;
    
        //测试类的调用,能够正常调用,暂时没有发现异常
        Car C;
        cout << C.getWheels() << endl;
    }
    

    3.3 调用项目的配置

    3.3.1包含目录或者附加目录

    在“属性”>“配置属性” > “C/C++” > “常规”>"附加目录"中添加:

    E:\Programing\DllTest\DllTest
    

    这个目录就是我的头文件所在的目录,也可以使用相对目录,或者你编译好的dll和头文件重新放的目录。

    3.3.2附加依赖项

    “属性”>“配置属性” > “链接器”>"输入" >"附加依赖项"中添加:

    DllTest.lib
    

    就是你对应的lib文件。

    3.3.3 附加库目录

    就是你的dll所放的地方。
    “属性”>“配置属性” > “链接器”>"常规" >"附加库目录"中添加:

    E:\Programing\DllTest\x64\Debug
    

    我为了省事就直接使用生成的目录了,只要对应,或者在项目生成文件的目标文件夹就好。

    3.3.4 启动项目和生成依赖项

    将控制台项目设置为启动项目,并且,被调用项目设置成调用项目的项目依赖项,换句话说,在控制台项目的项目依赖项设置中添加被调用的DllTest项目。

    4使用C#调用C++生成的dll

    等测试成功,写在下一篇

    相关文章

      网友评论

          本文标题:C++编写dll与调用

          本文链接:https://www.haomeiwen.com/subject/qnigkktx.html