[转]GCC系列: __attribute__((visibility("")))
在 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("")))的更多相关文章
- GCC扩展 __attribute__ ((visibility("hidden")))
试想这样的情景,程序调用某函数A,A函数存在于两个动态链接库liba.so,libb.so中,并且程序执行需要链接这两个库,此时程序调用的A函数到底是来自于a还是b呢? 这取决于链接时的顺序,比如先链 ...
- GCC的__attribute__ ((constructor))和__attribute__ ((destructor))
通过一个简单的例子介绍一下gcc的__attribute__ ((constructor))属性的作用.gcc允许为函数设置__attribute__ ((constructor))和__attrib ...
- 利用gcc的__attribute__编译属性section子项构建初始化函数表【转】
转自:https://my.oschina.net/u/180497/blog/177206 gcc的__attribute__编译属性有很多子项,用于改变作用对象的特性.这里讨论section子项的 ...
- IOS UIKIT_EXTERN, __attribute__((visibility ("default"))) 是啥玩意?
问题提出 在学习IOS时候,碰到一个函数NSStringFromCGPoint (UIGeometry.h) 其原型是 UIKIT_EXTERN NSString *NSStringFromCGPoi ...
- 从gcc的__attribute__((packed))聊到结构体大小的问题
公司的前辈的代码里面 结构体的花括号最后 有__attribute__((packed))字样.以前没见过,所以查了查.学习学习http://blog.sina.com.cn/s/blog_559f6 ...
- gcc之__attribute__简介及对齐参数介绍
GNU C的一大特色就是__attribute__机制.__attribute__机制可以设置函数属性(Function Attribute).变量属性(Variable Attribute)和类型属 ...
- gcc中__attribute__ ((constructor(101)))做成.a库成功链接
1.cpp:------------------------------------------------ #include int test() __attribute__ ((construct ...
- 利用gcc的__attribute__编译属性section子项构建初始化函数表
参考链接 : https://my.oschina.net/u/180497/blog/177206
- gcc __attribute__关键字举例之visibility【转】
转自:https://blog.csdn.net/starstarstone/article/details/7493144?utm_source=tuicool&utm_medium=ref ...
随机推荐
- 第二次Scrum meeting
第二次Scrum meeting 任务及其要求: 成员 12.11 12.12 陈谋 完成Tags的爬取工作(已完成) stackoverflow的问题抽取 卢惠明 视频链接的挖掘和整理(未完成) 视 ...
- Docker打DB2 9.7镜像采坑相关
概况:以centos:7.2.1511镜像为基础镜像,使用docker commit方式进行构建 步骤: 运行centos7.2.1511镜像(以特权模式运行,后续内核参数修改必需参数) dock ...
- C语言版本:双链表的实现
Dlist.h #ifndef __DLIST_H__ #define __DLIST_H__ #include<cstdio> #include<malloc.h> #inc ...
- 第一个spring,第一天。
陈志棚:界面跳转与框架 李天麟:游戏界面ui 徐侃:算法代码的设计 经过热烈的讨论后,我们各自在完成自己的任务.
- 两个简单的动态规划问题,0-1背包和最大不相邻数累加和,附递归c代码
最近面试经常被问到动态规划,所以自己做了一个总结,希望能进行深入的理解然后尝试能不能找到通用的解决手段.我觉得动态规划思想好理解,难的是怎么找出全部并且合理的子问题和出口. 我一般把问题分为两类,一类 ...
- HDU 2051 Bitset
http://acm.hdu.edu.cn/showproblem.php?pid=2051 Problem Description Give you a number on base ten,you ...
- sysbench的安装与简单使用
1. 下载sysbench的文件 https://codeload.github.com/akopytov/sysbench/zip/1.0.15 2. 放进linux机器以及进行解压缩 unzip ...
- Helm 安装 nginx-ingress 的方法
还是没学会 今天继续研究. Using Helm NGINX Ingress controller can be installed via Helm using the chart stable/n ...
- 知识点【JavaScript模块化】
JavaScript模块化历程 JavaScript发展变迁大概是一下几个步骤: 工具(浏览器兼容) 组件(功能模块) 框架(功能模块组织) 应用(业务模块组织) 但是经过了长长的后天努力过程Java ...
- The Accomodation of Students HDU - 2444(判断二分图 + 二分匹配)
The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...