如何在命令行中使用 GtkAda?

How to use GtkAda in command-line?

我尝试在 Windows 上用命令行编译一个非常简单的 GtkAda 应用程序。这是应用程序代码:

`WITH Gtk.Main ;       USE Gtk.Main ; 
WITH Gtk.Window ;     USE Gtk.Window ; 
PROCEDURE Test01 IS
   win : Gtk_window ;
BEGIN
   Init ; 
   Gtk_New(Win) ;
   Win.show_all ; 
   Main ; 
END Test01 ;`

编译

gcc -c test01.adb -IC:\<<path_to_GtkAda\include\gtkada>>, 我按预期获得 test.ali 和 test01.o。

但是如何link库

gcc test.o -LC:\<<path_to_GtkAda>>\lib

给出:

`Test01.o:Test01.adb:(.text+0xe): undefined reference to `gtk__main__init'
Test01.o:Test01.adb:(.text+0x21): undefined reference to `gtk__window__gtk_new'
Test01.o:Test01.adb:(.text+0x3e): undefined reference to `__gnat_rcheck_CE_Access_Check'
Test01.o:Test01.adb:(.text+0x5e): undefined reference to `gtk__main__main'
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: Test01.o: bad reloc address 0x20 in section `.eh_f
rame'
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: final link failed: Invalid operation
collect2.exe: error: ld returned 1 exit status`

PATH 已经包含 <<path_to_GtkAda>>/bin

谢谢。

解决方案通常是使用随编译器安装的文档中描述的 GNAT 项目文件,通常在“doc”或“doc/gprbuild” 子目录。

名为“SO.gpr”的简单示例项目文件可能如下所示:

with "gtkada";
project SO is

 for Source_Dirs use (".");

end SO;

注意 with "gtkada"; 的部分。这意味着工具链随后将注入制作 Ada/GTK 程序所需的所有开关。 然后,如果您像这样调用 GNAT 工具链:

$ gnatmake -PSO test01.adb

Ada make 程序将依次调用 gccgnatbindgnatlink。对于每个命令,将自动提供必要的参数。 (根据您使用的 GNAT 版本,您也可以使用 gprbuild。)

因此,例如在安装了 libgtkada2.24.4-dev 的 Debian/GNU 系统上,我看到了这个:

$ gnatmake -Pso test01.adb
gcc-4.9 -c -I- -gnatA /home/bauhaus/News/SO/test01.adb
gnatbind -shared -x /home/bauhaus/News/SO/test01.ali
gnatlink /home/bauhaus/News/SO/test01.ali -shared-libgcc -L/usr/lib/x86_64-linux-gnu/ -lgtkada -lgdk-x11-2.0 -lgmodule-2.0 -lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0 -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lpangoft2-1.0 -lfontconfig -lfreetype -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lX11 -lm -o /home/bauhaus/News/SO/test01
$