【问题标题】:Running a GTK+ application built with MSYS2 by just double clicking it只需双击即可运行使用 MSYS2 构建的 GTK+ 应用程序
【发布时间】:2017-10-20 21:57:17
【问题描述】:

我有一个使用MSYS2 构建的simple window 应用程序,我希望它能够在MSYS2 MinGW shell 之外运行,只需双击该应用程序即可。

问题是,当我想运行应用程序时,它必须通过MSYS MinGW 提示符,否则它会返回错误。

The code execution cannot proceed because libgio-2.0-0.dll was not found. Reinstalling the program may fix this problem

我尝试包括(通过将文件复制到我的 exe 的位置) libgio-2.0-0.dll 并出现更多错误,称缺少库。我也包括了这些文件。我已经展示了我在下面包含的文件:

libffi-6.dll
libgdk-3-0.dll
libglib-2.0-0.dll
libgmodule-2.0-0.dll
libgtk-3-0.dll
libgobject-2.0-0.dll
libgio-2.0-0.dll
libatk-1.0-0.dll
libcairo-gobject-2.dll
libcairo-2.dll
libepoxy-0.dll
libpcre-1.dll
libwinpthread-1.dll
libgdk_pixbuf-2.0-0.dll
libpango-1.0-0.dll

最后出现错误提示:

The application was unable to start correctly (0xc000007b).  Click OK to close the application.

I found what the error message means:

该特定错误代码是指无效的图像格式。但是,错误代码通常意味着您正在尝试运行旨在与 64 位 Windows 操作系统一起使用的程序,但您只有 32 位操作系统。

但是,当我运行的是 x64 计算机时,它没有帮助。 DLL 是 x64 以及 exe。

www.gtk.org 说 GTK+ 依赖于一些库,除了我上面所做的之外,我想不出任何解决方案,也找不到任何关于要包含哪些依赖项以便不通过 MSYS 提示符运行它的文档。

那么我需要做什么才能让我的窗口正常工作?应用程序很好,但依赖项有问题。

其次,对于我提供的脚本,我需要包含哪些依赖项(或者我是否列出了所有依赖项,在这种情况下,我的窗口出了什么问题)?

最后有没有比我尝试做的更简单的方法来获取所有必要的依赖项?

【问题讨论】:

    标签: c windows dependencies gtk msys2


    【解决方案1】:

    系统需要能够找到共享库。在 Linux 系统上,这是通过链接器实现的,通常是 ld。在哪里可以找到它们的配置位于/etc/ld.so.conf/etc/ld.so.conf.d

    现在在 Windows 上,这不存在。这就是为什么环境变量PATH 通常用于此目的,有时由安装程序修改。但是为每个程序更改PATH 很烦人,并且禁止重新定位(移动整个应用程序目录并从其他地方运行应用程序)。因此,您可以只创建一个空目录,在其中创建一个bin 目录,然后将您的应用程序二进制文件和 GTK+ 库复制到那里。这应该可以工作,因为 the current directory is searched before the PATH variable 在 Windows 上。

    所以你所做的是正确的。您遇到的问题类似于应用程序重新分发,即。收集必要的位以在另一台计算机上分发软件。不幸的是,这不是 GTK+ 网站上记录最多的部分。您是否尝试过不使用 GtkApplication 类的应用程序?

    【讨论】:

    • 作为一个实验,我用我的应用程序复制了bin 文件夹的全部内容。双击它并打开窗口。控制台屏幕上出现一条错误消息,但窗口确实打开了。然后我删除了所有exe,它仍然有效。然后是除了我上面提到的之外的所有 dll。它返回了同样的错误。这使我相信缺少 dll。还有一个错误说Could not find the icon 'window-minimise-symbolic-ltr'. The hicolor theme知道如何解决这个问题吗?
    • 好的,知道缺少哪个 DLL 吗?
    • 使用 pacman 包管理器列出 GTK+ 包中包含的文件。
    • 我已经解决了DLL问题。使用Linux 命令ldd 您可以列出所有应用程序的依赖项。我在 Msys MinGW 64 位 shell 中输入了ldd myapp,它返回了一个包含所有必要依赖项的长列表。我从C:\msys64\mingw64\bin 手动复制了这些,然后窗口打开了。
    • 对,我解决了图标问题。我创建了一个名为share 的exe 所在的新文件。接下来,我创建了一个名为icons 的子文件夹,并将hicolor 从文件位置:C:\msys64\mingw64\share\icons 复制到其中,它们出现了。 :)
    【解决方案2】:

    我通过像这样的命令行包含库来修复它。

    gcc pkg-config --cflags gtk+-3.0 -o example-1 example-1.c pkg-config --libs gtk+-3.0

    并使用MSYS2 installer自带的mingw64.exe运行它

    【讨论】:

    • 感谢您的回答,但我的问题是我无法在 MSYS shell 之外运行我的可执行文件:“问题是,当我想运行应用程序时,它必须通过MSYS MinGW 提示,否则返回错误。”,我想通过双击来运行这个可执行文件,而不是通过 MSYS 提示符..
    • 我尝试运行独立应用程序,但是当我们使用 --libs 命令编译它时缺少 gtk 3.0.dll,它会绑定它们,但我认为我们仍然需要那个 gtk.dll 运行它。
    • 是的,我听说(几乎)不可能不包含 DLL。我这样做的一种方法(上面)是使用 pacman 列出所有依赖项并将所有 DLL 添加/链接到同一个文件夹,但可以生成一个大型可执行文件。
    • 是的。仅仅为了测试输出而运行packman 考验将是致命的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    相关资源
    最近更新 更多