如何使用Qt';s';windeployqt';在Linux/Fedora中

如何使用Qt';s';windeployqt';在Linux/Fedora中,qt,mingw,cross-compiling,fedora,Qt,Mingw,Cross Compiling,Fedora,我目前正在尝试将Fedora21机器上的Qt应用程序交叉编译到Windows(目前为32位)。编译工作没有问题,但部署没有问题。当然,我可以从目录中复制所有必要的文件,但我认为这是浪费时间,所以我想使用Qt的“windeployqt”工具。 但每当我调用它时,例如在Qt Creator中作为构建步骤,它就会发出以下消息(我的测试应用程序称为day_404:D): 你们中有人知道如何解决这个问题,并且在不使用Windows的情况下使用windeployqt吗 提前感谢,, Mariuswindep

我目前正在尝试将Fedora21机器上的Qt应用程序交叉编译到Windows(目前为32位)。编译工作没有问题,但部署没有问题。当然,我可以从目录中复制所有必要的文件,但我认为这是浪费时间,所以我想使用Qt的“windeployqt”工具。 但每当我调用它时,例如在Qt Creator中作为构建步骤,它就会发出以下消息(我的测试应用程序称为day_404:D):

你们中有人知道如何解决这个问题,并且在不使用Windows的情况下使用windeployqt吗

提前感谢,,
Marius

windeployqt工具似乎无法在Fedora 23上使用。它依赖于访问
qmake
,因此,它在使用
mingw32-qmake-qt5
(或
mingw64-qmake-qt5
)构建的mingw交叉编译环境中不起作用。即使这个问题得到了解决,使用
mingw64-cmake
的Qt5项目也无法解决

获取部署时需要复制的所有dll列表的相对简单的方法是在wine下运行应用程序并跟踪所有dll加载

例如:

$ WINEDEBUG=+loaddll wine ./myapp 2> dll.log
$ mkdir -p "$deploy_dir"/{imageformats,platforms}
$ for i in imageformats platforms ; do
    grep "/plugins/$i" dll.lst | xargs -r cp -t "$deploy_dir"/$i
  done
$ grep -v '/plugins/' dll.lst | xargs -r cp -t "$deploy_dir"
dll路径可以按如下方式提取:

$ grep Loaded dll.log | grep -v 'system32\|:load_builtin_dll' \
  | awk -F'"' '{print $2}' \
  | sed -e 's@\\\\@/@g' -e 's/^[A-Z]://' \
  | sort > dll.lst
对于使用mingw64交叉编译的典型Qt5项目,文件
dll.lst
如下所示:

/path/to/cwd/myapp.exe
/path/to/cwd/project.dll
[..]
/usr/x86_64-w64-mingw32/sys-root/mingw/bin/libpng16-16.dll
/usr/x86_64-w64-mingw32/sys-root/mingw/bin/libstdc++-6.dll
/usr/x86_64-w64-mingw32/sys-root/mingw/bin/libwinpthread-1.dll
/usr/x86_64-w64-mingw32/sys-root/mingw/bin/libxml2-2.dll
/usr/x86_64-w64-mingw32/sys-root/mingw/bin/Qt5Core.dll
/usr/x86_64-w64-mingw32/sys-root/mingw/bin/Qt5Gui.dll
/usr/x86_64-w64-mingw32/sys-root/mingw/bin/Qt5Widgets.dll
/usr/x86_64-w64-mingw32/sys-root/mingw/bin/zlib1.dll
/usr/x86_64-w64-mingw32/sys-root/mingw/lib/qt5/plugins/imageformats/qgif.dll
/usr/x86_64-w64-mingw32/sys-root/mingw/lib/qt5/plugins/imageformats/qico.dll
/usr/x86_64-w64-mingw32/sys-root/mingw/lib/qt5/plugins/imageformats/qjpeg.dll
/usr/x86_64-w64-mingw32/sys-root/mingw/lib/qt5/plugins/platforms/qwindows.dll
然后,您可以按如下方式部署这些文件:

$ WINEDEBUG=+loaddll wine ./myapp 2> dll.log
$ mkdir -p "$deploy_dir"/{imageformats,platforms}
$ for i in imageformats platforms ; do
    grep "/plugins/$i" dll.lst | xargs -r cp -t "$deploy_dir"/$i
  done
$ grep -v '/plugins/' dll.lst | xargs -r cp -t "$deploy_dir"
葡萄酒配置 为了在wine下运行交叉编译的二进制文件,必须将mingw dll目录添加到wine路径,例如通过:

sed 's/^\("PATH".*\)"$/\1;Z:\\\\usr\\\\x86_64-w64-mingw32\\\\sys-root\\\\mingw\\\\bin"/' \
  -i $HOME/.wine/system.reg
如果文件
~/.wine/system.reg
不存在,则该文件将由
wine
自动创建

毛皮 您还可以使用该工具获取windows二进制文件所依赖的所有DLL的列表。该工具在Linux上运行,例如:

$ peldd myapp.exe -a  -p . \
   | sed -e 's@^\./@'"$PWD"'/@' -e 's@^\([^/]\)@'"$PWD"'/\1@' \
   | sort > dll2.lst
该工具可以将编译后的所有依赖项传递到二进制文件中,但在运行时有条件加载的DLL(想想
dlopen()
,想想Qt-plugin)不会在二进制文件头中留下痕迹。与此相反:在葡萄酒下运行时,这些DLL也会被记录。例如,这可以是:

/usr/x86_64-w64-mingw32/sys-root/mingw/bin/libjpeg-62.dll
/usr/x86_64-w64-mingw32/sys-root/mingw/lib/qt5/plugins/imageformats/qgif.dll
/usr/x86_64-w64-mingw32/sys-root/mingw/lib/qt5/plugins/imageformats/qico.dll
/usr/x86_64-w64-mingw32/sys-root/mingw/lib/qt5/plugins/imageformats/qjpeg.dll
/usr/x86_64-w64-mingw32/sys-root/mingw/lib/qt5/plugins/platforms/qwindows.dll