有一个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成功。
#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成功。
解决方案 »
- FtpOpenFile配合InternetWriteFile进行上传文件时的怪问题
- vc一般用户远程访问数据库
- 鼠标放在菜单上时,如何触发一个事件,再得到该菜单项的值,然后根据该值弹出相应子菜单
- 如何实现Activex自定义事件并使页面能接收该事件
- 有关TCP包头中的两个序号字段的问题
- 如何获取对话框上按钮的坐标和长、宽?
- 有个家伙,写了两个字母“ft”,菜鸟不知何意?
- 请问高手,我对“LOCAL”这个关键词真的理解不了
- 如何声明一个数组,使其能new某个类下的所有派生类
- 为什么VC中无符号长整型转换成字符型编译时VC有提示说可能会丢失一些数据,而改用long则没有提示。
- DirectDraw问题,建立LPDIRECTDRAWSURFACE7总是失败!!!
- vc中,一个固定了尺寸的界面,在我改变了显示器属性中的字体为大字体时,就不能全部显示原先设置的全部东西,如何解决?
{
…
}extern "C" AFX_EXT_API void WINAPI InitMYDLL();
应该将类在DLL中导出。
使用extern来进行。如楼上所说。当将应用程序从 16 位移植到 32 位时,会发生 LNK2001。当前的 32 位模块定义 (.def) 文件语法要求 __cdecl、__stdcall 和 __fastcall 函数列在 EXPORTS 节中,并且不带下划线(不修饰)。这不同于 16 位语法,这些函数在 16 位语法中列出时必须带下划线(修饰)。有关更多信息,请参阅模块定义文件 EXPORTS 节的说明。
在 .def 文件中列出但未找到的任何导出将导致 LNK2001。这可能是因为导出不存在、拼写错误或使用了 C++ 修饰名(.def 文件不采用修饰名)。
>使用extern来进行。如楼上所说。
可是extern "C" AFX_EXT_API void WINAPI InitMYDLL();导出的是函数呀.
class AFX_EXT_CLASS CABCView : public CView
吗?
好象对于一个DLL和另外一个DLL头文件包括要做一点东东的帖子你可以看看
我也忘了怎么做了
好象是要一些宏吧
不知道你COPY一个.h 文件改你的声明行不行
class _declspec(_dllimpot) CABCView : public CView
这样定义的:
class AFX_EXT_CLASS CABCView : public CView>好象对于一个DLL和另外一个DLL头文件包括要做一点东东的帖子你可以看看
在何处? 试过直接在我的Dll中include那个CABCView 的.h文件,错误更多(都是Link错误)
如何将一个Dll的类,导入另一个Dll中。
http://www.codeproject.com/dll/dllexport.asp
http://www.codeproject.com/dll/use_dll_in_dll.asp
http://www.codeproject.com/useritems/noextensiondll.asp
CABCView它不认识阿~
General.lib库中CABCView导不出来~:(
代表的意思应该是静态链接dll吧~
静态链接应该包含h文件的阿~
要不他上哪里知道你要导出的类是什么?
更多错误可能是你类中的成员函数没有导出而产生的错误~
General.dll是什么类型的?
也是Extend的吗?
Export and Import Using AFX_EXT_CLASS
因为试图导入基类的那个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).
累死我了,造福后人吧.