天天看點

基于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,如需轉載請自行聯系原作者

繼續閱讀