• 本站会放置Google广告用于维持域名以及网站服务器费用。

  • 在本站开通年度VIP,无限制下载本站资源和阅读本站文章

  • 如果觉得本站的内容有帮助,可以考虑打赏博主哦!

  • 工资「喂饱肚子」,副业「养活灵魂」!

  • 计算机图形学与计算几何经典必备书单整理,下载链接可参考:https://www.stubbornhuang.com/1256/

  • 欢迎大家交换友链,可在https://www.stubbornhuang.com/申请友情链接进行友链交换申请!

  • 感谢大家访问本站,希望本站的内容可以帮助到大家!

  • 本站由于前段时间遭受到大量临时和国外邮箱注册,所以对可注册的邮箱类型进行了限制!

  • 问题反馈可发送邮件到stubbornhuang@qq.com

C++ – 导出接口函数和导出C++类

C++ 发布于2023-02-03 阅读 5,842次 0次评论 0次点赞 本文共2277个字,阅读需要6分钟。

C++实际的项目开发过程中,经常需要将核心功能打包成动态链接库(Dynamic Link Library)供第三方调用,在dll中我们可以不仅可以导出接口函数还可以导出C++类。

下面以简单的示例代码说明如何在C++导出接口函数和类。

1 C++中导出接口函数和导出C++类

1.1 C++动态链接库中的导出代码

在C++的动态链接库中,__declspec(dllexport)用于导出dll中的成员,而__declspec(dllimport)用于导入外部dll中的成员。

所以如果需要导出接口函数和类,需要在dll的代码中预先定义__declspec(dllexport),并将__declspec(dllexport)放在需要导出的接口函数和类之前。

在linux系统中,__declspec(dllexport)不可用,具有相同功能的是__attribute__((visibility ("default")))

1.2 跨平台导出宏的写法

由于Windows和Linux系统的导出代码的不一致性,我们需要对上述的接口进行跨平台封装,示例代码如下

#define EXPORT

/* 定义动态链接库dll的导出 */
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)

#ifdef EXPORT
#define EXPORT_API __declspec(dllexport)
#else 
#define EXPORT_API __declspec(dllimport)
#endif

#elif defined(linux) || defined(__linux)

#include <stdlib.h>

#ifdef EXPORT
#define EXPORT_API __attribute__((visibility ("default")))
#else
#endif

#endif

仔细查看上述代码,我们使用EXPORT_API作为统一的导出宏。

1.3 导出接口函数

我们可以使用1.2节中的导出宏EXPORT_API来导出接口函数,这里以简单的加法函数为例

export_function.h

#ifndef EXPORT_FUNCTION_H_
#define EXPORT_FUNCTION_H_

#define EXPORT

/* 定义动态链接库dll的导出 */
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)

#ifdef EXPORT
#define EXPORT_API __declspec(dllexport)
#else 
#define EXPORT_API __declspec(dllimport)
#endif

#elif defined(linux) || defined(__linux)

#include <stdlib.h>

#ifdef EXPORT
#define EXPORT_API __attribute__((visibility ("default")))
#else
#endif

#endif

#ifdef __cplusplus
extern "C" {
#endif 

#ifndef EXPORT_API
#define EXPORT_API
#endif

    EXPORT_API int Add(int a, int b);

#ifdef __cplusplus
}
#endif 


#endif // !EXPORT_FUNCTION_H_

export_function.cpp

#include "export_function.h"

EXPORT_API int Add(int a, int b)
{
    return a + b;
}

1.4 导出C++类

我们可以使用1.2节中的导出宏EXPORT_API来导出C++类,下面看一个简单的示例

export_class.h

#ifndef _EXPORT_CLASS_H_
#define _EXPORT_CLASS_H_

#define EXPORT

/* 定义动态链接库dll的导出 */
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)

#ifdef EXPORT
#define EXPORT_API __declspec(dllexport)
#else 
#define EXPORT_API __declspec(dllimport)
#endif

#elif defined(linux) || defined(__linux)

#include <stdlib.h>

#ifdef EXPORT
#define EXPORT_API __attribute__((visibility ("default")))
#else
#endif

#endif

class EXPORT_API Example
{
public:
    Example();
    Example(int a, int b);

public:
    int GetAddResult();

public:
    int m_A;
    int m_B;
};


#endif // !_EXPORT_CLASS_H_

export_class.cpp

#include "export_class.h"

Example::Example()
    :m_A(0),
    m_B(0)
{
}

Example::Example(int a, int b)
    :m_A(a),
    m_B(b)
{
}

int Example::GetAddResult()
{
    return m_A + m_B;
}

欢迎扫码关注我的微信公众号,及时获取文章更新

微信公众号二维码

本文作者:StubbornHuang

版权声明:本文为站长原创文章,如果转载请注明原文链接!

原文标题:C++ – 导出接口函数和导出C++类

原文链接:https://www.stubbornhuang.com/2497/

发布于:2023年02月03日 11:21:05

修改于:2023年06月21日 17:12:28

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

文章末尾
上一篇
Windows - OneDrive登录出现0x8019001错误
其他
下一篇
网站推荐 - 注册chatGPT无法接收验证短信?使用便宜好用的sms-activate
工具软件网站
当前分类随机文章推荐

发表评论

您必须 [ 登录 ] 才能发表留言!

关注我们的公众号

微信公众号