GTK_OBJECT 尝试转换到 GTK3 时未在此范围内声明(针对 gtk+-3.0 库编译)

GTK_OBJECT was not declared in this scope when trying to transition to GTK3 (compile against gtk+-3.0 library)

刚开始做GTK开发,一直在纠结

第一次申请花了我4个小时,我现在想知道我是否已经犯了太多明显的错误?

主要是想问一下如何把这段代码转成GTK3?它给我错误:

 ‘GTK_OBJECT’ was not declared in this scope

如果我尝试针对 GTK3 而不是 GTK2 进行编译,即:

pkg-config --cflags --libs gtk+-3.0

#include <gtk/gtk.h>
static int click_counter = 0;
void greet ( GtkWidget * widget, gpointer data )
{
    g_print ( "My first GTK app!\n" );
    g_print ( "%s clicked %d times\n", (char*) data, ++click_counter );
}
void destroy ( GtkWidget * widget, gpointer data )
{
    gtk_main_quit ();
}
int main ( int argc, char * argv[] )
{
    GtkWidget * main_window;
    GtkWidget * counter_button;
    gtk_init( & argc, & argv);
    main_window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
    g_signal_connect (main_window, "destroy", G_CALLBACK (destroy), NULL);
    gtk_container_set_border_width ( GTK_CONTAINER ( main_window ), 30 );
    counter_button = gtk_button_new_with_label ("Click me!");
    g_signal_connect ( GTK_OBJECT(counter_button), "clicked", G_CALLBACK (greet), NULL ); // last param counter_button ?
    gtk_container_add ( GTK_CONTAINER (main_window), counter_button );
    gtk_widget_show_all ( main_window );
    gtk_main ();
    return 0;
}

我使用Makefile编译,主要部分:

CXX := g++-8
CXXFLAGS := -std=c++17 -Wall -Wextra -Wc++11-compat # -Werror -Wpedantic -pedantic-errors
LDLIBS := $$( pkg-config --cflags --libs gtk+-2.0 )

PROJECT := firstGTK
BINARY := $(PROJECT)
SOURCE := $(PROJECT).cpp


$(BINARY): $(SOURCE)
    $(CXX) $(CXXFLAGS) $(SOURCE) -o $(BINARY) $(LDLIBS)

如果您要将 GTK 2 代码移植到 GTK 3,那么您应该阅读 GTK 2 to 3 migration guide。预计在切换时需要对代码进行一些更改。

有个section专门讲了如何替换GtkObject。大多数情况下,答案是使用 GObject 或 GtkWidget。