如何在 Windows 上分发 GTK+ 应用程序?

How to distribute a GTK+ application on Windows?

我已经在 Windows 上通过 MSYS 和 MinGW 安装了 GTK+(特别是 GTK3)。我现在想将 GTK+ dll 复制到我的应用程序目录,以便它可以在没有全局 GTK+ 安装的计算机上 运行。 GTK+ 需要哪些 dll 才能运行?

编辑: GTK+ 文档现在包含 instructions,用于在 Windows 上分发所需的图标和主题。 (虽然它没有分发相关 DLL 文件的说明 — 请参阅下面的答案。)

您对 Windows page of the GTK website. This is the section named Building and distributing your application. It features a blog post about distributing a GTK application on Windows 有一些提示。

建议的解决方案是为您的应用程序创建一个 MSYS2 包,然后将它及其所有依赖项(其中包括 GTK)安装在特定目录中,以便您可以重新分发整个包。

2020-12-09 编辑:

阅读其他答案后,我想补充一点,此方法不仅可以正确获取共享对象和二进制文件的依赖关系,而且还应该与其他类型的资源(图像、帮助文件等)一起使用在所需的包中,以及在运行时使用基于 dlopen 的函数加载的共享对象。这是你无法通过调用 ldd 来查找依赖关系得到的东西。

事实证明 运行ning ldd mygtkapp.exe(使用 MinGW 提供的 ldd)给了我一个让它 运行 所需的所有 dll 的列表。为了只获取 gtk 依赖项的 dll(而不是例如 Win32 dll),我使用了以下命令:ldd mygtkapp.exe | sed -n 's/\([^ ]*\) => \/mingw.*//p' | sort。我的程序使用了 Haskell 绑定,所以依赖关系可能有点不同,但这是我得到的:

libatk-1.0-0.dll
libbz2-1.dll
libcairo-2.dll
libcairo-gobject-2.dll
libepoxy-0.dll
libexpat-1.dll
libffi-6.dll
libfontconfig-1.dll
libfreetype-6.dll
libgcc_s_seh-1.dll
libgdk_pixbuf-2.0-0.dll
libgdk-3-0.dll
libgio-2.0-0.dll
libglib-2.0-0.dll
libgmodule-2.0-0.dll
libgobject-2.0-0.dll
libgraphite2.dll
libgthread-2.0-0.dll
libgtk-3-0.dll
libharfbuzz-0.dll
libiconv-2.dll
libintl-8.dll
libpango-1.0-0.dll
libpangocairo-1.0-0.dll
libpangoft2-1.0-0.dll
libpangowin32-1.0-0.dll
libpcre-1.dll
libpixman-1-0.dll
libpixman-1-0.dll
libpng16-16.dll
libstdc++-6.dll
libwinpthread-1.dll
zlib1.dll

另请注意,要制作完全独立的应用程序,您还需要做一些其他事情,尤其是在您使用常用图标的情况下;有关这方面的更多详细信息,请参阅 。但是请注意,我需要复制 16x16 目录而不是可缩放目录。

编辑: 实际上我发现以下命令也非常有用:ldd mygtkapp.exe | grep '\/mingw.*\.dll' -o | xargs -I{} cp "{}" .。此命令实际上是将 dll 复制到当前目录,而无需自己费力地完成。

ldd kangaroo.exe | grep '\/mingw64\/bin\/.*dll' -o | xargs -I{} cp "{}" .

可以使用以下过程获取必要的 DLL:

  1. 下载Listdlls
  2. 留下你的申请运行
  3. 打开电源Shell window Listdlls.exe 所在的位置
  4. 使用命令./Listdlls.exe application_name.exe
  5. 将列出的所有路径复制到文本文件
  6. 删除文本文件中所有包含 "C:\WINDOWS*" 的行
  7. 只保留文本中包含 "C:\msys64*...*.dll" 的行 文件
  8. 打开 Msys2 Shell
  9. 使用$cp"paste_all_paths_from_dlls""destination_path"

使用$ cp 命令前的注意事项。在您的文本文件中,将路径中的“\”更改为“/”并删除换​​行符。