我是靠谱客的博主 奋斗柠檬,最近开发中收集的这篇文章主要介绍__attribute__((visibility("")))__attribute__((visibility("default"))),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Table of Contents

__attribute__((visibility("default")))

1. 当-fvisibility=hidden时

2. 当-fvisibility=default时


// Generic helper definitions for shared library support
#if defined _WIN32 || defined __CYGWIN__
  #define SRSLTE_IMPORT __declspec(dllimport)
  #define SRSLTE_EXPORT __declspec(dllexport)
  #define SRSLTE_LOCAL
#else
  #if __GNUC__ >= 4
    #define SRSLTE_IMPORT __attribute__ ((visibility ("default")))
    #define SRSLTE_EXPORT __attribute__ ((visibility ("default")))
  #else
    #define SRSLTE_IMPORT
    #define SRSLTE_EXPORT
    #define SRSLTE_LOCAL
  #endif
#endif

__attribute__((visibility("default")))

可以看到OBJC_VISIBLE 的定义方式是 __attribute__((visibility("default"))).

那么究竟有什么作用呢? 下面举例说明.

GCC 有个visibility属性, 该属性是说, 启用这个属性:

1. 当-fvisibility=hidden时

动态库中的函数默认是被隐藏的即 hidden. 除非显示声明为__attribute__((visibility("default"))).

2. 当-fvisibility=default时

 动态库中的函数默认是可见的.除非显示声明为__attribute__((visibility("hidden"))).

特别说明: 这个特性是 GCC4.0 以后才有的.

基于GCC系列: 加载静态链接库的例子, 谈谈 visibility.

Car.c

#include<stdio.h>  
#include<stdlib.h> 
 
__attribute ((visibility("default"))) int drive()
{
    printf("Car driving...n");
 
    return 0;
}
 
void stop()
{
    printf("Car stop.n");
}

注意: attribute 的定义和使用方法.
使用 visibility 属性来编译动态链接库.

g++-4.9 -shared -o libCar.so -fvisibility=hidden Car.c
这样一来, drive 方法是可见的, 但是 stop 是不可见的.

作者:veryitman 
来源:CSDN 
原文:https://blog.csdn.net/veryitman/article/details/46756683 
版权声明:本文为博主原创文章,转载请附上博文链接!


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

限制符号可见性的原因:从动态库中尽可能少地输出符号是一个好的实践经验。输出一个受限制的符号会提高程序的模块性,并隐藏实现的细节。动态库装载和识别的符号越少,程序启动和运行的速度就越快。导出所有符号会减慢程序速度,并耗用大量内存。

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

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

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

作者:fengbingchun 
来源:CSDN 
原文:https://blog.csdn.net/fengbingchun/article/details/78898623 
版权声明:本文为博主原创文章,转载请附上博文链接!

 

最后

以上就是奋斗柠檬为你收集整理的__attribute__((visibility("")))__attribute__((visibility("default")))的全部内容,希望文章能够帮你解决__attribute__((visibility("")))__attribute__((visibility("default")))所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部