动态库生成关键字

dllemport和dllimport的区别

原文链接:https://blog.csdn.net/lengyuezuixue/article/details/80092108

当你生成dll的时候,你的代码相当于被封起来了,别人想要使用你的某些函数接口,就得知道这个接口在你的代码块的位置所在,这时候,在类定义时加上__declspec(dllimport/dllemport)就起作用了。请注意,禁止在可导出类的成员上显式使用 dllimport 和 dllexport 属性。

dllemport:导出,省掉在DEF文件中手工定义导出哪些函数的一个方法。
声明类dllexport时,将导出其所有成员函数和静态数据成员。当然,如果你的DLL里全是C++的类的话,你无法在DEF里指定导出的函数,只能用__declspec(dllexport)导出类。

dllimport:导入,使编译器可以生成更好的代码。
声明类dllimport时,将导入其所有成员函数和静态数据成员。不使用 __declspec(dllimport) 也能正确编译代码,但使用 __declspec(dllimport) 使编译器可以生成更好的代码,更好地处理静态成员变量。编译器之所以能够生成更好的代码,是因为它可以确定函数是否存在于 DLL 中,这使得编译器可以生成跳过间接寻址级别的代码,而这些代码通常会出现在跨 DLL 边界的函数调用中。但是,必须使用 __declspec(dllimport) 才能导入 DLL 中使用的静态变量。如果没有静态成员变量,那么这个__declspec(dllimport)无所谓。

两者区别:
dllexport是在这些类、函数以及数据的申明的时候使用。用过表明这些东西可以被外部函数使用,即dllexport是把DLL中的相关代码(类,函数,数据)暴露出来为其他应用程序使用。使用了dllexport关键字,相当于声明了紧接在dllexport关键字后面的相关内容是可以为其他程序使用的。
dllimport是在外部程序需要使用DLL内相关内容时使用的关键字。当一个外部程序要使用DLL内部代码(类,函数,全局变量)时,只需要在 程序内部使用dllimport关键字声明需要使用的代码就可以了,即dllimport关键字是在外部程序需要使用DLL内部相关内容的时候才使用。dllimport作用是把DLL中的相关代码插入到应用程序中。
总结就是,dll内部表明dllemport,外部函数表明dllimport才能隐式链接到该dll里的导出函数。

注意:

  • 选择性成员导入/导出最适用于提供限制性更强的导出类接口的版本; 也就是说,您可以设计一个DLL,该DLL暴露的公共和私有功能比该语言允许的更少。它对于微调可导出接口也很有用:当您知道调用者(根据定义)无法访问某些私有数据时,您无需导出整个类。
  • 如果在类中导出一个虚函数,则必须导出所有虚函数,或者至少提供调用者可以直接使用的版本。
  • 如果有一个使用虚拟函数选择性成员导入/导出的类,则这些函数必须位于可导出接口中或内联定义(对客户端可见)。
    -如果将成员定义为dllexport但未将其包含在类定义中,则会生成编译器错误。您必须在类标头中定义该成员。
  • 虽然允许将类成员定义为dllimport或dllexport,但是不能覆盖类定义中指定的接口。
  • 如果在声明它的类定义主体之外的位置定义成员函数,则在函数定义为dllexport或dllimport时生成警告(如果此定义与类声明中指定的定义不同)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值