有一个MFC Exe Project,在它的stdafx.h连接一个LIB:
#pragma comment(lib, "General.lib")General有一个导出类,CABCView,它是CView的派生类。
我在MFC Exe中写一个CABCView的派生类:
class CMyView : public CABCView
{
protected:
CMyView (); 
DECLARE_DYNCREATE(CMyView )
.....
};
CPP文件:
IMPLEMENT_DYNCREATE(CMyView , CABCView)BEGIN_MESSAGE_MAP(CMyView , CABCView)
//{{AFX_MSG_MAP(CMyView )
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
编译,执行,一切正常。现在我想把CMyView 放到另一个MFC EXT DLL project中,在该Project的stdafx.h中同样写:
#pragma comment(lib, "General.lib")然后在该DLL Project添加CMyView 类,除了在h中定义时添加导出类宏,其他完全和MFC Exe project代码一样:
class AFX_EXT_CLASS CMyView : public CABCView
{
....
但是在Link的时候报错如下:Linking...
Creating library 新的MFC Ext DLL.lib and object 新的MFC Ext DLL.exp
MyClass.obj : error LNK2001: unresolved external symbol "public: static
struct CRuntimeClass const  CABCView::classCABCView"
(?classCABCView@CABCView@@2UCRuntimeClass@@B)
MyClass.obj : error LNK2001: unresolved external symbol "protected: static
struct AFX_MSGMAP const  CABCView::messageMap"
(?messageMap@CABCView@@1UAFX_MSGMAP@@B)
新的MFC Ext DLL.dll : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.请问如何解决这个问题?为什么Link错误?我已经在DLL的stdafx中指明连接父类CABCView的那个Lib了,并且连接器在报错也显示连接CABCView的那个Lib成功。

解决方案 »

  1.   

    要输出整个的类,对类使用_declspec(_dllexpot);要输出类的成员函数,则对该函数使用_declspec(_dllexport)。如:class AFX_EXT_CLASS CTextDoc : public CDocument
    {

    }extern "C" AFX_EXT_API void WINAPI InitMYDLL();
      

  2.   

    导出问题 
    应该将类在DLL中导出。
    使用extern来进行。如楼上所说。当将应用程序从 16 位移植到 32 位时,会发生 LNK2001。当前的 32 位模块定义 (.def) 文件语法要求 __cdecl、__stdcall 和 __fastcall 函数列在 EXPORTS 节中,并且不带下划线(不修饰)。这不同于 16 位语法,这些函数在 16 位语法中列出时必须带下划线(修饰)。有关更多信息,请参阅模块定义文件 EXPORTS 节的说明。 
    在 .def 文件中列出但未找到的任何导出将导致 LNK2001。这可能是因为导出不存在、拼写错误或使用了 C++ 修饰名(.def 文件不采用修饰名)。
      

  3.   

    晕.似乎你们知道我要的答案:) 但是,我该怎么做?>应该将类在DLL中导出。
    >使用extern来进行。如楼上所说。
    可是extern "C" AFX_EXT_API void WINAPI InitMYDLL();导出的是函数呀.
      

  4.   

    我写的那个link错误的DLL所使用的那个Lib已经导出了我要的类,因为上面说的在MFC Exe程序中使用没问题.只是在移到Dll Project才连接错误.
      

  5.   

    你的CABCView的头文件是怎么定义的?
    class AFX_EXT_CLASS CABCView : public CView
    吗?
    好象对于一个DLL和另外一个DLL头文件包括要做一点东东的帖子你可以看看
    我也忘了怎么做了
    好象是要一些宏吧
    不知道你COPY一个.h 文件改你的声明行不行
    class _declspec(_dllimpot) CABCView : public CView
      

  6.   

    >你的CABCView的头文件是怎么定义的?
    这样定义的:
    class AFX_EXT_CLASS CABCView : public CView>好象对于一个DLL和另外一个DLL头文件包括要做一点东东的帖子你可以看看
    在何处? 试过直接在我的Dll中include那个CABCView 的.h文件,错误更多(都是Link错误)
      

  7.   

    我似乎明白了,应该这样问:
    如何将一个Dll的类,导入另一个Dll中。
      

  8.   

    see this,
     http://www.codeproject.com/dll/dllexport.asp
    http://www.codeproject.com/dll/use_dll_in_dll.asp
    http://www.codeproject.com/useritems/noextensiondll.asp
      

  9.   

    你的出错信息就是CABCView类没有在dll中导出~
    CABCView它不认识阿~
    General.lib库中CABCView导不出来~:(
      

  10.   

    #pragma comment(lib, "General.lib")
    代表的意思应该是静态链接dll吧~
    静态链接应该包含h文件的阿~
    要不他上哪里知道你要导出的类是什么?
    更多错误可能是你类中的成员函数没有导出而产生的错误~
    General.dll是什么类型的?
    也是Extend的吗?
      

  11.   

    参考MSDN,Title is:
    Export and Import Using AFX_EXT_CLASS
      

  12.   

    哈哈,终于解决了.就是http://www.codeproject.com/dll/use_dll_in_dll.asp说的问题,谢谢各位乐.
    因为试图导入基类的那个Dll也要导出类,而inlude导出类的h后,AFX_EXT_CLASS被展开成_declspec(dllexport),所以出现没有导入的错误.
    按照 Phourm 的方法copy .h文件后直接把宏写成_declspec(dllimport)还是不行,是因为那个.h还要继续导入类,而那些应该导入的类没有定义_declspec(dllimport).
    所以向要导出class的Dll1中导入另一个class的Dll2的方法是:
    先临时define AFX_EXT_CLASS为AFX_CLASS_IMPORT, 再include导入类(dll2)的h文件(这时AFX_EXT_CLASS被展开成_declspec(dllimport)而不是_declspec(dllexport)),include语句后马上重新定义AFX_EXT_CLASS 为AFX_CLASS_EXPORT,这样dll2的导出类的宏可以正常展开成_declspec(dllexport).
    累死我了,造福后人吧.