-qvisibility (-fvisibility)
适用的调用
| 选项 | xlc (编译 C) | xlC (编译 C++) | xlclang(编译 C) | xlclang++(编译 C++) |
|---|---|---|---|---|
| -qvisibility | ✓ | ✓ | ✓ | ✓ |
| -fvisibility | ✓ | ✓ |
注: 此表中仅列出典型调用。 对于所有基本调用及其等效特殊调用,您可以参阅 编译器调用的完整列表 。
类别
等效编译指示
| xlc/xlC 和其他遗留的调用命令 | xlclang/xlclang + + 调用命令 |
|---|---|
| #pragma GCC 可视性推送 (缺省值 | protected | hidden | internal) , #pragma GCC 可视性弹出窗口 |
|
用途
指定对象文件中的外部链接实体的可视性属性。 如果外部链接实体未从 pragma 伪指令,显式指定的属性或传播规则获取可视性属性,那么这些实体具有 -qvisibility 选项指定的可视性属性。
语法
缺省值
| xlc/xlC 和其他遗留调用 | xlclang/xlclang + + |
|---|---|
| -qvisibility=unspecified | -qnovisibility(将忽略在源代码中指定的所有可视性编译指示和属性。) |
当 -qvisibility=unspecified 被设置时,在头文件中的内联定义上指定的默认可见性属性会导致这些定义从共享库中导出,包括符号所属的库和引用内联定义的任何库。 要解决此问题,缺省情况下编译器将忽略 visibility 属性,建议使用导出列表文件来控制共享库导出。
参数
- 未指定
- 指示受影响的外部链接实体没有可视性属性。 是否在共享库中导出这些实体取决于指定的导出列表或编译器生成的导出列表。
- 缺省值
- 指示受影响的外部链接实体具有缺省可视性属性。 这些实体在共享库中导出,这些实体可以被抢占。
- 保护
- 指示受影响的外部链接实体具有受保护的可视性属性。 这些实体将导出到共享库,但无法被抢占。
- 已隐藏
- 指示受影响的外部链接实体具有隐藏可视性属性。 这些实体不会在共享库中导出,但可以通过指针间接引用它们的地址。
- internal
- 指示受影响的外部链接实体具有内部可视性属性。 这些实体未在共享库中导出,其地址不可用于共享库中的其他模块。
限制: 在此发行版中,隐藏和内部可视性属性相同。 可以通过指针间接引用使用这些可视性属性中的任何一个指定的实体的地址。
使用量
-qvisibility 选项全局设置外部链接实体的可视性属性,以描述是否以及如何在其他模块中引用或使用在一个模块中定义的实体。 实体可视性属性仅影响具有外部链接的实体,并且无法提高其他实体的可视性。 如果实体定义在链接时被系统解析,但在运行时被另一个实体定义替换,那么就会发生实体抢占。
注: 在 AIX® 平台上,仅当使用运行时链接时才会发生实体抢占。 有关详细信息,请参阅 将库链接到应用程序。 可视性属性在 AIX 6.1 TL8, AIX 7.1 TL2, AIX 7.2 和更高版本上受支持。
预定义的宏
无。
示例
要使用编译单元 myprogram.c中的受保护可视性属性设置外部链接实体,请使用 -qvisibility=protected 选项编译 myprogram.c 。
xlc myprogram.c -qvisibility=protected -c
如果 myprogram.c 文件中的所有外部链接实体未从 pragma 伪指令,显式指定的属性或传播规则获取可视性属性,那么这些实体都具有受保护的可视性属性。
