c++中的__declspec(dllexport) 和 __declspec(dllimport)

c++中的__declspec(dllexport) 和 __declspec(dllimport)

1. __declspec(dllimport)

__declspec(dllimport) 是Microsoft Visual C++特有的修饰符,用于声明在动态链接库(DLL)中定义的函数和变量,以便在另一个模块中使用。它告诉编译器该函数或变量是从 DLL 中导入的,而不是在当前模块中定义的。

当你在一个项目中使用 DLL 时,你需要告诉编译器这些函数和变量是从 DLL 中导入的。这样,编译器就会在链接时查找相应的函数和变量的定义,并将其地址替换为导入的 DLL 中的地址。

举个例子,假设你有一个名为 MyDLL 的 DLL,其中有一个函数 void MyFunction()。在你的项目中使用这个 DLL 时,你需要在项目中使用 __declspec(dllimport) 来声明该函数,告诉编译器这个函数是从 DLL 中导入的,而不是在当前模块中定义的。示例代码如下:

// 声明从 DLL 中导入的函数
__declspec(dllimport) void MyFunction();int main() {// 使用从 DLL 中导入的函数MyFunction();return 0;
}

编译器将使用 __declspec(dllimport) 提示去查找 MyFunction() 的定义,并在链接时将其地址替换为 DLL 中的地址。

2. __declspec(dllexport)

__declspec(dllexport) 是Microsoft Visual C++特有的修饰符,用于声明在动态链接库(DLL)中定义的函数和变量,并指示编译器将它们导出,以便其他模块可以使用。

当你在一个 DLL 中定义函数和变量时,你需要告诉编译器这些函数和变量是从 DLL 中导出的,以便其他模块可以使用它们。__declspec(dllexport) 就是用于这个目的的。

举个例子,假设你有一个名为 MyDLL 的 DLL,其中有一个函数 void MyFunction()。你需要在 DLL 中使用 __declspec(dllexport) 来声明该函数,告诉编译器这个函数是从 DLL 中导出的,以便其他模块可以使用它。示例代码如下:

// 声明将在 DLL 中导出的函数
__declspec(dllexport) void MyFunction() {// 函数实现
}

使用 __declspec(dllexport) 修饰的函数和变量将在 DLL 中被标记为导出的符号,这样其他模块就可以通过导入这些符号来使用 DLL 中的函数和变量。

3. 区别

  1. __declspec(dllexport)

    • 用于在 DLL 中声明函数和变量,并指示编译器将它们导出,使得其他模块可以使用。
    • 在 DLL 中定义函数和变量时使用 __declspec(dllexport),告诉编译器这些函数和变量是从 DLL 中导出的,以便其他模块可以使用它们。
  2. __declspec(dllimport)

    • 用于在使用 DLL 的代码中声明函数和变量,告诉编译器它们是从 DLL 中导入的。
    • 在使用 DLL 的代码中使用 __declspec(dllimport),告诉编译器要从 DLL 中导入函数和变量,而不是在当前模块中定义的。

实例说明:

假设有一个名为 MyDLL 的 DLL,其中定义了一个函数 void MyFunction(),你想在另一个项目中使用这个 DLL。

DLL 中的代码:
// MyDLL.cpp// 声明将在 DLL 中导出的函数
__declspec(dllexport) void MyFunction() {// 函数实现
}
使用 DLL 的代码:
// MyApplication.cpp// 声明将从 DLL 中导入的函数
__declspec(dllimport) void MyFunction();int main() {// 调用从 DLL 中导入的函数MyFunction();return 0;
}

在这个示例中,MyDLL.cpp 中的 MyFunction() 函数被标记为 __declspec(dllexport),表示它是在 DLL 中定义的并且导出的。而在 MyApplication.cpp 中,我们使用 __declspec(dllimport) 来声明 MyFunction() 函数,告诉编译器它是从 DLL 中导入的,而不是在当前模块中定义的。这样,编译器在链接时将会查找并正确处理 MyFunction() 函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/4599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

水稻病害检测(YOLO数据集,多分类,稻瘟病、纹枯病、褐斑病、枯心病、霜霉病、水稻细菌性条纹斑病、稻苞虫)

是自己利用LabelImg工具进行手工标注,数据集制作不易,请尊重版权(稻瘟病、纹枯病、褐斑病、枯心病、霜霉病、水稻细菌性条纹斑病、稻苞虫) 如果需要yolv8检测模型和数据集放在一起的压缩包,可以关注:最新最…

IO流体系

一.分类 1.字节流 (1).InputStream(字节输入流) 定义:操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中 书写步骤:1.创建字节输入流对象,2.读数据,3.释放…

聊聊Flink:Docker搭建Flink

一、准备工作 查看下Docker和Docker Compose版本,确保你安装了这些软件。 在 Flink 官网上下载 Flink 的 Docker 镜像。您可以使用以下命令从 Docker Hub 中下载: docker pull flink:1.18.0-scala_2.12 此命令将下载 Flink 1.18.0 版本的 Docker 镜像…

Java23种设计模式-创建型模式之单例模式

单例模式(Singleton Pattern):通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例,如:仅线程上下文内使用同一个实例),该类负责创…

电商架构:系统设计+表设计

