热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

c隐藏符号时dynamic_cast失败

我有很多静态库.一个是static_lib_a.a.我创建了一个动态库dynamic_lib.so来将它们放在一起.在static_lib_a.a中,它使用xerces3.1.1解

我有很多静态库.一个是static_lib_a.a.我创建了一个动态库dynamic_lib.so来将它们放在一起.

在static_lib_a.a中,它使用xerces 3.1.1解析xml.以下是static_lib_a.a中的代码段

xerces::DOMElement *pElementNode = dynamic_cast(pNode);

pNode的类型是xerces :: DOMNode.它被分配给xerces :: DOMElement对象.这行代码将进行向下转换.

为了在dynamic_lib.so中隐藏static_lib_a.a的所有符号,我使用-fvisibility = hidden构建此静态库.我发现如果添加-fvisibility = hidden,pElementNode将在运行时返回NULL指针.

gcc编译器的版本是3.4.4.

有人有类似的问题吗?

解决方法:

问题的根源在gcc wiki的“ C异常问题”一节中进行了描述.确保您单击那里的“模糊链接”链接,并阅读了有关虚拟表和typeinfo的部分.

这一切都适用于您的情况,因为xerces :: DOMNode和xerces :: DOMElement类不包含任何非纯的,非内联的虚函数(实际上,这些类完全包含在头文件中).这意味着任何一个类的虚拟表都会在包含其标题的每个目标文件中发出.

dynamic_cast正常工作所需的任一类的typeinfo符号,都在与虚拟表相同的对象中发出,即,在包含其头的每个对象文件中发出.

当您用隐藏的可见性标记您的库时,来自static_lib_a.a的对象中xerces :: DOMNode和xerces :: DOMElement的所有typeinfo符号都标记为隐藏.正如Wiki页面所指出的那样,这可确保链接器随后将其标记为在dynamic_lib.so中隐藏,并且您的dynamic_cast将失败.


推荐阅读
  • 页面预渲染适用于主要包含静态内容的页面。对于依赖大量API调用的动态页面,建议采用SSR(服务器端渲染),如Nuxt等框架。更多优化策略可参见:https://github.com/HaoChuan9421/vue-cli3-optimization ... [详细]
  • 华为云openEuler环境下的Web应用部署实践
    本文详细记录了在华为云openEuler系统上进行Web应用部署的具体步骤,包括配置yum源、安装Apache、MariaDB、PHP及其相关组件,并完成WordPress的安装与配置过程。 ... [详细]
  • SpringBoot底层注解用法及原理
    2.1、组件添加1、Configuration基本使用Full模式与Lite模式示例最佳实战配置类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断配置类组 ... [详细]
  • 本文将详细介绍如何配置并整合MVP架构、Retrofit网络请求库、Dagger2依赖注入框架以及RxAndroid响应式编程库,构建高效、模块化的Android应用。 ... [详细]
  • java datarow_DataSet  DataTable DataRow 深入浅出
    本篇文章适合有一定的基础的人去查看,最好学习过一定net编程基础在来查看此文章。1.概念DataSet是ADO.NET的中心概念。可以把DataSet当成内存中的数据 ... [详细]
  • 本文探讨了如何选择一个合适的序列化版本ID(serialVersionUID),包括使用生成器还是简单的整数,以及在不同情况下应如何处理序列化版本ID。 ... [详细]
  • 如何高效学习鸿蒙操作系统:开发者指南
    本文探讨了开发者如何更有效地学习鸿蒙操作系统,提供了来自行业专家的建议,包括系统化学习方法、职业规划建议以及具体的开发技巧。 ... [详细]
  • 本文总结了 #define 在 C/C++ 编程中的多种用途和技巧,包括定义常量、函数、宏以及条件编译等,并提供了详细的示例和注意事项。 ... [详细]
  • 一、使用Microsoft.Office.Interop.Excel.DLL需要安装Office代码如下:2publicstaticboolExportExcel(S ... [详细]
  • Gradle 是 Android Studio 中默认的构建工具,了解其基本配置对于开发效率的提升至关重要。本文将详细介绍如何在 Gradle 中定义和使用共享变量,以确保项目的一致性和可维护性。 ... [详细]
  • 本文介绍了Tomcat的基本操作,包括启动、关闭及首次访问的方法,并详细讲解了如何在IDEA中创建Web项目,配置Servlet及其映射,以及如何将项目部署到Tomcat。 ... [详细]
  • Java虚拟机及其发展历程
    Java虚拟机(JVM)是每个Java开发者日常工作中不可或缺的一部分,但其背后的运作机制却往往显得神秘莫测。本文将探讨Java及其虚拟机的发展历程,帮助读者深入了解这一关键技术。 ... [详细]
  • JavaScript 跨域解决方案详解
    本文详细介绍了JavaScript在不同域之间进行数据传输或通信的技术,包括使用JSONP、修改document.domain、利用window.name以及HTML5的postMessage方法等跨域解决方案。 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 本文探讨了如何通过优化 DOM 操作来提升 JavaScript 的性能,包括使用 `createElement` 函数、动画元素、理解重绘事件及处理鼠标滚动事件等关键主题。 ... [详细]
author-avatar
fkg7571831
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有