当前位置: 代码迷 >> QT开发 >> Qt编译库移植有关问题
  详细解决方案

Qt编译库移植有关问题

热度:320   发布时间:2016-04-25 02:53:23.0
Qt编译库移植问题?
因为项目需要,在机器A上编译了64位的QT库。编译的时候加入了mysql数据库插件的编译。编译完成后,在A上可以顺利的利用qt creator进行开发,同时可以调用起mysql插件。后来将编译好的库移植到机器B上,提示qmake找不到,于是在机器B上,将qmake重新生成之后,就可以正常使用。但是在机器B上开发带mysql的项目时,总是提示plugin/sqldrivers总是提示找不到mysql的驱动,但sqldrivers之下确实存在mysql的插件,请问是不是因为编译时把机器A上的路径写入了编译环境了?那这个问题怎么解决呢?
------解决思路----------------------
1.确保你的bin目录下有qt.conf这个文件,可以从其他的发布中拷贝;
2.可以试试qtpaths.exe更改Qt的目标路径,就在qmake.exe所在的bin目录下,但是注意新的路径明长度不能长于编译时设置的目标路径;
3.qmake.exe最好使用Qt编译时一起生成的版本,否则不知道会出些什么幺蛾子;
4.个人认为QtCore中在搜索插件的路径的选择上存在问题,QtCreator中设置的运行时环境变量QTDIR不起作用,如果你有兴趣的话可以试一试我做的补丁包(http://download.csdn.net/detail/johnyork/8790377),不过我的补丁是针对MSYS2下MinGW编译器的,如果你的编译环境不是MSYS2+MinGW-w64的话,你只有提取其中的.h和.cpp文件来手动覆盖Qt源码中的相应文件了。
------解决思路----------------------
引用:
Quote: 引用:

1.确保你的bin目录下有qt.conf这个文件,可以从其他的发布中拷贝;
2.可以试试qtpaths.exe更改Qt的目标路径,就在qmake.exe所在的bin目录下,但是注意新的路径明长度不能长于编译时设置的目标路径;
3.qmake.exe最好使用Qt编译时一起生成的版本,否则不知道会出些什么幺蛾子;
4.个人认为QtCore中在搜索插件的路径的选择上存在问题,QtCreator中设置的运行时环境变量QTDIR不起作用,如果你有兴趣的话可以试一试我做的补丁包(http://download.csdn.net/detail/johnyork/8790377),不过我的补丁是针对MSYS2下MinGW编译器的,如果你的编译环境不是MSYS2+MinGW-w64的话,你只有提取其中的.h和.cpp文件来手动覆盖Qt源码中的相应文件了。

我在qt的bin目录下建立了qt.conf文件,里面写入了prefix = c:/a/b ,但是我在程序中利用QLibrayInfo来查看PrefixPath的值时,其打印出来的仍然是编译qt时的路径,而不是c:/a/b,这是因为此qt.conf没有被加载么?

prefix的效果我没有仔细看过,不过一般prefix都是设置的表示当前目录的".",个人觉得没搞清楚之前最好不要随便改。
另外,貌似qt.conf主要是给qmake.exe用的,QtCore不用这个东西;从Qt源代码看插件搜索路径似乎有两个:
1.在目标程序当前路径下的plugins子目录下,
2.在QtCore内记录的Qt安装路径/plugins下
这样的安排便完全忽略了环境变量QTDIR的作用,这也是上文中我说QTDIR不起作用的原因。你在机器A上编译的64位Qt库,拷贝到机器B后,若Qt库的拷贝路径与机器A不一致,按上面给出的搜索路径当然搜索不到插件,也加载不成功了。因此可能的解决方案有3个:
1.确保机器B上的Qt库路径与机器A上的一致—— 一顿拷贝粘贴就可以测试了
2.方案1行不通的话,在机器B上打开命令行,转到Qt库下的bin目录,然后运行命令行工具qtpaths.exe来更改Qt代码库中的路径字符串(使用方法请参考该工具的命令行帮助,或者上网找教程,反正我没用过)。这个方案要求机器B上的Qt库路径不得比机器A上的路径长,否则更改会失败,至于失败的结果是不会更改还是更改导致Qt库损坏,我没试过所以不知道,因此最好做好备份
3.按我在前文中给出的第4点建议修改Qt源代码,然后重新编译Qt。这个方案最耗时,但也是最彻底的解决方案,我目前使用的Qt 5.4.2 64位库就是这么整的,到目前为止还没发现什么问题。
  相关解决方案