【问题标题】:How to use Qt's 'windeployqt' in Linux / Fedora如何在 Linux / Fedora 中使用 Qt 的“windeployqt”
【发布时间】:2015-04-16 14:49:50
【问题描述】:

我目前正在尝试将我在 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.

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

提前致谢, 马吕斯

【问题讨论】:

    标签: qt mingw cross-compiling fedora


    【解决方案1】:

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

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

    例如这样:

    $ WINEDEBUG=+loaddll wine ./myapp 2> dll.log
    

    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
    

    文件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"
    

    葡萄酒配置

    要在 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.regwine 自动创建,如果它尚不存在。

    PELDD

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

    $ peldd myapp.exe -a  -p . \
       | sed -e 's@^\./@'"$PWD"'/@' -e 's@^\([^/]\)@'"$PWD"'/\1@' \
       | sort > dll2.lst
    

    该工具可传递地将所有依赖项编译到二进制文件中 - 但是 - 在运行时有条件地加载的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      • 2011-07-29
      • 2011-04-25
      • 1970-01-01
      相关资源
      最近更新 更多