【发布时间】:2018-08-25 06:53:01
【问题描述】:
我正在构建一个由一个主要目标和几个插件组成的应用程序(在 OSx 案例中是 dylib)。我开始在这个项目上使用std::dynamic_pointer_cast 来转换并测试我的类层次结构中的特定类型。总的来说,这很好用,并且对于我的应用程序来说已经足够快了。
我现在的问题是,有时dynamic_cast 和dynamic_pointer_cast 会在从插件中提取的代码部分中失败。我将dlopen 与RTLD_GLOBAL | RTLD_LAZY 一起使用,并且我还在用--export_dynamic 链接器标志编译我的主要目标,以确保所有符号都被拉入。但是,仍然有一些动态转换在不应该时失败。
我正在测试的类是多态的(虚拟析构函数),typeid(...).name() 总是返回一致的结果。然而,在某些情况下,动态转换返回 null,即使 typeid 信息看起来正确。
当我为调试而编译时,转换似乎总是成功(没有优化)。
我应该在插件或目标上对 OSx(XCode、clang)使用哪些其他链接器标志,以确保动态转换在我的情况下正常工作?
【问题讨论】:
-
如果您希望人们能够帮助您,您应该发布 minimal reproducible example 来展示问题。
-
@JesperJuhl 谢谢。这个问题也只出现在我的发布版本中。但我会尝试整理一个干净的例子。
-
您可能违反了单一定义规则,并且您继承的类实际上与您正在测试的类不同。跨可加载模块的类型标识不是一个简单的概念。