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。
刚开始做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。