弱符号和dlopen()与clang与gcc

我有一个库定义了这样的东西:

    //singleton.hpp
    class Singleton
    {
    public:
      static Singleton* getInstance()
      {
        static Singleton* mInstance=0;
        if (!mInstance)
        {
            mInstance=new Singleton();
        }
        return mInstance;
      }
    };

在构建几个共享对象库时,我包含此标头.当我使用gcc(Ubuntu)构建这些共享对象库时,静态被标记为唯一:
(nm输出)

0000000000045780 u Singleton :: mInstance

当我使用clang构建共享库时,相同的符号被标记为弱:

0000000000045780 V Singleton :: mInstance

当我dlopen(…,RT_NOW)gcc构建的共享对象时,动态链接器会修复所有内容并且似乎只生成一个mInstance符号.然而,当我dlopen(…,RT_NOW)clang构建的共享对象时,我为每个库得到一个单独的符号,这使得单例不是单例.这是预期的行为吗?是否有某种方法可以强制动态链接器的行为就像符号被标记为唯一一样,因为它们与gcc编译一样?

最佳答案 看起来像
https://llvm.org/bugs/show_bug.cgi?id=22281

但是,它未标记为已解决,并且不提供变通方法.

点赞