C++ 链接器如何处理C++;链接到共享库的静态库?

C++ 链接器如何处理C++;链接到共享库的静态库?,c++,linker,shared-libraries,static-libraries,typeinfo,C++,Linker,Shared Libraries,Static Libraries,Typeinfo,我最近讨论了调用约定、ABI规范等,顺便说一句,我记得读过一篇文章,要求可执行文件/库对于一个类只有一个typeinfo 考虑到这一点,我的问题是:假设两个库libA.so和libB.so静态链接到libboost\u somethingorother.a。。。在boost库中,每个类都有自己的类型信息。链接器如何处理这种模棱两可的情况?或者也许应该问一个更一般的问题:将C++库静态链接到共享库是安全的吗? 举一个更具体的例子 // in libC.a class SomeException :

我最近讨论了调用约定、ABI规范等,顺便说一句,我记得读过一篇文章,要求可执行文件/库对于一个类只有一个typeinfo

考虑到这一点,我的问题是:假设两个库
libA.so
libB.so
静态链接到
libboost\u somethingorother.a
。。。在boost库中,每个类都有自己的类型信息。链接器如何处理这种模棱两可的情况?或者也许应该问一个更一般的问题:将C++库静态链接到共享库是安全的吗? 举一个更具体的例子

// in libC.a
class SomeException : public std::Exception { /* ... */ };

// in libA.so, links statically against libC.a
void A_test() {
  extern void B_test();
  try {
    B_test();
  }
  catch( SomeException ) {}

// in libB.so, links statically against libC.a
void B_test() {
  throw SomeException();
}
这有什么不安全的地方吗


在我看来,它一定做了“正确的事情”,因为从仅头库实例化的对象可以在2+共享库的代码中安全地使用。然而,我对自己的逻辑没有足够的信心,我很好奇我可能错过了什么(如果有的话)。

今天我终于有时间修补了。假设满足了发出typeinfo对象的所有条件,编译器将其作为弱符号发出。因为符号很弱,所以它总能找到正确的typeinfo对象


编译器不会发出对typeinfo对象的未定义引用(至少gcc 4.9和clang 3.5没有);要么全是,要么什么都不是。

您是否记得您使用的选项,或者您是否有可以共享的工作生成文件?使用clang++4.0.1,我得到的是未定义的符号,而不是弱符号。我猜在3.5和4.0之间发生了一些变化。谢谢我只看到在使用消毒剂时发出未定义的引用。我还没有要测试的Clang4.x。