mar*_*nux 5 qt mingw fedora cross-compiling
我目前正在尝试将Fedora 21计算机上的Qt应用程序交叉编译为Windows(目前为32位).编译工作没有问题,但部署没有.对于cours,我可以从目录中复制所有必要的文件,但我认为这是浪费时间,所以我想使用Qt的'windeployqt'工具.但每当我调用它时,例如在Qt Creator中作为构建步骤,它只是发出此消息(我的测试应用程序称为day_404:D):
Unable to find dependent libraries of /home/marius/Entwicklung/build-day_404-Windows_32bit-Release/release/day_404.exe :Not implemented.
Run Code Online (Sandbox Code Playgroud)
你们中的任何人都知道如何解决这个问题,并且在不使用Windows的情况下使用windeployqt吗?
先谢谢,马吕斯
该windeployqt
工具似乎在 Fedora 23 上不可用。它依赖于访问,因此,它在使用( 或)qmake
构建的 mingw 交叉编译环境中不起作用。即使这个问题已修复 - 它也不适用于使用.mingw32-qmake-qt5
mingw64-qmake-qt5
mingw64-cmake
获取部署时需要复制的所有 DLL 列表的一个相对简单的方法是在 wine 下运行应用程序并跟踪所有 dll 加载。
例如这样:
$ WINEDEBUG=+loaddll wine ./myapp 2> dll.log
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
对于与 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
Run Code Online (Sandbox Code Playgroud)
然后您可以像这样部署这些文件:
$ 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"
Run Code Online (Sandbox Code Playgroud)
为了在 wine 下运行交叉编译的二进制文件,必须将 mingw dll 目录添加到 wine 路径,例如通过:
sed 's/^\("PATH".*\)"$/\1;Z:\\\\usr\\\\x86_64-w64-mingw32\\\\sys-root\\\\mingw\\\\bin"/' \
-i $HOME/.wine/system.reg
Run Code Online (Sandbox Code Playgroud)
如果该文件尚不存在,则会~/.wine/system.reg
自动创建该文件。wine
您还可以使用peldd工具获取 Windows 二进制文件所依赖的所有 DLL 的列表。该工具在Linux上运行,例如:
$ peldd myapp.exe -a -p . \
| sed -e 's@^\./@'"$PWD"'/@' -e 's@^\([^/]\)@'"$PWD"'/\1@' \
| sort > dll2.lst
Run Code Online (Sandbox Code Playgroud)
该工具可传递地遍历编译到二进制文件中的所有依赖项 - 但是 - 在运行时有条件加载的 DLL(例如dlopen()
Qt 插件)不会在二进制标头中留下痕迹。与此相反:当在 wine 下运行时,这些 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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1210 次 |
最近记录: |