Chinaunix首页 | 论坛 | 博客
  • 博客访问: 448070
  • 博文数量: 88
  • 博客积分: 2677
  • 博客等级: 少校
  • 技术积分: 893
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-13 08:01
文章分类

全部博文(88)

文章存档

2017年(3)

2016年(1)

2012年(4)

2011年(4)

2010年(57)

2009年(19)

我的朋友

分类: LINUX

2010-02-02 19:50:22

当使用glade3来作成GUI界面是,对于构件的信号回调函数自然也可通过glade3来做成。

但是正常编译后,启动可执行文件的时候,出现错误:
例如:给window的destroy信号连接一个名为on_window_destroy的回调函数。


#include


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 脚本为它添加了相应的正确 标志. 但这样的程序在其它的平台是运行时可能会出错.
-----------------------------------------------------------------------------------

------
注意具体的动态连接参数使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.








阅读(2266) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~