当使用glade3来作成GUI界面是,对于构件的信号回调函数自然也可通过glade3来做成。
但是正常编译后,启动可执行文件的时候,出现错误:
例如:给window的destroy信号连接一个名为on_window_destroy的回调函数。
#include <gtk/gtk.h>
void on_window_destroy(GtkObject *object, gpointer user_date) { gtk_main_quit(); }
/** * * * @param argc * @param argv * * @return */ int main(int argc, char *argv[]) {
GtkBuilder *builder; GtkWidget *window;
gtk_init (&argc, &argv); builder = gtk_builder_new (); gtk_builder_add_from_file (builder, "tutorial.glade", NULL); window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
//g_signal_connect( G_OBJECT(window), "clicked", // G_CALLBACK(on_window_destroy), NULL);
/* 自动把所有通过glade3创建的信号处理函数都连接好 */ gtk_builder_connect_signals (builder, NULL);
g_object_unref (G_OBJECT (builder)); gtk_widget_show_all(window); gtk_main (); return 0; }
|
编译OK
运行NG
Gtk-WARNING **: Could not find signal handler 'on_window_destroy'
切换编译命令为:
gcc -o hello hello.c `pkg-config --cflags --libs libglade-2.0` -export-dynamic |
---------http://blog.chinaunix.net/u/13269/showart_206155.html--------------
Note
如果你想为信号连接一个在主程序 (不是共享库) 定义的处理函 数, 你需要你需要向连接程序(编译过程中的)传递一个参数来让它从主程序中导出这些符号表用来动态连接. 这样的标志是平台相关的, 但是 libtool 会正确的处理它们, 你只需要在编译标示中添加一个-export-dynamic 参数即可, libtool 将会把 它们转换成正确的格式.
大多数人说在 GNU/Linux 上的 GTK+ 1.2 中并没有遇到这样的问 题, 因为 gtk-config 脚本为它添加了相应的正确 标志. 但这样的程序在其它的平台是运行时可能会出错.
-----------------------------------------------------------------------------------
------http://www.ourkernel.com/bbs/viewthread.php?tid=118--------------------------
注意具体的动态连接参数使ld而定,这里是-export-dynamic。详情参看ld的manual。
-----------------------------------------------------------------------------------
***摘自> $ man ld
-E
--export-dynamic
--no-export-dynamic
当创建一个动态的可执行连接时, 用选项 -E 或者 选项 --export-dynamic ,由这个连接器来添加
所有的标记符号到动态标记符号表. 动态的符号表是可见的符号设置在动态对象运行时.
如果你不使用这两个选项 (或是用 --no-export-dynamic 选项来恢复默认行为), 动态符号表通常只
包含被一些动态对象在链接中引用那些符号。
如果你用"dlopen"来读取需要由程序来回调符号的定义的动态对象,而不是一些其他的动态对象,那么
你可能需要使用这个选项来连接程序本身。(自己要利用的回调函数是在自己内部定义的函数的感觉)
如果输出格式支持的话,你也可以用动态列表来控制将符号加入到动态符号表中.
See the description of --dynamic-list.
Note that this option is specific to ELF targeted ports. PE
targets support a similar function to export all symbols from a DLL
or EXE; see the description of --export-all-symbols below.
*****************
or
gcc -o test test.c $(pkg-config --cflags --libs gtk+-2.0 gmodule-2.0) |
---http://blog.csdn.net/gengqiang2008/archive/2008/12/13/3511693.aspx-----------
GTK+中的插件编程
GTK +的底层基础GLib中提供了插件编程功能,称为GMoudle。它为实现插件功能提供了快捷的方法,在目前的GTK+2.0中,GMoudle比较完整的封装了Linux底层中对动态链接库的操作dlopen,HP-UX系统中的shl_load和Windows平台上的有关DLL调用等功能,用非常简单的方法实现了动态加载插件和调用插件中的函数的功能。
如果你编写的应用程序要用到GModule插件功能,就必须在编译时加入 `pkg-config –-libs gmoudle-2.0`以完成最后程序运行的需要。
补充:(
--export-dynamic
)
lb@ubuntu:~$ pkg-config --libs gmodule-2.0 -Wl,--export-dynamic -lgmodule-2.0 -lglib-2.0 lb@ubuntu:~$
|
--------------------------------------------------------------------------------
gtk_builder_connect_signals(builder, NULL);
此函数总是需要传递builder对象作为第一个参数,第二个参数是用户数据。
这很有用,不过现在设为NULL即可。这个函数会使用GModule, GLib的一部分, 动态加载模块来查
询应用程序符号表(函数名, 变量名等等)。
寻找应用程序中能够与Glade中指定的回调函数名相符的函数,然后连接到信号。
在Glade中我们为GtkWindow的"destroy"信号指定了回调函数名为"on_window_destroy",
因此gtk_builder_connect_signals()会在程序中寻找名为"on_window_destroy"的处理函数,
如果找到则连接到"signal"信号。函数原型必须一致才能连接,包括函数名,参数个数类型,返回类型等。
"destroy"信号属于GtkObject类,因此可以在开发文档中查找
GtkObject目录下的"destroy"signal找到相应的回调函数原型,
根据此原型我们可以定义如下处理函数:
void on_window_destroy (GtkObject *object, gpointer user_data) { gtk_main_quit(); } |
编译+运行,均OK.