如有不对,请指正 欢迎评论区交流 需要哪些系统 商品系统、订单系统、权限系统、审核系统等。 商品系统 订单系统 审核系统 权限系统 参考 基于电商中台架构-商品系统设计(一) 附件

2024年【流动式起重机司机】报名考试及流动式起重机司机复审模拟考试

题库来源:安全生产模拟考试一点通公众号小程序 2024年【流动式起重机司机】报名考试及流动式起重机司机复审模拟考试,包含流动式起重机司机报名考试答案和解析及流动式起重机司机复审模拟考试练习。安全生产模拟考试一点通结合国家流动式起重机司机考试…

电脑已经有了一个Windows10,再多装一个Windows10组成双系统

前言 前段时间已经讲过一次双Windows系统的安装教程,但是小白重新去看了一下,发现写的内容太多,怕小伙伴看了之后一脸萌。 所以今天咱们就重新再来讲讲:在同一台机器上安装Windows10双系统的教程。 注意哦!这里的Wi…

Android优化RecyclerView图片展示:Glide成堆加载批量Bitmap在RecyclerView成片绘制Canvas,Kotlin(b)

Android优化RecyclerView图片展示:Glide成堆加载批量Bitmap在RecyclerView成片绘制Canvas,Kotlin(b) 对 Android GridLayoutManager Glide批量加载Bitmap绘制Canvas画在RecyclerView,Kotlin(a)-…

2024人工智能/机器学习/machine learning/CV/NLP重点公式汇总(算法面试考试论文)

### CV # Diffusion Model 扩散模型http://deepnlp.org/equation/diffusion-model-forward-processhttp://deepnlp.org/equation/diffusion-model-forward-process-reparameterizationhttp://deepnlp.org/equation/diffusion-model-reverse-processhttp://deepnlp.org/equation…

【GitHub】主页简历优化

【github主页】优化简历 写在最前面一、新建秘密仓库二、插件卡片配置1、仓库状态统计2、Most used languages(GitHub 常用语言统计)使用细则 3、Visitor Badge(GitHub 访客徽章)4、社交统计5、打字特效6、省略展示小猫 &#x1f…

求解约瑟夫问题

思路: 我们要创建两个指针 有一个指针pcur指向头结点,该pcur作为报数的指针,还有一个指针ptail指向尾结点,作为记录pcur的地址 每报数为m时,pcur指向下一个元素的地址,ptail销毁报数为m的地址&#xff0…

制糖工业智能工厂数字孪生可视化平台,推进制糖产业数字化转型

制糖工业智能工厂数字孪生可视化平台,推进制糖产业数字化转型。随着信息技术的快速发展,数字化转型已成为各行各业的重要趋势。在糖果加工制造领域,智能工厂数字孪生可视化平台的出现,为行业数字化转型注入了新的活力。 糖果加工制…

Java创建对象的最佳方式:单例模式(Singleton)

前言 单例模式是java中最简单的设计模式之一,属于创建式模式,提供了一种创建对象的最佳方式。 具体而言,单例模式涉及到一个具体的类,这个类可以确保只有单个对象被创建。它包含一个访问其唯一对象的方法,供外部直接…

算法训练营day25

零、回溯算法理论 参考链接13.1 回溯算法 - Hello 算法 (hello-algo.com) 1.尝试与回退 之所以称之为回溯算法,是因为该算法在搜索解空间时会采用“尝试”与“回退”的策略。当算法在搜索过程中遇到某个状态无法继续前进或无法得到满足条件的解时,它会…

python应用-socket网络编程(1)

目录 1 先简单回顾下客户端和服务端通信的知识 2 服务端常用函数 3 客户端常用函数 4 服务端和客户端都用的函数 5 示例介绍客户端和服务端通信过程 6 建立服务端套接制 7 创建服务端函数socket.create_server() 8 创建客户端套接字 9 客户端连接函数socket.create_co…

【.net core】【sqlsugar】条件查询时使用Contains的注意问题

在使用sqlsugar条件查询时,条件中如果使用Contains,如果需要自定义条件,需保证类型一致 目标需求:生成 WHERE ([1],[2],[3] like concat(%, concat( concat( [, CAST(orderState AS CHAR)) , ]) ,%)) 为条件的查询语句 //…

在docker中安装paddle serving @FreeBSD(待续)

因为FreeBSD本身不能装paddle serving,所以我们要在docker里面装。 Paddle Serving官网:GitHub - PaddlePaddle/Serving: A flexible, high-performance carrier for machine learning models(『飞桨』服务化部署框架) wheel包下…

JS-事件和日期对象

1.事件流: 1.事件捕获(同类型事件时):从外层到内层;从最顶级的父元素一级一级往下找子元素触发同名事件,直到触发事件的元素为止 事件捕获,只能通过addEventListener并且参数写true才是事件捕获…

基于Springboot的甘肃旅游服务平台(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的甘肃旅游服务平台(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构…

学习周报:文献阅读+Fluent案例+有限体积法理论学习

目录 摘要 Abstract 文献阅读:基于物理信息神经网络的稀疏数据油藏模拟 文献摘要 文章讨论|结论 各方程和原理简介 PINN简介 域分解 实验设置 单相油藏问题 油水两相问题 Fluent实例:Y型弯管中的流体混合分析 几何建模部分 网格划分 求解器设…