作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在尝试将 Fedora 21 机器上的 Qt 应用程序交叉编译到 Windows(目前为 32 位)。编译没有问题,但部署没有问题。当然,我可以从目录中复制所有必要的文件,但我认为这是浪费时间,所以我想使用 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.
最佳答案
windeployqt
该工具似乎无法在 Fedora 23 上使用。它依赖于访问 qmake
,因此,它在使用 mingw32-qmake-qt5
构建的 mingw 交叉编译环境中不起作用。 (或 mingw64-qmake-qt5
)。即使此问题已修补 - 它也不适用于使用 mingw64-cmake
的 Qt5 项目.
获取需要复制以进行部署的所有 DLL 列表的一种相对简单的方法是在 wine 下运行应用程序并跟踪所有 dll 加载。
例如像这样:
$ WINEDEBUG=+loaddll wine ./myapp 2> dll.log
$ 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
dll.lst
对于使用 mingw64 交叉编译的典型 Qt5 项目,如下所示:
/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
$ 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"
sed 's/^\("PATH".*\)"$/\1;Z:\\\\usr\\\\x86_64-w64-mingw32\\\\sys-root\\\\mingw\\\\bin"/' \
-i $HOME/.wine/system.reg
~/.wine/system.reg
由
wine
自动创建如果它不存在,那么。
$ peldd myapp.exe -a -p . \
| sed -e 's@^\./@'"$PWD"'/@' -e 's@^\([^/]\)@'"$PWD"'/\1@' \
| sort > dll2.lst
dlopen()
,想想 Qt 插件)不会在二进制 header 中留下痕迹。与此相反:在 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
关于qt - 如何在 Linux/Fedora 中使用 Qt 的 'windeployqt',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29678352/
我是一名优秀的程序员,十分优秀!