1、新建一个DLL工程,里面有两个类:ResManager 和 Singleton// Singleton.h
template <typename T> class Singleton
{
protected:
    static T* ms_Singleton;public:
    Singleton( void )
    {
        ……
    }    ~Singleton( void )
    {
        ……
    }    static T& GetSingleton( void )
    {
        ……
    }    static T* GetSingletonPtr( void )
    {
        ……
    }
}// ResManager.h
#include "Singleton.h"
class __declspec( dllexport ) ResManager: public Singleton<ResManager>
{
public:
    ResManager(void);
    ~ResManager(void);public:
    static ResManager& GetSingleton(void);
    static ResManager* GetSingletonPtr(void);    ……
    ……
}// ResManager.cpp
#include "ResManager.h"template<> ResManager* Singleton<ResManager>::ms_Singleton = 0;
ResManager* ResManager::GetSingletonPtr(void)
{
    return ms_Singleton;
}
ResManager& ResManager::GetSingleton(void)
{  
    assert( ms_Singleton );  
    return ( *ms_Singleton );  
}ResManager::ResManager(void)
{
    ……
}ResManager::~ResManager(void)
{
    ……
}……
……编译成功,没有问题。////////////////////////////////////////////////////////2、新建一个Win32程序的工程 MyTest// MyTest.h
#include "ResManager.h"
#pragma comment( lib, "ResManager.lib" )
……
……// MyTest.cpp
……
ResManager *pResMgr = new ResManager();
……编译失败,提示:
stdafx.obj : error LNK2001: 无法解析的外部符号 "protected: static class ResManager * Singleton<class ResManager>::ms_Singleton" (?ms_Singleton@?$Singleton@VResManager@1PAVResManager@2@A)
Debug/MyTest.exe : fatal error LNK1120: 1 个无法解析的外部命令问题一:请问这里编译失败是什么原因?
////////////////////////////////////////////////////3、如果把 Singleton 类声明改为:// Singleton.h
template <typename T> class __declspec( dllexport ) Singleton
{
    ……
    ……
}此时DLL编译成功,MyTest.exe也编译成功。//////////////////////////////////////////////////////4、如果为ResManager类添加一个std::string的变量// ResManager.h
#include "Singleton.h"
class __declspec( dllexport ) ResManager: public Singleton<ResManager>
{
public:
    ResManager(void);
    ~ResManager(void);public:
    static ResManager& GetSingleton(void);
    static ResManager* GetSingletonPtr(void);    ……
    ……private:
    std::string m_strName;
    ……
}此时 DLL 编译成功,MyTest.exe 编译失败,提示和前面的错误一样:stdafx.obj : error LNK2001: 无法解析的外部符号 "protected: static class ResManager * Singleton<class ResManager>::ms_Singleton" (?ms_Singleton@?$Singleton@VResManager@1PAVResManager@2@A)
Debug/MyTest.exe : fatal error LNK1120: 1 个无法解析的外部命令问题二:请问这里编译出错是什么原因?该如何解决?前者不添加这个std::string的变量就OK,添加了之后,后者就编译通不过。写得有点乱,不知道DX们能不能看懂。谢谢!

解决方案 »

  1.   

    奇怪啊,除了会warning说基类没有导出以外,偶这儿没有问题啊。XP+VC6
      

  2.   

    楼主建的什么DLL工程?
    我测试用的是Win32 Dynamic-Link Library和Win32 Console Application
      

  3.   

    我是用的:Win32 Dynamic-Link Library 和 Win32 ApplicationWinXP SP2 + VC7.1
      

  4.   

    我是用的:Win32 Dynamic-Link Library 和 Win32 ApplicationWinXP SP2 + VC7.1可以到下面这个链接下载我的DLL和EXE工程的源代码,麻烦各位DX帮忙看看,谢谢!http://bbs.gameres.com/upload/sf_20051216163157.rar
      

  5.   

    你应该把生成的ResManager.h、ResManager.lib和ResManager.dll都复制到EXE工程的目录下再编译(注,不是debug目录)
      

  6.   

    嗯,lib库文件等路径对了,引入进去就可以了
      

  7.   

    楼上两位DX都是下载 http://bbs.gameres.com/upload/sf_20051216163157.rar 后解压,两个项目都编译成功了?
      

  8.   

    在 EXE 中没有 __declspec( dllimport )