调用DLL中,调用DLL中的类函数无法解析//怎么解决!!!

mirro187_ 2013-03-04 11:33:14
DLL里封装几个类,我在dllmain里写几个接口函数 New了几个类。在调用DLL程序里 new了几个对象;对象调用DLL里类函数,报错无法解析这些类函数!
...全文
727 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
mirro187_ 2013-03-28
  • 打赏
  • 举报
回复
大侠看下这个吧!http://bbs.csdn.net/topics/390406488?page=1#post-394051743 //调用方法不对呀?
引用 1 楼 jason_wentzel 的回复:
相应的lib文件引进来了吗?
mirro187_ 2013-03-05
  • 打赏
  • 举报
回复
error LNK2019: 无法解析的外部符号"public: __thiscall CEditEx::CEditEx(void)"
引用 14 楼 jason_wentzel 的回复:
导出类单独做一个.h文件,我看看你的导出类如何写的?
mirro187_ 2013-03-05
  • 打赏
  • 举报
回复


  1>MirroCtl.cpp
1>c:\documents and settings\administrator\桌面\mirroctlui\mirroctlui\mirroctl.cpp(5) : warning C4273: “CMirroCtl::CMirroCtl”: dll 链接不一致
1>        c:\documents and settings\administrator\桌面\mirroctlui\mirroctlui\mirroctl.h(21) : 参见“{ctor}”的前一个定义
1>c:\documents and settings\administrator\桌面\mirroctlui\mirroctlui\mirroctl.cpp(10) : warning C4273: “CMirroCtl::~CMirroCtl”: dll 链接不一致
1>        c:\documents and settings\administrator\桌面\mirroctlui\mirroctlui\mirroctl.h(22) : 参见“{dtor}”的前一个定义
1>MirroCtlUI.cpp
1>正在生成代码...
1>正在编译...
1>dllmain.cpp
1>正在编译资源...
1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1
1>Copyright (C) Microsoft Corporation.  All rights reserved.
1>正在编译资源清单...
1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1
1>Copyright (C) Microsoft Corporation.  All rights reserved.
1>正在链接...
1>LINK : 没有找到C:\Documents and Settings\Administrator\桌面\MirroCtlUI\Debug\MirroCtlUI.dll 或上一个增量链接没有生成它;正在执行完全链接
1>   正在创建库C:\Documents and Settings\Administrator\桌面\MirroCtlUI\Debug\MirroCtlUI.lib 和对象C:\Documents and Settings\Administrator\桌面\MirroCtlUI\Debug\MirroCtlUI.exp
1>MirroCtl.obj : error LNK2019: 无法解析的外部符号"public: __thiscall CEditEx::CEditEx(void)" (??0CEditEx@@QAE@XZ),该符号在函数"public: __thiscall CMirroCtl::CMirroCtl(void)" (??0CMirroCtl@@QAE@XZ) 中被引用
1>C:\Documents and Settings\Administrator\桌面\MirroCtlUI\Debug\MirroCtlUI.dll : fatal error LNK1120: 1 个无法解析的外部命令

#pragma once
#include "Bin/MirroCtlUI/GDI+/GDIxOper.h"
#include "Bin/MirroCtlUI/GDI+/GDIxDraw.h"
#include "Bin/MirroCtlUI/Slider/BitSlider.h"
#include "Bin/MirroCtlUI/Slider/BitItem.h"
#include "Bin/MirroCtlUI/Splitter/SplitterEx.h"
#include "Bin/MirroCtlUI/Button/GDIxButton.h"
#include "Bin/MirroCtlUI/Button/GDIxConButton.h"
#include "Bin/MirroCtlUI/Edit/EditEx.h"
#include "Bin/MirroCtlUI/Listctrl/XListCtrl.h"

#ifdef _HMIEXPORT_CLASS_EXT 
	#define HMIEXPORT __declspec(dllexport) 
#else
	#define HMIEXPORT __declspec(dllimport)
#endif

class CEditEx;
class HMIEXPORT CMirroCtl{
public:
	CMirroCtl(void);
	~CMirroCtl(void);
public:
	CEditEx* m_pEditEx;
};


#include "StdAfx.h"
#include "MirroCtl.h"

CMirroCtl::CMirroCtl(void)
{
	m_pEditEx = new CEditEx;
}

CMirroCtl::~CMirroCtl(void)
{
}
引用 14 楼 jason_wentzel 的回复:
导出类单独做一个.h文件,我看看你的导出类如何写的?
孤客天涯 2013-03-05
  • 打赏
  • 举报
