Ich bin auch am üben mit GTK4. Unter Linux läuft es bestens.
Aber mit Windows und dem Einbinden der DLLs habe ich Mühe.
Ich konnte GTK4 für Windows bauen, alle DLLs sehen in der Form so aus 'libxxx-x.x.dll'
Ein vorweg, ich habe ein C-HelloWorld unter Linux für Windows Cross compiliert.
Dies mache ich so.
Code: Alles auswählen
$ x86_64-w64-mingw32-gcc -o main main.c `pkg-config --cflags gtk4 --libs gtk4` -I/usr/local/include
Um zu sehen, was mit "pkg-config" eingebunden wird, habe ich folgendes gemacht.
Code: Alles auswählen
$ pkg-config --cflags gtk4 --libs gtk4
-I/usr/local/include/gtk-4.0 -I/usr/local/include/pango-1.0 -I/usr/local/include -I/usr/local/include/glib-2.0 -I/usr/local/lib/glib-2.0/include -I/usr/local/include/harfbuzz -I/usr/local/include/fribidi -I/usr/local/include/cairo -I/usr/local/include/pixman-1 -I/usr/local/include/gdk-pixbuf-2.0 -I/usr/local/include/graphene-1.0 -I/usr/local/lib/graphene-1.0/include -mfpmath=sse -msse -msse2 -mms-bitfields -L/usr/local/lib -lgtk-4 -lpangowin32-1.0 -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -lgdk_pixbuf-2.0 -lcairo-gobject -lcairo -lgraphene-1.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lintl
Die erstellte exe funktioniert, bis auf eine kleine Darstellungsfehler.
Aber was viel spannender ist, ist '-lgtk-4', ' -lgio-2.0 -lgobject-2.0',
Diese 3 Parameter sehen recht nackt aus. vonrne ohne 'lib' und hinten ohne 'dll'.
Nun habe ich es in Pascal folgendermassen probiert, auch dies funktioniert.
Code: Alles auswählen
program project1;
uses
Math;
{$IFDEF linux}
const
gtklib = 'libgtk-4.so';
libgio = 'libgio-2.0.so.0';
gobjectlib = 'libgobject-2.0.so';
{$ENDIF}
{$IFDEF WINDOWS}
const
gtklib = 'libgtk-4-1.dll';
libgio = 'libgio-2.0-0.dll';
gobjectlib = 'libgobject-2.0-0.dll';
{$ENDIF}
// ---- libgtk-4
type
TGTKWidget = Pointer;
PGTKWidget = ^TGTKWidget;
TGTKButton = Pointer;
PGTKButton = ^TGTKButton;
TGTKWindow = Pointer;
PGTKWindow = ^TGTKWindow;
TGtkApplication = Pointer;
PGtkApplication = ^TGtkApplication;
function gtk_application_new(application_id: PChar; flags: int64): PGtkApplication; cdecl; external gtklib;
function gtk_application_window_new(application: PGtkApplication): PGtkWidget; cdecl; external gtklib;
procedure gtk_window_present(window: PGtkWindow); cdecl; external gtklib;
function gtk_button_new_with_label(_label: PChar): PGtkWidget; cdecl; external gtklib;
procedure gtk_window_set_child(window: PGtkWindow; child: PGtkWidget); cdecl; external gtklib;
procedure gtk_window_set_default_size(window: PGtkWindow; Width: longint; Height: longint); cdecl; external gtklib;
procedure gtk_window_set_title(window: PGtkWindow; title: PChar); cdecl; external gtklib;
function gtk_button_get_label(button: PGtkButton): PChar; cdecl; external gtklib;
// ------ libgio
function g_application_run(application: Pointer; argc: longint; argv: PPchar): longint; cdecl; external libgio;
// ------ glib
type
TGCallBackProcedure = procedure;
TGCallback = procedure(para1: TGCallBackProcedure); cdecl;
TGClosureNotify = procedure(Data: Pointer; closure: Pointer); cdecl;
function g_signal_connect_data(instance: Pointer; detailed_signal: PChar; c_handler: TGCallback; Data: Pointer; destroy_data: TGClosureNotify; connect_flags: longint): longint; cdecl; external gobjectlib;
function g_signal_connect(instance: Pointer; detailed_signal: PChar; c_handler: TGCallback; Data: Pointer): longint;
begin
g_signal_connect := g_signal_connect_data(instance, detailed_signal, c_handler, Data, nil, 0);
end;
function G_CALLBACK(f: pointer): TGCallback;
begin
G_CALLBACK := TGCallback(f);
end;
// ------- Eigenes
procedure btn_Click(button: PGTKWidget; user_data: Pointer);
begin
WriteLn(gtk_button_get_label(button));
end;
procedure activate(app: PGtkApplication; user_data: Pointer);
var
window, button: PGTKWidget;
begin
window := gtk_application_window_new(app);
gtk_window_set_default_size(window, 640, 480);
gtk_window_set_title(window, 'Hello GTK-4');
button := gtk_button_new_with_label('Mein Button');
g_signal_connect(button, 'clicked', G_CALLBACK(@btn_Click), nil);
gtk_window_set_child(window, button);
gtk_window_present(window);
end;
procedure main;
var
app: PGtkApplication;
begin
app := gtk_application_new('org.gtk.example', 0);
g_signal_connect(app, 'activate', G_CALLBACK(@activate), nil);
g_application_run(app, 0, nil);
end;
begin
SetExceptionMask([exDenormalized, exInvalidOp, exOverflow, exPrecision, exUnderflow, exZeroDivide]);
main;
end.
Man beachte zuoberst die lin Konstanten.
Diese wollte ich auch abspecken, so wie es bei "pkg-config" der Fall ist.
Code: Alles auswählen
{$IFDEF WINDOWS}
const
gtklib = 'gtk-4';
libgio = 'gio-2.0';
gobjectlib = 'gobject-2.0';
//const
// gtklib = 'libgtk-4-1.dll';
// libgio = 'libgio-2.0-0.dll';
// gobjectlib = 'libgobject-2.0-0.dll';
{$ENDIF}
Nur dann bekomme ich folgende Fehler, wen ich mein Project starte.
Einer eine Idee woran dies liegt ?
Code: Alles auswählen
$ wine project1.exe
00dc:err:module:import_dll Library gtk-4.dll (which is needed by L"Z:\\home\\tux\\Schreibtisch\\gtk_4_native\\project1.exe") not found
00dc:err:module:import_dll Library gio-2.0 (which is needed by L"Z:\\home\\tux\\Schreibtisch\\gtk_4_native\\project1.exe") not found
00dc:err:module:import_dll Library gobject-2.0 (which is needed by L"Z:\\home\\tux\\Schreibtisch\\gtk_4_native\\project1.exe") not found
00dc:err:module:loader_init Importing dlls for L"Z:\\home\\tux\\Schreibtisch\\gtk_4_native\\project1.exe" failed, status c0000135
Mache ich das selbe unter Linux, dann geht es,
Code: Alles auswählen
{$IFDEF linux}
const
gtklib = 'gtk-4';
libgio = 'gio-2.0';
gobjectlib = 'gobject-2.0';