首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Linux / Fedora中使用Qt的'windeployqt‘

如何在Linux / Fedora中使用Qt的'windeployqt‘
EN

Stack Overflow用户
提问于 2015-04-16 22:49:50
回答 1查看 1.7K关注 0票数 5

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

代码语言:javascript
复制
Unable to find dependent libraries of /home/marius/Entwicklung/build-day_404-Windows_32bit-Release/release/day_404.exe :Not implemented.

你们中有谁知道如何修复这个问题,并在不使用Windows的情况下使用windeployqt吗?

提前谢谢你,马吕斯

EN

回答 1

Stack Overflow用户

发布于 2016-04-04 01:07:50

windeployqt工具似乎不能在Fedora23上使用。它依赖于访问qmake,因此,它不能在使用mingw32-qmake-qt5 (或mingw64-qmake-qt5)构建的mingw交叉编译环境中工作。即使这个问题被修补了-它也不能与使用mingw64-cmake的Qt5项目一起工作。

要获得需要复制以进行部署的所有dll的列表,一种相对简单的方法是在wine下运行应用程序并跟踪所有dll加载。

例如:

代码语言:javascript
复制
$ WINEDEBUG=+loaddll wine ./myapp 2> dll.log

可以像这样提取dll路径:

代码语言:javascript
复制
$ 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如下所示:

代码语言:javascript
复制
/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

然后,您可以像这样部署这些文件:

代码语言:javascript
复制
$ 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配置

要在wine下运行交叉编译的二进制文件,必须将mingw dll目录添加到wine路径,例如通过:

代码语言:javascript
复制
sed 's/^\("PATH".*\)"$/\1;Z:\\\\usr\\\\x86_64-w64-mingw32\\\\sys-root\\\\mingw\\\\bin"/' \
  -i $HOME/.wine/system.reg

如果文件~/.wine/system.reg还不存在,wine会自动创建该文件。

PELDD

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

代码语言:javascript
复制
$ peldd myapp.exe -a  -p . \
   | sed -e 's@^\./@'"$PWD"'/@' -e 's@^\([^/]\)@'"$PWD"'/\1@' \
   | sort > dll2.lst

该工具在编译成二进制文件时传递所有依赖项-但在运行时有条件地加载的DLL(想想dlopen(),想想Qt插件)不会在二进制头文件中留下痕迹。相反:当在wine下运行时,这些DLL也会被记录下来。对于我们的示例,这可能是:

代码语言:javascript
复制
/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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29678352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档