打包应用程序时如何排除不必要的 Qt *.so 文件?

Posted

技术标签:

【中文标题】打包应用程序时如何排除不必要的 Qt *.so 文件?【英文标题】:How to exclude unnecessary Qt *.so files when packaging an application? 【发布时间】:2019-08-12 18:46:11 【问题描述】:

使用 PyInstaller 成功打包我的 PySide 应用程序后,我在包文件夹中发现了许多不同的 *.so 文件。看到我的项目中没有使用的库,我很惊讶,例如:libQt53DAnimation.solibQt53DCore.solibQt5Multimedia.so 等。

我没有在源代码中导入它们,也没有将它们包含在隐藏的导入中。

正如我所读到的,PyInstaller 会自动查找应用程序运行所需的所有依赖项。如果我在打包后手动删除它们,那么我的应用程序运行时没有任何更改/麻烦。那就是指出它们没有必要,它们不应该被视为依赖项,不是吗?

那么有什么办法可以在打包的时候排除它们

【问题讨论】:

【参考方案1】:

如果您确定它们对于您的应用程序来说不是必需的,您可以使用规范文件中的分析将它们排除在外。您只需添加它们,如下所示https://pythonhosted.org/PyInstaller/spec-files.html#spec-file-operation。

你可以这样做:

a.binaries = a.binaries - TOC([
  ('libQt53DAnimation.so', None, None),
  ('libQt53DCore.so', None, None),
  ('libQt5Multimedia.so', None, None),
])

还有一个 --exclude-module EXCLUDES 用于排除模块,但不确定它与您的情况有多相关。

不幸的是,pyinstaller 包含某些可选依赖项,正如 Hartmut Goebel 解释的 here

PyInstaller 最好只包含所需的模块——那就是 PyInstaller 是关于 :-) 的。但是很多包都有可选的 您的程序可能不需要的依赖项,但是 对于其他程序。 PyInstaller 无法知道这一点,如果 PyInstaller 会删除很多,其他程序可能会失败。请使用选项 --exclude 为此。

请记住,仅 Python 的“完整 unicode”功能 支持”添加了很多编解码器模块,这些模块看起来没有必要,但 Python 正常工作所必需的。

【讨论】:

感谢您的回复。很高兴有机会手动排除库,但如果我知道它们对我的应用程序没用(例如,我的项目中没有使用任何 3d 和多媒体,所以我可以用库名称来识别它们)并稍后删除)但是如何找出其他库?我怎么知道 lib libQt5Concurrent.so 不是另一个 lib 的重要依赖项?通过删除来检查它并查看哪些不起作用并不是一个好主意,尤其是在大型项目中。 @Artem 编辑了答案以解释添加额外 DLL 背后的原因 我认为@Artem 的评论没有得到答复。有谁知道如何检查一个库是否需要或依赖于另一个必需的库?

以上是关于打包应用程序时如何排除不必要的 Qt *.so 文件?的主要内容,如果未能解决你的问题,请参考以下文章

libqxcb.so错误解决

Play Framework中,打包时如何排除文件?

Androidndk开发打包时我们应该如何注意平台的兼容(x86,arm,arm-v7a)

如何在 C++ 和 Qt 中使用在运行时加载的库

Qt 编程指南 9 软件打包

[LINUX] 用"tar -c"打包文件时,如何排除其中的链接文件?