解决导出的MFC扩展动态库在调用时出现Debug Assertion Failed错误的问题
2010-06-28 16:35
691 查看
导出一个从CView继承的类MapView,新建一个单文档工程,将里面视图类的基类改为MapView类,debug模式下运行出现如下错误(导出MapView类的动态库是Release版本),点击忽略系统可正常运行,将导出MapView类的动态库编译为Debug版本,系统正常运行,debug模式下系统正常运行但是release模式下会出问题。
原来导出动态库的方式如下:
#ifndef _BLUEMAP_MAPVIEW_
#define BLUEMAP_MAPVIEW _declspec(dllimport)
#else
#define BLUEMAP_MAPVIEW _declspec(dllexport)
#endif
class BLUEMAP_MAPVIEW MapView : public CView
{
DECLARE_DYNCREATE(MapView)
…………………………………………….动态库代码段
};
#ifndef _BLUEMAP_MAPVIEW_
#ifdef _DEBUG
#pragma comment(lib, "MapView.lib")
#pragma message("debug模式下自动链接MapView.lib")
#else
#pragma comment(lib, "MapView.lib")
#pragma message("非debug模式下自动链接MapView.lib")
#endif
#endif
解决方案:
第一步:将MapView在Debug和Release模式下以不同的动态库方式导出
动态库头文件如下:
#ifndef _BLUEMAP_MAPVIEW_
#define BLUEMAP_MAPVIEW _declspec(dllimport)
#else
#define BLUEMAP_MAPVIEW _declspec(dllexport)
#endif
class BLUEMAP_MAPVIEW MapView : public CView
{
DECLARE_DYNCREATE(MapView)
……………………………………………………动态库代码段
};
#ifndef _BLUEMAP_MAPVIEW_
#ifdef _DEBUG
#pragma comment(lib, "DebugMapView.lib")
#pragma message("debug模式下自动链接DebugMapView.lib")
#else
#pragma comment(lib, "ReleaseMapView.lib")
#pragma message("非debug模式下自动链接ReleaseMapView.lib")
#endif
#endif
以上红色代码使程序在装载动态库时根据当前的编译环境(debug环境或release环境)装入适用不同类型的动态库。
第二步:设置导出动态库的名称
点击动态库工程属性分别设置debug版和release版动态库名称。
设置debug版动态库名称为DebugMapView.dll
设置Release版动态库名称为ReleaseMapView.dll
第三步:编译生成不同版本的动态库文件。
编译为debug版
双击工程的***.def文件
将LIBRARY 后面的文件名改为 DebugeMapView,编译生成动态库文件
编译为Release版
同样的方法,将LIBRARY 后面的文件名改为ReleaseMapView并编译生成动态库文件。
注:为了避免在切换编译模式时不断修改***.def文件,可以再新建一个不同名称的***.def文件并修改工程属性,将Modul Definition file改为合适的*.def文件,这样就不需要每次都修改*.def中的内容了。
接下来再运行前面的单文档工程发现无论是debug模式下或release模式下系统都能正常运行。
个人感觉这是一种不得已的方法,欢迎高手提出更好的方案。
原来导出动态库的方式如下:
#ifndef _BLUEMAP_MAPVIEW_
#define BLUEMAP_MAPVIEW _declspec(dllimport)
#else
#define BLUEMAP_MAPVIEW _declspec(dllexport)
#endif
class BLUEMAP_MAPVIEW MapView : public CView
{
DECLARE_DYNCREATE(MapView)
…………………………………………….动态库代码段
};
#ifndef _BLUEMAP_MAPVIEW_
#ifdef _DEBUG
#pragma comment(lib, "MapView.lib")
#pragma message("debug模式下自动链接MapView.lib")
#else
#pragma comment(lib, "MapView.lib")
#pragma message("非debug模式下自动链接MapView.lib")
#endif
#endif
解决方案:
第一步:将MapView在Debug和Release模式下以不同的动态库方式导出
动态库头文件如下:
#ifndef _BLUEMAP_MAPVIEW_
#define BLUEMAP_MAPVIEW _declspec(dllimport)
#else
#define BLUEMAP_MAPVIEW _declspec(dllexport)
#endif
class BLUEMAP_MAPVIEW MapView : public CView
{
DECLARE_DYNCREATE(MapView)
……………………………………………………动态库代码段
};
#ifndef _BLUEMAP_MAPVIEW_
#ifdef _DEBUG
#pragma comment(lib, "DebugMapView.lib")
#pragma message("debug模式下自动链接DebugMapView.lib")
#else
#pragma comment(lib, "ReleaseMapView.lib")
#pragma message("非debug模式下自动链接ReleaseMapView.lib")
#endif
#endif
以上红色代码使程序在装载动态库时根据当前的编译环境(debug环境或release环境)装入适用不同类型的动态库。
第二步:设置导出动态库的名称
点击动态库工程属性分别设置debug版和release版动态库名称。
设置debug版动态库名称为DebugMapView.dll
设置Release版动态库名称为ReleaseMapView.dll
第三步:编译生成不同版本的动态库文件。
编译为debug版
双击工程的***.def文件
将LIBRARY 后面的文件名改为 DebugeMapView,编译生成动态库文件
编译为Release版
同样的方法,将LIBRARY 后面的文件名改为ReleaseMapView并编译生成动态库文件。
注:为了避免在切换编译模式时不断修改***.def文件,可以再新建一个不同名称的***.def文件并修改工程属性,将Modul Definition file改为合适的*.def文件,这样就不需要每次都修改*.def中的内容了。
接下来再运行前面的单文档工程发现无论是debug模式下或release模式下系统都能正常运行。
个人感觉这是一种不得已的方法,欢迎高手提出更好的方案。
相关文章推荐
- 最近在ArcGIS Engine开发中关于调用gp工具过程出现COM 组件的调用返回了错误 HRESULT E_FAIL 错误的解决方法 和 学习oracle中遇到的一些问题总结
- 解决调用本地时间做的时间显示中可能出现的时间调用错误的问题
- MFC扩展DLL调用对话框,测试的时候报错问题的解决
- w7 下配置IIS ,出现的IIS 7.5 HTTP 错误 404.3 - Not Found解决办法及 调用32位动态库问题
- 关于多文档MFC从xp系统上移植到win7上出现错误的问题解决经验
- EWS编程问题三:调用WebService出现 请求因 HTTP 状态 404 失败 Not Found 错误(解决)
- 解决android调用IIS Express中的WCF服务时,出现错误400问题
- Python调用TensorFlow出现“Cannot evaluate tensor using `eval()`: No default session is registered”错误问题的解决
- 一次调用动态库时出现问题的解决历程
- 解决导出excel中出现的错误:只能在执行 Render() 的过程中调用 RegisterForEventValidation
- PHPCMS V9跨站调用推荐位出现URL连接为空问题的解决方法
- 今天电脑突然出现问题: 请安装 TCP/IP 协议 错误 10106 【已解决·】
- 解决eclipse导出javadoc时的“错误: 编码GBK的不可映射字符”问题(转)
- VS2008编译的mfc程序在没有安装的机子上运行出现配置错误的问题
- 巧妙解决问题:&CMFCcodeDlg::RunCommands”创建指向成员的指针。MFC多线程调用要求调用的接口必须是全局函数或静态成员函数
- 关于Visual Studio 2013 编译 multi-byte character set MFC程序出现 MSB8031 错误的解决办法
- Struts2初学devMode发展模式,更改action出现映射错误解决办法(原因是版本问题,轻松解决)
- 解决64位windows server 2008上调用Excel组件出现0x800A03EC错误
- 解决Flex4双向绑定因数据类型不同而出现编译错误问题
- command line warning #10006: ignoring unknown option '/NODEFAULTLIB'错误解决(XPDF编译时出现的问题)