插件中的 Clang C++ 模板单例
Clang C++ Template Singleton in plugins
我想了解 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
打开的 dylib
s,我得到 Singleton
.
的多个实例
通常我用 -fvisiblity=hidden
编译我的应用程序。如果删除该选项,意味着我使用 default
可见性,那么 Singleton
会正常运行。这让我认为我只需要使用 __attribute__((visibility=default))
导出符号,但这不起作用。
这是怎么回事,解决方案是什么?
类似于 PiotrNycz 的链接答案中的建议,对我来说最简单的解决方案是在类型继承自 [=12= 的模块的 cpp 文件中添加模板的可见显式实例化] 被定义。一行就够了:
template<> __attribute__((visibility=default)) MyType * Singleton<MyType>::m_instance = nullptr;
这将使 Singleton
模板的 MyType
实例在一个模块中作为导出符号可见。为避免重复符号,必须从 Singleton
的定义中删除 m_instance
的初始化,即删除此行:
template <class T> T* Singleton<T>::m_instance = nullptr;
我想了解 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
打开的 dylib
s,我得到 Singleton
.
通常我用 -fvisiblity=hidden
编译我的应用程序。如果删除该选项,意味着我使用 default
可见性,那么 Singleton
会正常运行。这让我认为我只需要使用 __attribute__((visibility=default))
导出符号,但这不起作用。
这是怎么回事,解决方案是什么?
类似于 PiotrNycz 的链接答案中的建议,对我来说最简单的解决方案是在类型继承自 [=12= 的模块的 cpp 文件中添加模板的可见显式实例化] 被定义。一行就够了:
template<> __attribute__((visibility=default)) MyType * Singleton<MyType>::m_instance = nullptr;
这将使 Singleton
模板的 MyType
实例在一个模块中作为导出符号可见。为避免重复符号,必须从 Singleton
的定义中删除 m_instance
的初始化,即删除此行:
template <class T> T* Singleton<T>::m_instance = nullptr;