回复
导出类单独做一个.h文件,我看看你的导出类如何写的?
mirro187_ 2013-03-05
  • 打赏
  • 举报
回复
看明白了,但是,实际操作有点问题;接口类CMirroCtl继承CEditEx就报错呢? 接口类不需要写在dllmain.cpp里吧?

MirroCtrl.h

#include "Bin/MirroCtlUI/GDI+/GDIxOper.h"
#include "Bin/MirroCtlUI/GDI+/GDIxDraw.h"
#include "Bin/MirroCtlUI/Slider/BitSlider.h"
#include "Bin/MirroCtlUI/Slider/BitItem.h"
#include "Bin/MirroCtlUI/Splitter/SplitterEx.h"
#include "Bin/MirroCtlUI/Button/GDIxButton.h"
#include "Bin/MirroCtlUI/Button/GDIxConButton.h"
#include "Bin/MirroCtlUI/Edit/EditEx.h"
#include "Bin/MirroCtlUI/Listctrl/XListCtrl.h"

class CMirroCtl:public CEditEx{
public:
	CMirroCtl(void);
	~CMirroCtl(void);
};

1>MirroCtl.obj : error LNK2019: 无法解析的外部符号"public: __thiscall CEditEx::CEditEx(void)" (??0CEditEx@@QAE@XZ),该符号在函数"public: __thiscall CMirroCtl::CMirroCtl(void)" (??0CMirroCtl@@QAE@XZ) 中被引用
1>MirroCtl.obj : error LNK2001: 无法解析的外部符号"protected: virtual struct AFX_MSGMAP const * __thiscall CEditEx::GetMessageMap(void)const " (?GetMessageMap@CEditEx@@MBEPBUAFX_MSGMAP@@XZ)
1>MirroCtl.obj : error LNK2001: 无法解析的外部符号"protected: virtual void __thiscall CEditEx::PreSubclassWindow(void)" (?PreSubclassWindow@CEditEx@@MAEXXZ)
1>MirroCtl.obj : error LNK2019: 无法解析的外部符号"public: virtual __thiscall CEditEx::~CEditEx(void)" (??1CEditEx@@UAE@XZ),该符号在函数"public: virtual __thiscall CMirroCtl::~CMirroCtl(void)" (??1CMirroCtl@@UAE@XZ) 中被引用
1>C:\Documents and Settings\Administrator\桌面\MirroCtlUI\Debug\MirroCtlUI.dll : fatal error LNK1120: 4 个无法解析的外部命令
引用 12 楼 jason_wentzel 的回复:
可能我描述不清, CTestManagerEx是一个导出类,是CTestManager基本上包装的一个导出类,CTestManager的类你不希望用户看到,用户也不需要引用你CTestManager这个头文件 如果你在导出类中把这个头文件include进来,那么用户引用你导出类的头文件的时候,是不是也把TestManager.h引进来了?而这个文件是用户根本不关心的也不需要的类,因此你在这里最……
mirroatl225 2013-03-05
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/390383180 http://bbs.csdn.net/topics/390383134 http://bbs.csdn.net/topics/390383179 关于调用导出类的方法还是不知道呀
引用 1 楼 jason_wentzel 的回复:
相应的lib文件引进来了吗?
孤客天涯 2013-03-05
  • 打赏
  • 举报
回复
可能我描述不清, CTestManagerEx是一个导出类,是CTestManager基本上包装的一个导出类,CTestManager的类你不希望用户看到,用户也不需要引用你CTestManager这个头文件 如果你在导出类中把这个头文件include进来,那么用户引用你导出类的头文件的时候,是不是也把TestManager.h引进来了?而这个文件是用户根本不关心的也不需要的类,因此你在这里最好只申明一个指针,而cpp中#include "TestManager.h",这样用户才不会把TestManager.h引进来 #include "TestManager.h"//放这里,用户引用你导出类的头文件时也会找TestManager.h这个文件 class HMIEXPORT CTestManagerEx { public: CTestManagerEx(){m_pTestManager = new CTestManager}; ~CTestManagerEx(); public: int GetXXX(){return m_pTestManager->xxx;};//函数实现建议放到cpp中去 void SetXXX(int iParam){m_pTestManager->xxx = iParam;};//函数实现建议放到cpp中去 private: CTestManager m_TestManager; }
孤客天涯 2013-03-05
  • 打赏
  • 举报
