写了一个小程序给同事用,在Debug模式下运行都正常,只要Release运行就报错QSqlDataBase:QSQLite driver not loaded。采用windeployqt打包整个程序后也是报这个错。百思不得其解。
以下是采用windeployqt打包后的目录,sqldrivers(也就是依赖的sql动态库)直接被生成到程序目录下。
上网查找解决方案,给出的回答都是:把依赖的动态库放到程序目录下。
尝试把sqldrivers下的全部动态库直接拷贝到程序目录下,也还是不行。
突然看到网上一位博主贴出的输出程序依赖动态库路径的方法:
QDir pluginsDir(QLibraryInfo::location(QLibraryInfo::PluginsPath)); QString path = pluginsDir.absolutePath(); qDebug("Plugins path : %s", qPrintable(path));
于是在程序中添加语句尝试输出。
艾玛,这一输出才发现:动态库的依赖路径是plugins文件夹,于是我把所有的依赖动态库全部放到plugins文件夹下,结果竟然又失败了。。灵机一动,我把sqldrivers整个文件夹放到plugins文件夹下,结果成功了。。(神坑啊!!windeployqt并没有直接打包生成到正确的路径下)
本文到这里就该结束了。
但是,当博主将plugins-sqldrivers文件夹放到Release目录下,回到Qtcreator试图运行Release程序的时候,又再次报错了,不过这次直接能看到依赖的动态库目录。
原来Release程序在生成目录直接打开,依赖的动态库路径和从Qtcreator打开并不一样!!!
如图,从Release目录直接打开是依赖Release/Plugins,而从Qtcreator直接运行Release程序,是依赖的工程目录下的Plugins!!!
将plugins-sqldrivers文件夹放到工程目录下,就成功了!
折腾了两天啊,祝各位避坑