【发布时间】:2017-03-02 15:46:31
【问题描述】:
我有一个定义如下内容的库:
//singleton.hpp
class Singleton
{
public:
static Singleton* getInstance()
{
static Singleton* mInstance=0;
if (!mInstance)
{
mInstance=new Singleton();
}
return mInstance;
}
};
我在构建几个共享对象库时包含了这个头文件。当我使用 gcc (Ubuntu) 构建这些共享对象库时,静态被标记为唯一: (纳米输出)
0000000000045780 u Singleton::mInstance
当我使用 clang 构建共享库时,相同的符号被标记为弱:
0000000000045780 V 单例::mInstance
当我对 gcc 构建的共享对象进行 dlopen(..., RT_NOW) 时,动态链接器会修复所有内容,并且似乎生成了一个 mInstance 符号。但是,当我 dlopen(..., RT_NOW) 使用 clang 构建的共享对象时,我会为每个库获得一个单独的符号,这使得单例不是单例。这是预期的行为吗?有什么方法可以强制动态链接器表现得好像符号被标记为唯一一样,就像它们在 gcc 编译中一样?
【问题讨论】: