关于不同版本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库