gpt4 book ai didi

c++ - 从继承自模板的 dll 导出类

转载 作者:太空宇宙 更新时间:2023-11-04 11:52:09 32 4
gpt4 key购买 nike

我正在从一个继承自模板基类的 dll 中导出一个类。模板基类不是从 dll 导出的,而是设计为在编译时像静态库一样链接。情况是这样的:

基类定义如下:

template<typename _type>
class Singleton
{
public:
static void CreateSingleton(void);
static _type* GetSingleton(void);
static void DestroySingleton(void);

virtual ~Singleton(void);
protected:
Singleton(void);
Singleton(const Singleton<_type> &copyfrom);

_type* m_ptrSingleton;
};

我有一个继承自它的类,它是这样定义的:

#if defined(_ENGINE_EXPORT)
#define ENGINELINKAGE __declspec(dllexport)
#elif defined(_ENGINE_IMPORT)
#define ENGINELINKAGE __declspec(dllimport)
#else
#define ENGINELINKAGE
#endif

class ENGINELINKAGE IWindowManager: public Singleton<IWindowManager>
{
public:
virtual ~IWindowManager(void) =0;
};

我能够编译,但是当尝试在另一个从包含 IWindowManager 和 Singleton 的 dll 导入的项目中使用 IWindowManager 时,链接器会产生以下错误:

2>Engine_win32.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: static class IWindowManager * __cdecl Singleton<class IWindowManager>::GetSingleton(void)" (__imp_?GetSingleton@?$Singleton@VIWindowManager@@@@SAPAVIWindowManager@@XZ) referenced in function "public: static class WindowManager_win32 * __cdecl WindowManager_win32::GetSingleton(void)" (?GetSingleton@WindowManager_win32@@SAPAV1@XZ)
2>WindowManager_win32.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: static class IWindowManager * __cdecl Singleton<class IWindowManager>::GetSingleton(void)" (__imp_?GetSingleton@?$Singleton@VIWindowManager@@@@SAPAVIWindowManager@@XZ)
2>Window_win32.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: static class IWindowManager * __cdecl Singleton<class IWindowManager>::GetSingleton(void)" (__imp_?GetSingleton@?$Singleton@VIWindowManager@@@@SAPAVIWindowManager@@XZ)
2>Engine_win32.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: static void __cdecl Singleton<class IWindowManager>::DestroySingleton(void)" (__imp_?DestroySingleton@?$Singleton@VIWindowManager@@@@SAXXZ) referenced in function _main
2>Engine_win32.obj : error LNK2001: unresolved external symbol "protected: static class IWindowManager * Singleton<class IWindowManager>::m_ptrSingleton" (?m_ptrSingleton@?$Singleton@VIWindowManager@@@@1PAVIWindowManager@@A)

我已经定义了类,因此 IWindowManager 应该从 dll 中导出,但 Singleton 不应该导出,而是在编译时静态链接到程序中。这样做的原因是,如果你想从 dll 中导出一个模板,而你没有一组非常具体的模板实例,你必须静态链接它。动态链接模板是不可能的,但您必须动态链接要导出/导入的每个实例。

链接器错误似乎表明它正在尝试导出 Singleton,即使我没有指定它应该被导出。

有谁知道为什么会这样或者我该如何解决这个问题?

最佳答案

如果类在 DLL 中,则必须在 DLL 中提供一些虚拟实例化。否则,不会为单例类生成任何代码。因此,以后的编译将失败,因为 IWindowManager 类将不在 lib/DLL 中。

Sidemark:如果你真的需要一个单例,你应该重新考虑

关于c++ - 从继承自模板的 dll 导出类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17720149/

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