MFC(C++)中 __declspec(dllexport) 和 __declspec(dllimport)的作用

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

从static变量导出问题解析 __declspec(dllexport) 和 __declspec(dllimport)的作用

     这段时间要把tinyxml从静态库弄成动态库,要用到__declspec(dllexport)和__declspec(dllimport)来导出dll和lib文件。终于弄明白了export和import的作用,下面从使用的角度来说明一下他们的功能。

  首先要知道,头文件是C++的接口文件,不仅本工程需要使用头文件来进行编译,给其他工程提供dll的时候也要提供此dll的头文件才能让其他人通过编程的方式来使用dll。记住:头文件要给自己用还要给别人用。

  比如一个项目中的Class中含有一个静态变量,生成dll的时候只采用了__declspec(dllexport) 如下:

dll工程

A1.h:

  #define OS_API_EXPORT __declspec(dllexport)

  class OS_API_EXPORT A {static int a;}


A.cpp:

  #include “A.h”

  static A::a=0; //静态变量的初始化要写在cpp文件中

  这样做的时候编译dll工程的时候没有问题,但是如果把dll和头文件提供给别人使用的时候就会出“unsloved symbol a”的问题。

  原因是静态成员如果不import,是不能够被编译器从lib文件里找到的。

  使用dll的工程在编译时也会将dll相关的头文件列入编译对象,而不会理会dll的cpp文件中的初始化过程,因此会出现a没有定义的情况,这时

__declspec(dllimport)就派上用场了,他会告诉使用dll的工程去lib中找到这个静态变量的定义。提供给别人使用的dll头文件应当写成:
A2.h:

  #define OS_API_IMPORT __declspec(dllimport)

  class OS_API_IMPORT A {static int a;}

   当使用A.dll的工程链接上A2.h后,就不会出现“unsloved symbol a”的问题了。

最终为了方便程序的开发,不用分别写出dll工程的头文件和使用dll工程的头文件,头文件可以写为如下形式:

A.h

    #define OS_API_IMPORT __declspec(dllimport)
      #define OS_API_EXPORT __declspec(dllexport)

      #ifdef BUILD_DLL
      #define OS_API OS_API_EXPORT //如果是生成dll工程,那么导出
      #else
      #define OS_API OS_API_IMPORT //如果是生成使用dll的工程,那么导入
      #endif 

      class OS_API A{static int a;}

          同时别忘了在dll工程属性下设置预处理器定义BUILD_DLL

    参考7楼回复 http://topic.csdn.net/u/20070522/10/a6dff1ea-262f-4878-879f-61f36b74ec8b.html

以上部分转自:https://www.cnblogs.com/darknightsnow/archive/2012/09/25/2701389.html 

分析得很到位,感谢!

下面说明一下“在dll工程属性下设置预处理器定义BUILD_DLL”:

具体的设置是在项目上面点击右键,打开属性页,如图所示,找到预处理器定义,进行设置。

 

C#调用MFC DLL时EntryPointNotFoundException的排查与解决 在Windows平台软件开发中,跨语言调用是常见的集成需求,其中C#通过P/Invoke技术调用C++编写的MFC动态库尤为典型。其核心原理涉及函数符号查找机制,即C#运行时根据指定名称在DLL导出表中匹配对应的入口地址。这一过程的关键在于确保两端的函数签名完全一致,包括函数名称、调用约定参数类型。技术价值在于能够复用成熟的非托管代码模块,提升系统性能,尤其在图形处理、硬件交互等场景。然而,实践中常因C++的名称修饰、调用约定不匹配或平台位数不一致等问题,导致出现EntryPointNotFoundExc 阅读详情

相关推荐

Windows平台下C++动态库的__declspec(dllexport)__declspec(dllimport)作用

是Windows平台下用来导出导入函数、变量类的关键字。它们的正确使用可以确保动态链接库的正确运行,并且可以避免因为符号未导出或导入不正确而引起的链接错误。在编写动态链接库时,我们需要使用将需要导出的符号标记出来;在使用动态链接库的程序中,我们需要使用来声明从外部DLL文件中导入的符号。这样可以确保动态链接库的正确使用,提高代码的可移植性可维护性。

h a 6 6 6 c k 为 你解决复杂难题! 1338

__declspec(dllexport)是什么

