天天看点

基于OpenCasCade的程序发布问题

基于OpenCasCade二次开发了一个程序,想采用简单的copy的发布(部署)方式。

但在发布时遇到了很多问题。总结一下。

首先将所有所需的dll拷贝到了执行目录下,然后将程序copy到一台未安装OpenCasCade的机器上运行出错,信息如下:

即出错信息为:Runtime error! This application has requested the Runtime to terminate it in an unusual wya.

上网查了好久,所有的处理方法都不对路,极度郁闷的思索中。首先报的不是dll未找到,说明不是dll未添加,那是什么错呢?抱着尝试的态度,删除了OpenCasCade添加的所有环境变量,惊喜的发现,本机上运行也出现上述错误。

初步认为是调用了某个未知的dll,一条一条的添加环境变量,结果大出所料,当添加环境变量set CASROOT=E:\OpenCASCADE6.1.0\ros时,无错误发生。反复测试后确定,就是这个环境变量在作祟。并且,此环境变量的值对我的程序并不重要,只要存在就可以正常运行。

基于这些,判断肯定是OpenCasCade的类库中直接绑定了该环境变量,并在没有发现该变量的时候莫名的抛出了这样一个异常。

通过debug,将罪魁祸首定格在Visualization这个工程。仔细查找发现了如下代码:

Aspect_Driver::Aspect_Driver () { 

    OSD_Environment CSF_MDTVFontDirectory ; 

    char *fontdir , *casroot ; 

    fontdir =    getenv("CSF_MDTVFontDirectory" ); 

    if ( !fontdir) { 

        casroot    = getenv("CASROOT"); 

        if ( casroot ) { 

            TCollection_AsciiString CasRootString (casroot); 

            CasRootString += "/src/FontMFT" ;    

            CSF_MDTVFontDirectory = OSD_Environment(CasRootString.ToCString()); 

        } else { 

            cout << " CASROOT or CSF_MDTVFontDirectory    are mandatory to use this fonctionnality " << endl; 

            Standard_Failure::Raise ( "CSF_MDTVTexturesDirectory and CASROOT not setted " ); 

        } 

    } else { 

        CSF_MDTVFontDirectory = OSD_Environment("CSF_MDTVFontDirectory"); 

    } 

    TCollection_AsciiString dir(CSF_MDTVFontDirectory.Value()); 

    dirMFTisDefined = (dir.Length() > 0); 

    myUseMFT = Standard_True; 

    myColorMapIsDefined = Standard_False;        

    myWidthMapIsDefined = Standard_False;        

    myTypeMapIsDefined    = Standard_False;        

    myFontMapIsDefined    = Standard_False;        

}

该代码访问了该环境变量,并且并没做什么实事,把casroot变量写死,重新编译通过。程序可以正常执行。

整个过程是个痛苦的经历,提醒大家注意这个问题,类似的代码不止出现在一个工程中,对我而言修改此处就可以正常工作了(虽然这样修改不是什么好习惯)。如果下次大家碰到类似问题,可以参考一下。

本文转自 duguguiyu 51CTO博客,原文链接:http://blog.51cto.com/duguguiyu/363283,如需转载请自行联系原作者

继续阅读