opencv CV_EXPORTS含义

在刚开始阅读opencv 源码时,经常会遇到结构体、类后面跟着一个CV_EXPORTS。如
在这里插入图片描述

在跟踪到它的定义后了解到它的含义:

在这里插入图片描述
在编译过程中,根据你的平台选择对应的宏定义
windows平台下为

__declspec(dllexport)

linux平台下为

__attribute__ ((visibility ("default")))

都是用于控制动态库的导出符号。windows平台下的.dll库文件,Linux下的.so文件,这些动态库中都有很多的函数,有些函数需要被库外调用,也就是我们说的 接口 ,但动态库中不是所有的函数、类、变量、模板都需要被库外调用的,一个动态库的导出列表越少,动态库加载和识别的符号越少,程序启动和运行的速度就越快,导出所有的符号通常会导致程序变慢,并占用大量内存。

我们通常希望动态库只需要给出需要被外部调用的接口就可以了,编译器怎么判断这个函数、类、变量、模板需要被外部调用呢?这个时候就出现了这个标识属性。.dll文件中是__declspec(dllexport)。.so文件中是__attribute__ ((visibility (“default”)))。

在Linux下动态库(.so)中,通过GCC的C++ visibility属性可以控制共享文件导出符号。在GCC 4.0及以上版本中,有个visibility属性,可见属性可以应用到函数、变量、模板以及C++类。

“default”:用它定义的符号将被导出,动态库中的函数默认是可见的。”hidden”:用它定义的符号将不被导出,并且不能从其它对象进行使用,动态库中的函数是被隐藏的。default意味着该方法对其它模块是可见的。而hidden表示该方法符号不会被放到动态符号表里,所以其它模块(可执行文件或者动态库)不可以通过符号表访问该方法。

要定义GNU属性,需要包含__attribute__和用括号括住的内容。可以将符号的可见性指定为visibility(“hidden”),这将不允许它们在库中被导出,但是可以在源文件之间共享。实际上,隐藏的符号将不会出现在动态符号表中,但是还被留在符号表中用于静态链接。

导出列表由编译器在创建共享库的时候自动生成,也可以由开发人员手工编写。导出列表的原理是显式地告诉编译器可以通过外部文件从对象文件导出的符号是哪些。GNU用户将此类外部文件称作为”导出映射”。

参考资源:
https://blog.csdn.net/fengbingchun/article/details/78898623

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值