VS2008(VC9)基于OpencasCade发布软件 以及 sxstrace.exe 工具的使用
2014-06-10 11:09
816 查看
关键字:
※. 在Release版本中, “在共享DLL中使用MFC”----程序能编译成功, 但如果使用 “在静态库中使用MFC”-- Build失败,出现各种连接错误。
※. 在别的Windows机器上运行,运行,出现错误如下 "应用程序正常初始化(Oxc0150002)失败 ,请单击确定关闭应用程序,"
这就是在本次使用VS2008发布软件过程中碰到的问题。这两个问题的解决,持续了两个月之久。现在终于将问题解决了。现将问题解决过程记录如下:
1. 背景是这样:使用VS2008基于OpenCasCade几何引擎开发了一款三维建模软件,由于OpenCasCade包含的库以及第三方库太多,所以在目标机上采用直接先安装OpenCasCade Technology的方式(免去复制各种库的烦恼),再安装VS发布的软件。 碰到的第一个问题就是
在Release版本中, “在共享DLL中使用MFC”----程序能编译成功, 但如果使用 “在静态库中使用MFC”-- Build失败
主要表现:当在项目属性中,设置在共享DLL中使用MFC时,程序能够正常编译。但是当设置成为 在静态库中使用MFC时,出现以下这种连接错误。
1>OcafApp.obj : error LNK2019: 无法解析的外部符号 "public: static struct CRuntimeClass const OCC_3dChildFrame::classOCC_3dChildFrame" (?classOCC_3dChildFrame@OCC_3dChildFrame@@2UCRuntimeClass@@B),该符号在函数
"public: virtual int __thiscall COcafApp::InitInstance(void)" (?InitInstance@COcafApp@@UAEHXZ) 中被引用
1>OcafApp.obj : error LNK2019: 无法解析的外部符号 "public: static struct CRuntimeClass const OCC_3dView::classOCC_3dView" (?classOCC_3dView@OCC_3dView@@2UCRuntimeClass@@B),该符号在函数 "public:
virtual int __thiscall COcafApp::InitInstance(void)" (?InitInstance@COcafApp@@UAEHXZ) 中被引用
1>OcafDoc.obj : error LNK2001: 无法解析的外部符号 "public: static struct CRuntimeClass const OCC_3dView::classOCC_3dView" (?classOCC_3dView@OCC_3dView@@2UCRuntimeClass@@B)
1>OcafDoc.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall CResultDialog::SetText(class ATL::CStringT<char,class StrTraitMFC<char,class ATL::ChTraitsCRT<char> > > &)"
(?SetText@CResultDialog@@QAEXAAV?$CStringT@DV?$StrTraitMFC@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@@Z),该符号在函数 "public: virtual int __thiscall COcafDoc::OnNewDocument(void)" (?OnNewDocument@COcafDoc@@UAEHXZ) 中被引用
1>OcafDoc.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall CResultDialog::SetTitle(class ATL::CStringT<char,class StrTraitMFC<char,class ATL::ChTraitsCRT<char> > > &)"
(?SetTitle@CResultDialog@@QAEXAAV?$CStringT@DV?$StrTraitMFC@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@@Z),该符号在函数 "public: virtual int __thiscall COcafDoc::OnNewDocument(void)" (?OnNewDocument@COcafDoc@@UAEHXZ) 中被引用
为了解决以上错误,查了很多资料,网上大部分的资料都是说lib库设置不正确云云。所以各种设置lib,但都不好用。
最后突然得到如下真经,问题解决。
在Preprocessor中定义_AFXDLL, PROJECT->SETING->C/C++->PREPROCESSOR->定义 _AFXDLL,完毕。
如果它提示:fatal error C1189: #error : Please use the /MD switch for _AFXDLL builds
就这样改:C/C++->Code Generation->Multithread DLL (即实现/MD选项).
其实从 http://blog.csdn.net/educast/article/details/9858015 中我们可以知道,并不是我们干了什么,其实我们只是换了种方式设置动态库而已。
2. 既然VS能发布Release版本的运行程序,那就直接发布,生成目标exe文件,在本实验中,生成的是Ocaf.exe文件。
3. 将可执行文件Ocaf.exe 拷贝到其他主机上(这里,其他主机有两点要求 1, windows OS, 2 已经安装好OpenCasCade Technology)。高高兴兴地一运行Ocaf.exe,出现以下错误
![](https://img-blog.csdn.net/20140610104345765)
顿时心伤无比,因为Ocaf.exe在原来机器上运行得好好地。怎么跑到其他机器上就不行了呢。。
4. 伤心过后,继续调试。 由于属于应用程序错误,所以查看系统日志(开始->控制面板->计算机管理->事件查看器->应用程序,这是XP查看系统日志的方法。win7 查看系统日志方法。 开始->控制面板->系统与安全->管理工具->查看事件日志),探究一下究竟是什么问题。
发现如下问题
![](https://img-blog.csdn.net/20140610105034546)
是一个SideBySide类型的错误,从 http://www.cnblogs.com/killmyday/articles/1394596.html 中了解一下这类错误的原因。
所以根据指示,不得不学着使用sxstrace.exe工具来进行星系诊断!
5. 接下来使用sxstrace.exe工具,在win7中,使用管理员身份运行 cmd.exe
![](https://img-blog.csdn.net/20140610105342812)
进入命令行过后,运行:
sxstrace.exe Trace -logfile:test.log
回车
这时候开启了sxstrace监听程序,这时候,再将Ocaf.exe这个可执行文件运行一次,当然依然报 ”应用程序正常初始化(Oxc0150002)失败
,请单击确定关闭应用程序“这个错误。 但不要紧。关闭这个错误,回到命令行。点击回车,结束监听。
这时候,已经在当前目录下生成了一个test.log的日志文件,但这个无法打开,所以需要运行:
sxstrace.exe Parse -logfile:test.log -outfile:test.txt
回车
通过这样,把test.log 转换到test.txt中,这样就可以阅读test.log中的信息了。
6 test.log中信息基本上都是这样子的
![](https://img-blog.csdn.net/20140610105941062)
这就是刚才那个 “Oxc0150002)失败”错误产生的原因。
仔细阅读可以看到以下信息:
![](https://img-blog.csdn.net/20140610110126546)
从这上面可以看出,系统尝试从C:\Windows\system32\Microsoft.VC90.DebugCRT目录下找几个文件,可是失败了。
然后手动打开Windows\system32中一看,居然没有所说的Microsoft.VC90.DebugCRT这个文件夹。
问题终于找到了!!!
所以这时候,从源机器上(VS发布程序的这台机器)上,在VS的安装目录
C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\x86
下,就有这个文件夹,Microsoft.VC90.DebugCRT。
果断复制,然后粘贴到目标主机的 Windows\system32下面,再运行。
一切OK!。
7 。 然后整个问题终于解决,项目也算是能交付了。
哈哈,一路走来,实属不易! 一句话
越努力,越幸运!
※. 在Release版本中, “在共享DLL中使用MFC”----程序能编译成功, 但如果使用 “在静态库中使用MFC”-- Build失败,出现各种连接错误。
※. 在别的Windows机器上运行,运行,出现错误如下 "应用程序正常初始化(Oxc0150002)失败 ,请单击确定关闭应用程序,"
这就是在本次使用VS2008发布软件过程中碰到的问题。这两个问题的解决,持续了两个月之久。现在终于将问题解决了。现将问题解决过程记录如下:
1. 背景是这样:使用VS2008基于OpenCasCade几何引擎开发了一款三维建模软件,由于OpenCasCade包含的库以及第三方库太多,所以在目标机上采用直接先安装OpenCasCade Technology的方式(免去复制各种库的烦恼),再安装VS发布的软件。 碰到的第一个问题就是
在Release版本中, “在共享DLL中使用MFC”----程序能编译成功, 但如果使用 “在静态库中使用MFC”-- Build失败
主要表现:当在项目属性中,设置在共享DLL中使用MFC时,程序能够正常编译。但是当设置成为 在静态库中使用MFC时,出现以下这种连接错误。
1>OcafApp.obj : error LNK2019: 无法解析的外部符号 "public: static struct CRuntimeClass const OCC_3dChildFrame::classOCC_3dChildFrame" (?classOCC_3dChildFrame@OCC_3dChildFrame@@2UCRuntimeClass@@B),该符号在函数
"public: virtual int __thiscall COcafApp::InitInstance(void)" (?InitInstance@COcafApp@@UAEHXZ) 中被引用
1>OcafApp.obj : error LNK2019: 无法解析的外部符号 "public: static struct CRuntimeClass const OCC_3dView::classOCC_3dView" (?classOCC_3dView@OCC_3dView@@2UCRuntimeClass@@B),该符号在函数 "public:
virtual int __thiscall COcafApp::InitInstance(void)" (?InitInstance@COcafApp@@UAEHXZ) 中被引用
1>OcafDoc.obj : error LNK2001: 无法解析的外部符号 "public: static struct CRuntimeClass const OCC_3dView::classOCC_3dView" (?classOCC_3dView@OCC_3dView@@2UCRuntimeClass@@B)
1>OcafDoc.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall CResultDialog::SetText(class ATL::CStringT<char,class StrTraitMFC<char,class ATL::ChTraitsCRT<char> > > &)"
(?SetText@CResultDialog@@QAEXAAV?$CStringT@DV?$StrTraitMFC@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@@Z),该符号在函数 "public: virtual int __thiscall COcafDoc::OnNewDocument(void)" (?OnNewDocument@COcafDoc@@UAEHXZ) 中被引用
1>OcafDoc.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall CResultDialog::SetTitle(class ATL::CStringT<char,class StrTraitMFC<char,class ATL::ChTraitsCRT<char> > > &)"
(?SetTitle@CResultDialog@@QAEXAAV?$CStringT@DV?$StrTraitMFC@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@@Z),该符号在函数 "public: virtual int __thiscall COcafDoc::OnNewDocument(void)" (?OnNewDocument@COcafDoc@@UAEHXZ) 中被引用
为了解决以上错误,查了很多资料,网上大部分的资料都是说lib库设置不正确云云。所以各种设置lib,但都不好用。
最后突然得到如下真经,问题解决。
在Preprocessor中定义_AFXDLL, PROJECT->SETING->C/C++->PREPROCESSOR->定义 _AFXDLL,完毕。
如果它提示:fatal error C1189: #error : Please use the /MD switch for _AFXDLL builds
就这样改:C/C++->Code Generation->Multithread DLL (即实现/MD选项).
其实从 http://blog.csdn.net/educast/article/details/9858015 中我们可以知道,并不是我们干了什么,其实我们只是换了种方式设置动态库而已。
2. 既然VS能发布Release版本的运行程序,那就直接发布,生成目标exe文件,在本实验中,生成的是Ocaf.exe文件。
3. 将可执行文件Ocaf.exe 拷贝到其他主机上(这里,其他主机有两点要求 1, windows OS, 2 已经安装好OpenCasCade Technology)。高高兴兴地一运行Ocaf.exe,出现以下错误
顿时心伤无比,因为Ocaf.exe在原来机器上运行得好好地。怎么跑到其他机器上就不行了呢。。
4. 伤心过后,继续调试。 由于属于应用程序错误,所以查看系统日志(开始->控制面板->计算机管理->事件查看器->应用程序,这是XP查看系统日志的方法。win7 查看系统日志方法。 开始->控制面板->系统与安全->管理工具->查看事件日志),探究一下究竟是什么问题。
发现如下问题
是一个SideBySide类型的错误,从 http://www.cnblogs.com/killmyday/articles/1394596.html 中了解一下这类错误的原因。
所以根据指示,不得不学着使用sxstrace.exe工具来进行星系诊断!
5. 接下来使用sxstrace.exe工具,在win7中,使用管理员身份运行 cmd.exe
进入命令行过后,运行:
sxstrace.exe Trace -logfile:test.log
回车
这时候开启了sxstrace监听程序,这时候,再将Ocaf.exe这个可执行文件运行一次,当然依然报 ”应用程序正常初始化(Oxc0150002)失败
,请单击确定关闭应用程序“这个错误。 但不要紧。关闭这个错误,回到命令行。点击回车,结束监听。
这时候,已经在当前目录下生成了一个test.log的日志文件,但这个无法打开,所以需要运行:
sxstrace.exe Parse -logfile:test.log -outfile:test.txt
回车
通过这样,把test.log 转换到test.txt中,这样就可以阅读test.log中的信息了。
6 test.log中信息基本上都是这样子的
这就是刚才那个 “Oxc0150002)失败”错误产生的原因。
仔细阅读可以看到以下信息:
从这上面可以看出,系统尝试从C:\Windows\system32\Microsoft.VC90.DebugCRT目录下找几个文件,可是失败了。
然后手动打开Windows\system32中一看,居然没有所说的Microsoft.VC90.DebugCRT这个文件夹。
问题终于找到了!!!
所以这时候,从源机器上(VS发布程序的这台机器)上,在VS的安装目录
C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\x86
下,就有这个文件夹,Microsoft.VC90.DebugCRT。
果断复制,然后粘贴到目标主机的 Windows\system32下面,再运行。
一切OK!。
7 。 然后整个问题终于解决,项目也算是能交付了。
哈哈,一路走来,实属不易! 一句话
越努力,越幸运!
相关文章推荐
- vc2013 时错误 应用程序无法启动,因为应用程序的并行配置不正确。有关详细信息,请参阅应用程序事件 日志,或使用命令行 sxstrace.exe 工具。
- 分形艺术网发布:分形软件Apophysis视频教程第八讲——IFS码的使用以及Sierpinski分形的制作
- 项目中基于Rest的Wcf服务发布以及iBatisNet框架的使用(下)
- 使用基于Node.js的构建工具Grunt来发布ASP.NET MVC项目
- zookeeper的简单安装以及基于intellij idea的可视化工具的使用
- 基于linux的正则表达式以及工具的使用
- 基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - 4.0 最新发布版本 -下载使用说明
- Qt使用自带的windeployqt 生成exe来发布软件
- Android软件开发之通讯录——添加联系人以及SQLite工具的简单使用
- 基于VS2008MFCTeeChart绘图软件加入控件、类以及简单程序
- java反编译软件jd-gui.exe以及使用javassist修改class文件 .
- 向自己的模块添加错误代码_使用vc自带的工具MC创建资源并将其添加至DLL或EXE中
- 使用ILMerge工具合并把dll与exe合并以及把多个dll合并
- 工具链无效。新 App 和 App 更新必须使用公共(正式)版 Xcode 6 或更高版本以及 iOS 8 SDK 或更高版本来构建。请勿提交 Beta 版软件构建的 App。
- 最近发布了1个手机软件 《网站监测助手 KJAVA手机版 (站长实用工具) 》,欢迎大家使用
- 项目中基于Rest的Wcf服务发布以及iBatisNet框架的使用(上)
- "《数据结构》实验一:VC编程工具的灵活使用“以及总结
- 第一章 思维导图 以及 《数据结构》实验一: VC编程工具的灵活使用
- 程序打包,"错误:应用程序无法启动,因为应用程序的并行配置不正确。有关详细信息,请参阅应用程序事件日志,或使用命令行sxstrace.exe"工具解决办法
- 【转】Qt使用自带的windeployqt 生成exe来发布软件