在 objc-api.h 里面有很多关于__attribute__ 的定义.

例如

#if !defined(OBJC_VISIBLE)
# if TARGET_OS_WIN32
# if defined(BUILDING_OBJC)
# define OBJC_VISIBLE __declspec(dllexport)
# else
# define OBJC_VISIBLE __declspec(dllimport)
# endif
# else
# define OBJC_VISIBLE __attribute__((visibility("default")))
# endif
#endif

可以看到

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 ;
} void stop()
{
printf("Car stop.\n");
}

注意: attribute 的定义和使用方法.

使用 visibility 属性来编译动态链接库.

g++-4.9 -shared -o libCar.so -fvisibility=hidden Car.c

这样一来, drive 方法是可见的, 但是 stop 是不可见的.

main.c

#include<stdio.h>
#include<stdlib.h> //
// 在 gcc 编译器下, 必须声明方法
// 在 clang 编译下, 只是给了警告
// int drive();
void stop(); int main()
{
drive();
stop(); return ;
}

编译

g++-4.9 -o app main.c -L ./ -lCar

提示信息

Undefined symbols for architecture x86_64:
"stop()", referenced from:
_main in ccZnwENu.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned exit status

这说明了上面提到的第一中情况.

重新编译 Car.c, 换个方式

g++-4.9 -shared -o libCar.so -fvisibility=default Car.c

注意: 这次使用了 default 属性.

编译 main.c

g++-4.9 -o app main.c -L ./ -lCar

编译成功, 运行 app

./app
Car driving...
Car stop.

那么修改一下 Car.c 的代码

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

使用 visibility=default 和 visibility=hidden 分别编译 Car.c.

可以知道, stop 函数都是隐藏的.

这个也很好的说明了上面两个问题.

注意: g++-4.9 改为 gcc-4.9也是一样的.

另外, 除了 default 和 hidden, 还有 internal, protected.请关注后续讨论.

[转]GCC系列: __attribute__((visibility("")))的更多相关文章

  1. GCC扩展 __attribute__ ((visibility("hidden")))

    试想这样的情景,程序调用某函数A,A函数存在于两个动态链接库liba.so,libb.so中,并且程序执行需要链接这两个库,此时程序调用的A函数到底是来自于a还是b呢? 这取决于链接时的顺序,比如先链 ...

  2. GCC的__attribute__ ((constructor))和__attribute__ ((destructor))

    通过一个简单的例子介绍一下gcc的__attribute__ ((constructor))属性的作用.gcc允许为函数设置__attribute__ ((constructor))和__attrib ...

  3. 利用gcc的__attribute__编译属性section子项构建初始化函数表【转】

    转自:https://my.oschina.net/u/180497/blog/177206 gcc的__attribute__编译属性有很多子项,用于改变作用对象的特性.这里讨论section子项的 ...

  4. IOS UIKIT_EXTERN, __attribute__((visibility ("default"))) 是啥玩意?

    问题提出 在学习IOS时候,碰到一个函数NSStringFromCGPoint (UIGeometry.h) 其原型是 UIKIT_EXTERN NSString *NSStringFromCGPoi ...

  5. 从gcc的__attribute__((packed))聊到结构体大小的问题

    公司的前辈的代码里面 结构体的花括号最后 有__attribute__((packed))字样.以前没见过,所以查了查.学习学习http://blog.sina.com.cn/s/blog_559f6 ...

  6. gcc之__attribute__简介及对齐参数介绍

    GNU C的一大特色就是__attribute__机制.__attribute__机制可以设置函数属性(Function Attribute).变量属性(Variable Attribute)和类型属 ...

  7. gcc中__attribute__ ((constructor(101)))做成.a库成功链接

    1.cpp:------------------------------------------------ #include int test() __attribute__ ((construct ...

  8. 利用gcc的__attribute__编译属性section子项构建初始化函数表

    参考链接 :    https://my.oschina.net/u/180497/blog/177206

  9. gcc __attribute__关键字举例之visibility【转】

    转自:https://blog.csdn.net/starstarstone/article/details/7493144?utm_source=tuicool&utm_medium=ref ...

随机推荐

  1. C. Smallest Word

    链接 [http://codeforces.com/contest/1043/problem/C] 题意 给你一个只包含a,b的字符串,有一种操作把第1个字符到第i个字符的子串进行反转,问要使最后字符 ...

  2. Daily Scrum NO.4

    工作概况 符美潇(PM) 昨日完成的工作 1.Daily Scrum.日常会议及日常工作的分配和查收. 2.解决并录入了一个严重的过滤器BUG,该BUG会导致获取子链接的严重异常. 3.在TFS上进行 ...

  3. Xmind 8 pro 软件破解版

    转载地址:https://blog.csdn.net/qq_16093323/article/details/80967867 Xmind是一款非常专业的思维导图软件,收费好几百元,不过还是很多用户, ...

  4. Docker(十)-Docker创建DockerFile文件

    制作Docker image 有两种方式: 使用 Docker container,直接构建容器,再导出成 image 使用. 是使用 Dockerfile,将所有动作写在文件中,再 build 成 ...

  5. Oracle 导入单表数据

    1. 测试一下 删除某一张表,然后 通过 expdp 数据库泵的备份来恢复数据. 测试过程 ) from bizlog COUNT() ---------- 151 drop table bizlog ...

  6. 外媒速递:系统管理员必须掌握的20条Linux命令

    [51CTO.com原创稿件]外媒速递是核子可乐精选的近日国外媒体的精彩文章推荐,希望大家喜欢! 今天推荐的内容包括:系统管理员必须掌握的20条Linux命令.五款最佳Linux屏幕记录应用.MySQ ...

  7. send和sendmsg性能测试

    1,摘要:测试send和sendmsg的性能,影响这两个函数性能主要有发送的字节大小,增加循环次数,从100到10000000(千万)2,基本信息cat /proc/cpuinfo查看CPU信息,如下 ...

  8. Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 0. 准备工作

    一.关于 Python Python 是全球使用人数增长最快的编程语言!它易于入门.功能强大,从 Web 后端 到 数据分析.人工智能,到处都能看到 Python 的身影. Python 有两个主要的 ...

  9. CUDA ---- device管理

    device管理 NVIDIA提供了集中凡是来查询和管理GPU device,掌握GPU信息查询很重要,因为这可以帮助你设置kernel的执行配置. 本博文将主要介绍下面两方面内容: CUDA run ...

  10. Strongly connected HDU - 4635(判断强连通图 缩点)

    找出强联通块,计算每个连通块内的点数.将点数最少的那个连通块单独拿出来,其余的连通块合并成一个连通分量. 那么假设第一个连通块的 点数是 x  第二个连通块的点数是 y 一个强连通图(每两个点之间,至 ...