關於不同版本Halcon編寫的c++程式碼報錯問題
最近收到一個客戶發來的一個基於Halcon的C++軟體工程,客戶需要解決其中bug。將工程開啟後發現有多處程式碼報錯,通過配置好VS專案屬性後代碼報錯消除,但接下來出現一系列問題。
問題1:生成解決方案報錯
當對工程生成解決方案時VS報大量LNK2001及LNK2019的 無法解析外部符號
錯誤,如下圖:
通過定位錯誤的位置,發現都為Halcon中的函式無法解析,根據網上搜到的方法,通過檢查VS配置以及複製halcon.dll及halconcpp.dll至Debug目錄下均無效,最後通過聯絡客戶發現,客戶使用Halcon10開發,而我電腦為Halcon12。由此聯想到不同版本的dll無法通用故重新複製Halcon10版本的相關dll到Debug目錄下,重新生成問題依舊。
再次考慮是否是不同版本的標頭檔案問題,故又將Halcon10下的bin、lib、include資料夾複製到本機與Halocn12相似目錄下,重新修改VS配置,將所有路徑改為Halcon10相關路徑下,此時重新生成發現已經生成成功。接下來就到了第二個問題。
問題2:Halcon運算元報異常
生成解決方案後除錯程式,客戶程式碼中使用Halcon運算元來實現開啟相機並採圖,但程式執行時提示無法連線相機,同定位發現為Halcon運算元open_framegrabber報異常,運算元引數都正確,獲取錯誤程式碼為8600,查詢後表示無法開啟動態連結庫,網上有關open_framegrabber的錯誤解決不多,只提到將Halcon中對應的相機驅動dll檔案複製到程式目錄下,根據開啟相機型別不同選擇對應驅動(例如’hAcqGigEVision.dll’),同時還有一個名為’pthreadVC2.dll’的動態連線庫也需要複製進去。
完成後執行程式,open_framegrabber依然過不去,錯誤程式碼5132,表示相機無法初始化,但硬體一切正常,Halcon軟體能正常採圖,無解。
最後只能在另一臺測試機上安裝Halcon10後一切正常。由於耽擱太久也就先妥協了。
最終
在閒時間裡對該工程重新除錯,將配置全部改為Halcon12路徑,重新面對問題1,根據報錯資訊應該確認為VS找不到對應的函式實現庫,在瀏覽Halcon的bin目錄下的dll檔案時發現一個“halconcpp10.dll”。而開始的時候只關注了”halconcpp.dll”猜想該檔案會不會是為了相容以前版本的cpp運算元,嘗試將該DLL檔案複製到程式目錄下,同時在VS配置中“聯結器-輸入-附加依賴項”中新增對應名稱的.lib檔案(halconcpp10.lib),重新生成解決方案發現問題已經不再,同時執行程式open_framegrabber也能正常通過,至此該工程已經能才正常執行。
總結
Halcon10程式改為Halcon12環境下不僅要更換VS配置路徑及引數,還要多複製個halconcpp10.dll庫及新增halconcpp10.lib庫