【问题标题】:How to distribute a GtkAda application under Windows?如何在 Windows 下分发 GtkAda 应用程序?
【发布时间】:2019-09-11 09:24:22
【问题描述】:

我在 Windows 上分发 GtkAda 应用程序时遇到问题。我制作了一个可执行文件(使用 Windows 本机编译器)并尝试在另一台 Windows 计算机上使用它。但是,我收到有关缺少 dll 的错误。

我尝试使用我的 .exe 分发三个文件夹。

  • bin 包括 GtkAda 安装的 dll,
  • etc 包括fontsgtk-3.0pango
  • lib 包括 gtk-3.0 也带有 dll。

这是我从GtkAda documentation读到的内容

我想我可能忘了在项目文件中指定一些东西

这是我的 GPS 项目文件

with "C:\GNAT\GTK\lib\gnat\gtkada";

project Logfilter is
    for Source_Dirs use ("src");
    for Object_Dir  use "obj";
    for Exec_Dir    use "exec";
    for Main use ("log_filter_main.adb");

    package Builder is
      for Executable ("main.adb") use "Logs_Filter";
    end Builder;

    package Compiler is
      for Switches ("ada") use ("-Wl,--subsystem,windows");
    end Compiler;

end Logfilter;

我正在使用 glade (gtk 3.14) 文件和 GtkAda 2019。

谢谢。

【问题讨论】:

  • 您是否可能缺少 libgnat 和/或 libgnarl ?无论如何,您需要知道丢失了哪个 DLL(dependancy walker 可能有用吗?)
  • 所有丢失的库都在我的 bin 文件夹中。我的可执行文件位于应用程序根文件夹中。它与我上面列出的三个文件夹位于同一文件夹中。

标签: ada software-distribution gnat-gps gtkada


【解决方案1】:

您将主要可执行文件 (log_filter_main.exe) 放在哪里?缺少哪些库?

当我使用下面的批处理程序创建目录结构时(更改变量GTKADA_INSTALL_DIRTARGET_DIR 以匹配您的情况),然后将我的可执行文件(一个简单的GtkAda 程序)复制到%TARGET_DIR%\bin,然后这个可执行文件运行得很好。应用程序位于bin 文件夹中很重要,这样才能在启动期间找到正确的 GTK 运行时库。

create_standalone.bat

SET GTKADA_INSTALL_DIR=C:\GNAT\2019\GtkAda
SET TARGET_DIR=C:\Test

xcopy /s /i %GTKADA_INSTALL_DIR%\bin\*.dll       %TARGET_DIR%\bin\
xcopy /s /i %GTKADA_INSTALL_DIR%\etc\*.*         %TARGET_DIR%\etc\
xcopy /s /i %GTKADA_INSTALL_DIR%\lib\gtk-3.0\*.* %TARGET_DIR%\lib\gtk-3.0\

REM  Copy your GtkAda application (.exe and other dependencies if applicable) 
REM  to %TARGET_DIR%\bin\

关于项目文件:首先,尚不完全清楚为什么需要Builder 包,但我可能在这里缺乏一些项目特定的知识/要求。其次,如果你想摆脱启动GUI应用程序时弹出的控制台窗口,那么你可能想要使用

package Linker is
  for Switches ("ada") use ("-mwindows");
end Linker;

而不是

package Compiler is
  for Switches ("ada") use ("-Wl,--subsystem,windows");
end Compiler;

注意

问题范围之外的小补充说明(您可能已经想到了):请不要忘记在关闭主窗口时退出 GTK 主应用程序。定义(例如):

procedure Destroy_Event_Callback
   (Widget : access Gtk.Widget.Gtk_Widget_Record'Class)
is
begin
   Gtk.Main.Main_Quit;
end Destroy_Event_Callback;

然后在主窗口初始化时注册为回调:

Main_Window.On_Destroy (Destroy_Event_Callback'Access);

如果Gtk.Main.Main_Quit 调用被省略,那么程序(进程)将在您关闭主窗口后继续运行(至少在您使用-mwindows 链接器选项时)。

【讨论】:

  • 问题是我的 .exe 不在所需的 dll 的 bin 中。现在我只需要完成GLib-GIO-ERRORstrange 错误。
猜你喜欢
  • 2018-08-12
  • 1970-01-01
  • 1970-01-01
  • 2013-11-05
  • 2010-11-21
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多