首页 > 代码库 > VS2008(VC9)基于OpencasCade发布软件 以及 sxstrace.exe 工具的使用

VS2008(VC9)基于OpencasCade发布软件 以及 sxstrace.exe 工具的使用

关键字:

※.  在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 。 然后整个问题终于解决,项目也算是能交付了。 哈哈,一路走来,实属不易! 一句话

越努力,越幸运!