美文网首页
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