插件中的Clang C ++模板单例

时间:2015-09-28 20:05:50

标签: c++ linker singleton

我试图理解C ++ / Clang如何处理模板中的静态成员。为此,我将Singleton定义如下:

template <class T> class Singleton {
public:
    static T* instance() {
        if (!m_instance)
            m_instance = new T;

        return m_instance;
    }

private:
    static T* m_instance;
};

template <class T> T* Singleton<T>::m_instance = nullptr;

如果我的应用程序被编译为单个可执行文件,这似乎工作得很好。当我开始使用插件时,即使用dylib打开dlopen时,我会获得Singleton的多个实例。

通常我用-fvisiblity=hidden编译我的应用程序。如果删除该选项,意味着我使用default可见性,则Singleton的行为正常。这让我觉得我只需要使用__attribute__((visibility=default))导出符号,但这不起作用。

这里有什么,解决方案是什么?

1 个答案:

答案 0 :(得分:1)

PiotrNycz链接答案中的建议类似,对我来说最简单的解决方案是在模块中的cpp文件中添加模板的可见显式实例化,其中类型继承自{{1已定义。单线就足够了:

Singleton

这将使template<> __attribute__((visibility=default)) MyType * Singleton<MyType>::m_instance = nullptr; 模板的MyType实例在一个模块中作为导出符号可见。为避免重复符号,必须从Singleton的定义中删除m_instance的初始化,即删除此行:

Singleton