gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:16:36 25 4
gpt4 key购买 nike

我试图了解 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,我得到了 Singleton 的多个实例。

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

这是怎么回事,解决方案是什么?

最佳答案

类似于PiotrNycz中的建议的链接答案,对我来说最简单的解决方案是在定义了从 Singleton 继承的类型的模块中的 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 C++ 模板单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32830905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com