__declspec是Microsoft VC中专用的关键字,它配合着一些属性可以对标准C/C++进行扩充。__declspec关键字应该出现在声明的前面。 他们都是DLL内的关键字,即导出与导入。他们是将DLL内部的类与函数以及数据导出与导入时使用的。 dllexport是在这些类、函数以及数据的申明的时候使用。用他表明这些东西可以被外部函数使用,即(dllexport)是把 DLL中的相关代码(类,函数,数据)暴露出来为其他应用程序使用。使用了(dllexport)关键字,相当于声明了紧接在(dll

nb_zsy的博客 1万+

关于__declspec(dllimport)的理解

一、基本概念 _declspec(dllexport)与_declspec(dllimport)都是DLL内的关键字,即导出与导入。他们是将DLL内部的类与函数以及数据导出与导入时使用的。 主要区别在于:dllexport是在这些类、函数以 及数据的申明的时候使用。用过表明这些东西可以被外部函数使用,即(dllexport)是把DLL中的相关代码(类,函数,数据)暴露出来为其他应用程 序使用。而 dllimport关键字是在外部程序需要使用DLL内相关内容时使用的关键字。 二、初步理解 考虑下面的需求,

IT界的小菜比 1万+

总结一下__declspec(dllimport)作用

作者:朱金灿来源:http://blog.csdn.net/clever101/      是时候总结一下__declspec(dllimport)作用了。可能有人会问:__declspec(dllimport)__declspec(dllexport)是一对的,在动态链接库中__declspec(dllexport)管导出,__declspec(dl

clever101的专栏 2万+

【C语言笔记】dll库“__declspec”属性关键字总结,dllexportdllimport

_declspec 是在 Windows 平台上用于控制导出导入符号的属性关键字,在 C/C++ 中经常用于 DLL 开发。__declspec(dllexport) __declspec(dllimport) 是其常见用法,用于在编写 DLL 时标记函数或变量的可见性。在编写 DLL 时用于标记函数或变量,表示它们应该被导出,以便其他模块可以访问。用于将函数或变量从 DLL 中导出,使其可供外部使用。在函数或变量声明之前使用,告诉编译器将其放入导出表中。

专注音频,高效工作,快乐生活! 3576

(一)C++学习之__declspec(dllimport)、__declspec(dllexport)__stdcall、__cdecl

1、__declspec(dllimport)、__declspec(dllexport) __declspec(dllexport)与__declspec(dllimport)都是DLL内的关键字,即导出与导入。他们是将DLL内部的类与函数以及数据导出与导入时使用的。dllexport是在这些类、函数以及数据的申明的时候使用。用他表明这些东西可以被外部函数使用,即(dllexport)是把 D...

qq_34706266的博客 1591

__declspec(dllimport)作用

是时候总结一下__declspec(dllimport)作用了。可能有人会问:__declspec(dllimport)__declspec(dllexport)是一对的,在动态链接库中__declspec(dllexport)管导出,__declspec(dllimport)管导出,就像一个国家一样,有出口也有进口,有什么难理解的呢?这是一种很自然的思路,开始我也是这样理解。

二斗墨汁 829

dllimport dllexport

DLL可以使用两种方法将公共符号导入到应用程序中或从 DLL 导出函数:  生成 DLL 时使用模块定义 (.DEF) 文件。  在主应用程序的函数定义中使用 __declspec(dllimport) 或 __declspec(dllexport) 关键字。  使用 .DEF 文件 模块定义 (.DEF) 文件是包含一个或多个描述各种 DLL 属性的 Module 语句的文本文件。如果不

ZhengMingToH的专栏 890

C++中 extern "C"__declspec(dllimport)

使用MFC提供的修饰符号_declspec(dllexport)在要输出的函数、类、数据的声明前加上_declspec(dllexport)的修饰符,表示输出。__declspec(dllexport)在C调用约定、C编译情况下可以去掉输出函数名的下划线前缀。extern"C"使得在C++中使用C编译方式成为可能。在“C++”下定义“C”函数,需要加extern“C”关键词。用ext...

weixin_30826095的博客 1727

【DLL的函数】关于DLL的函数|_declspec(dllimport)

目录 关于DLL的函数 _declspec(dllimport) 关于DLL的函数 2012-09-24 21:26:53 动态链接库中定义有两种函数:导出函数(export function)内部函数(internal function)。导出函数可以被其它模块调用,内部函数在定义它们的DLL程序内部使用。输出函数的方法...

小鱼菜鸟的博客 807

__declspec(dllimport)__declspec(dllexport)的区别,以及有关c/c++调用约定

 DLL可以使用两种方法将公共符号导入到应用程序中或从 DLL 导出函数:  生成 DLL 时使用模块定义 (.DEF) 文件。 在主应用程序的函数定义中使用 __declspec(dllimport) 或 __declspec(dllexport) 关键字。 使用 .DEF 文件模块定义 (.DEF) 文件是包含一个或多个描述各种 DLL 属性的 Module 语句的文本文件。如果不使用 _

yysdsyl的专栏 1万+

导出函数__declspec(dllexport)

关于DLL的函数:  动态链接库中定义有两种函数:导出函数(export   function)内部函数(internal   function)。  导出函数可以被其它模块调用,内部函数在定义它们的DLL程序内部使用。  输出函数的方法有以下几种:  1、传统的方法  在模块定义文件的EXPORT部分指定要输入的函数或者变量。语法格式如下:  entryname[=intern

wonder 1万+

VS下 dllimportdllexport作用与区别

  我相信写WIN32程序的人,做过DLL,都会很清楚__declspec(dllexport)作用,它就是为了省掉在DEF文件中手工定义导出哪些函数的一个方法。当然,如果你的DLL里全是C++的类的话,你无法在DEF里指定导出的函数,只能用__declspec(dllexport)导出类。但是,MSDN文档里面,对于__declspec(dllimport)的说明让人感觉有点奇怪,先来看看M...

weixin_34161064的博客 141

()__declspec(dllimport)__declspec(dllexport)的区别,以及有关c/c++调用约定

DLL可以使用两种方法将公共符号导入到应用程序中或从DLL导出函数: 生成DLL时使用模块定义(.DEF)文件。在主应用程序的函数定义中使用__declspec(dllimport)或__declspec(dllexport)关键字。使用.DEF文件模块定义(.DEF)文件是包含一个或多个描述各种DLL属性的Module语句的文本文件。如果不使用__...

weixin_30415113的博客 87
上一篇: QT creator 调试箭头消失、QT 调试指针消失 、调试指针卡住 不见了
下一篇: MFC中 CWinApp和CWinAppEx 的区别
acoolgiser
博客等级 码龄10年 179粉丝 146原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值