【问题标题】:Clang C++ Template Singleton in plugins插件中的 Clang C++ 模板单例
【发布时间】:2015-09-28 20:05:50
【问题描述】:

我试图了解 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;

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

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

这里发生了什么,解决方案是什么?

【问题讨论】:

标签: c++ linker singleton


【解决方案1】:

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

template<> __attribute__((visibility=default)) MyType * Singleton<MyType>::m_instance = nullptr;

这将使Singleton 模板的MyType 实例仅在一个模块中作为导出符号可见。为避免重复符号,m_instance 的初始化必须从 Singleton 的定义中删除,即删除此行:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多