3. QGis二次开发项目实践一之解决“无法定位程序输入点“
·
前言
- 本章讲述实现本项目实现过程中遇到的QGis二次开发库版本和Qt以及其他动态库的版本匹配问题
问题复现
- 本项目是要作为一个子模块集成到用户的项目中
- 本项目最初的开发环境为QGis3.28+Qt5.15.2,而当时并未问清楚用户开发环境
- 所以交付给用户之后,出现了类似下图的问题

- 出现该问题后才知道用户的Qt版本为Qt5.9.6
"无法定位程序输入点"原因
- 生成exe时所使用的lib文件的版本,和在运行exe时所调用的dll的版本不一致。
- 可以参考stackoverflow的一个帖子The procedure entry point could not be located in the dynamic link library Core.dll
you don’t have multiple versions of ludocore.dll on your system, do you? Procedure entry points errors usually mean: you compiled your project against ludocore.lib version x, and when running the program, it uses ludocore.dll version y, and version y does not define LudoMemory::Destroy().
- 翻译如下
你编译你的项目时使用了版本为x的ludocore.lib库,但是当运行程序时,它使用了版本为y的ludocore.dll库,而版本y并未定义LudoMemory::Destroy()函数。
- 具体到我们的项目上,由于开发环境是Qt5.15.2,而用户环境是Qt5.9.6,所以是dll版本问题导致了这个问题
问题解决
- 两个方法:
- 用户的Qt版本升级为5.15.2
- QGis的版本降级,降级到使用Qt5.9版本编译的QGis
-
由于用户的Qt版本不能修改,所以只能采用方法1了
-
QGis降级过程
- QGis3.34对应Qt5.15.13

- QGis3.28对应Qt5.15.3

- QGis3.16对应Qt5.11.2

- QGis3.0.3对应Qt5.9.2

- QGis3.34对应Qt5.15.13
-
最终使用QGis3.0.3和用户的环境匹配上了
总结
- 需求挖掘阶段要问清楚用户对QGis版本的要求,如果用户要求Qt5.9.6+QGis3.28,那么就无法实现了
更多推荐
所有评论(0)