回复
上面说错了: 封装成dll的目的就是为了把一些用户不关心的东西不暴露出来,所以这里定义成一个指针合适一点
孤客天涯 2013-03-05
  • 打赏
  • 举报
回复
把这个类定义成员变量,那么这个头文件是需要把这个类的头文件include进来,这样,是不是调用dll的工程也需要这个他根本不关心的头文件的支持? 封装成dll的目的就是为了把一些用户不关心的东西暴露出来,所以这里定义成一个指针合适一点
mirro187_ 2013-03-05
  • 打赏
  • 举报
回复
http://blog.csdn.net/lostspeed/article/details/6172611 导出类,在调用DLL里也要使用导出类.h与被使用的内部.h吧! 这个隐藏内部调用的头文件的方法,是啥意思????
引用 6 楼 jason_wentzel 的回复:
这种方式就是隐式调用,当然生成的dll也需要,你需要把 dll放入你程序所在目录,这种方式.def文件中是不需要加东西的,因为不是导出函数,而是导出一个类,生成的dll一般根据你的要求生成debug版的和release的,调用时最好不要混用,就是release版的不要调用Debug版的dll,所以在头文件中一般链接各自的lib
Eleven 2013-03-05
  • 打赏
  • 举报
回复
http://blog.sina.com.cn/s/blog_52996aea0100cdkg.html 参考一下,希望对你有帮助~
mirro187_ 2013-03-05
  • 打赏
  • 举报
回复
大哥,dll封装的导出类,new了一个类。把这个类定义成员变量不行吗??? 调用dll中 显示调用是怎么调用啊
引用 6 楼 jason_wentzel 的回复:
这种方式就是隐式调用,当然生成的dll也需要,你需要把 dll放入你程序所在目录,这种方式.def文件中是不需要加东西的,因为不是导出函数,而是导出一个类,生成的dll一般根据你的要求生成debug版的和release的,调用时最好不要混用,就是release版的不要调用Debug版的dll,所以在头文件中一般链接各自的lib
孤客天涯 2013-03-05
  • 打赏
  • 举报
回复
这种方式就是隐式调用,当然生成的dll也需要,你需要把 dll放入你程序所在目录,这种方式.def文件中是不需要加东西的,因为不是导出函数,而是导出一个类,生成的dll一般根据你的要求生成debug版的和release的,调用时最好不要混用,就是release版的不要调用Debug版的dll,所以在头文件中一般链接各自的lib
mirro187_ 2013-03-05
  • 打赏
  • 举报
回复

#pragma once
#include "Bin/MirroCtlUI/GDI+/GDIxOper.h"
#include "Bin/MirroCtlUI/GDI+/GDIxDraw.h"
#include "Bin/MirroCtlUI/Slider/BitSlider.h"
#include "Bin/MirroCtlUI/Slider/BitItem.h"
#include "Bin/MirroCtlUI/Splitter/SplitterEx.h"
#include "Bin/MirroCtlUI/Button/GDIxButton.h"
#include "Bin/MirroCtlUI/Button/GDIxConButton.h"
#include "Bin/MirroCtlUI/Edit/EditEx.h"
#include "Bin/MirroCtlUI/Listctrl/XListCtrl.h"

#ifdef _HMIEXPORT_CLASS_EXT 
	#define HMIEXPORT __declspec(dllexport) 
#else
	#define HMIEXPORT __declspec(dllimport)
#endif


class HMIEXPORT CMirroCtl{
public:
	CMirroCtl(void);
	~CMirroCtl(void);
public:
	CEditEx* m_pEditEx;
};



error LNK2019: 无法解析的外部符号"public: __thiscall CEditEx::CEditEx(void)"

CMirroCtl::CMirroCtl(void)
{
    m_pEditEx = new CEditEx;//这个构造函数找不到呀!!!
}
引用 1 楼 jason_wentzel 的回复:
相应的lib文件引进来了吗?
mirro187_ 2013-03-05
  • 打赏
  • 举报
回复
大哥无语了。。。。。。。。。。。。。。。
引用 18 楼 jason_wentzel 的回复:
你dll工程中定义了_HMIEXPORT_CLASS_EXT吗? #ifdef _HMIEXPORT_CLASS_EXT #define HMIEXPORT __declspec(dllexport) #else #define HMIEXPORT __declspec(dllimport) #endif 这里的意思就是只有DLL是导出……
mirro187_ 2013-03-05
  • 打赏
  • 举报
回复
dll封装里,stdafx.h 加上#define _HMIEXPORT_CLASS_EXT; 现在就是报 CMirroCtl::CMirroCtl(void) { m_pEditEx = new CEditEx;//这个构造函数找不到呀!!! }

error LNK2019: 无法解析的外部符号"public: __thiscall CEditEx::CEditEx(void)"
引用 20 楼 jason_wentzel 的回复:
你看我上面的代码呀 这个头文件是你dll中定义的,你DLL中要把这个类导出去,那么你要在工程中定义_HMIEXPORT_CLASS_EXT这个宏,在dll的stdafx.h中加#define _HMIEXPORT_CLASS_EXT 第三方加你这个导出类的头文件时,因为不会定义_HMIEXPORT_CLASS_EXT,所以就是导入 # ifdef _HMIEXP……
孤客天涯 2013-03-05
  • 打赏
  • 举报
回复
你看我上面的代码呀 这个头文件是你dll中定义的,你DLL中要把这个类导出去,那么你要在工程中定义_HMIEXPORT_CLASS_EXT这个宏,在dll的stdafx.h中加#define _HMIEXPORT_CLASS_EXT 第三方加你这个导出类的头文件时,因为不会定义_HMIEXPORT_CLASS_EXT,所以就是导入 # ifdef _HMIEXPORT_CLASS_EXT # define HMIEXPORT __declspec(dllexport) # else # define HMIEXPORT __declspec(dllimport) # endif class CTestManager; class HMIEXPORT CTestManagerEx { public: CTestManagerEx(){m_pTestManager = new CTestManager}; ~CTestManagerEx(); public: int GetXXX(){return m_pTestManager->xxx;};//函数实现建议放到cpp中去 void SetXXX(int iParam){m_pTestManager->xxx = iParam;};//函数实现建议放到cpp中去 private: CTestManager *m_pTestManager; } // 一般在头文件中你可以加入下面代码,在这里把相应的lib引入进来 # ifndef _GENERAL_SUPPORT # if _DEBUG # pragma comment(lib,"XXX.lib") # else # pragma comment(lib,"XXX.lib") # endif # endif 这个导出头文件把dll生成的lib引用进来,因为dll不需要自己本身的lib,所以前面加了ifndef _GENERAL_SUPPORT,要想dll不引用lib,那么你也要在dll中定义_GENERAL_SUPPORT这个宏,也在stdafx.h加进来就可以了,你dll工程这样设置好之后,别人只要include你这个头文件,因为没有定义上面那两个宏,所以就会引入相应lib
mirro187_ 2013-03-05
  • 打赏
  • 举报
回复
我这是DLL封装代码。

你dll工程中定义了_HMIEXPORT_CLASS_EXT吗?
如何定义??????

lib????DLL封装代码用谁的lib???
引用 18 楼 jason_wentzel 的回复:
你dll工程中定义了_HMIEXPORT_CLASS_EXT吗? #ifdef _HMIEXPORT_CLASS_EXT #define HMIEXPORT __declspec(dllexport) #else #define HMIEXPORT __declspec(dllimport) #endif 这里的意思就是只有DLL是导出,引用DLL的地方才是导入……
孤客天涯 2013-03-05
  • 打赏
  • 举报
回复
你dll工程中定义了_HMIEXPORT_CLASS_EXT吗? #ifdef _HMIEXPORT_CLASS_EXT #define HMIEXPORT __declspec(dllexport) #else #define HMIEXPORT __declspec(dllimport) #endif 这里的意思就是只有DLL是导出,引用DLL的地方才是导入,一般引用DLL的工程只要加头文件就可以了,因为不会有_HMIEXPORT_CLASS_EXT的定义,所以是导入,另外,你lib加进来没有?
mirro187_ 2013-03-05
  • 打赏
  • 举报
回复
1>c:\documents and settings\administrator\桌面\mirroctlui\mirroctlui\mirroctl.cpp(5) : warning C4273: “CMirroCtl::CMirroCtl”: dll 链接不一致 1> c:\documents and settings\administrator\桌面\mirroctlui\mirroctlui\mirroctl.h(21) : 参见“{ctor}”的前一个定义 1>c:\documents and settings\administrator\桌面\mirroctlui\mirroctlui\mirroctl.cpp(10) : warning C4273: “CMirroCtl::~CMirroCtl”: dll 链接不一致
引用 16 楼 mirro187_ 的回复:
error LNK2019: 无法解析的外部符号"public: __thiscall CEditEx::CEditEx(void)" 引用 14 楼 jason_wentzel 的回复:导出类单独做一个.h文件,我看看你的导出类如何写的?
加载更多回复(5)

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