LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2495|回复: 4

动态库,例子,书上的。

[复制链接]
发表于 2003-12-18 22:54:49 | 显示全部楼层 |阅读模式
hello.c

  1. #include <gtk/gtk.h>

  2. void hello (void)
  3. {
  4.         GtkWidget *dialog;
  5.         dialog = gtk_message_dialog_new(NULL,
  6.                 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
  7.                 GTK_MESSAGE_INFO, GTK_BUTTONS_OK,
  8.                 "你好!\n这是动态链接库测试。");
  9.         gtk_dialog_run(GTK_DIALOG(dialog));
  10.         gtk_widget_destroy(dialog);
  11. }

  12. void create_info_dialog(gchar* message)
  13. {
  14.         GtkWidget *dialog;
  15.         dialog = gtk_message_dialog_new(NULL,
  16.                 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
  17.                 GTK_MESSAGE_INFO, GTK_BUTTONS_OK, message);
  18.         gtk_dialog_run(GTK_DIALOG(dialog));
  19.         gtk_widget_destroy(dialog);
  20. }
复制代码

main.c

  1. #include <gtk/gtk.h>
  2. #include <gmodule.h>

  3. typedef void (*simplehello) (void);

  4. typedef void (*simplefunc) (gchar *string);

  5. GModule *module;

  6. void on_button_test(GtkButton *button, gpointer data)
  7. {
  8.         simplehello f1;
  9.         simplefunc f2;
  10.         if(g_module_supported())
  11.         {
  12.                 gtk_button_set_label(button,"支持动态链接库");
  13.                 module = g_module_open("./libhello.so",G_MODULE_BIND_LAZY);
  14.                 g_module_symbol(module, "hello", (gpointer*)&f1);
  15.                 f1();

  16.                 g_module_symbol(module, "create_info_dialog",(gpointer*)&f2);
  17.                 f2("此对话框是从动态链接库调用出来的。");
  18.                 g_module_close(module);
  19.         }
  20.         else
  21.         {
  22.                 gtk_button_set_label(button,"不支持动态库");
  23.         }
  24. }
  25. int main(int argc, char* argv[])
  26. {
  27.         GtkWidget *window, *button;
  28.         gtk_init(&argc,&argv);
  29.         window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  30.         gtk_window_set_title(GTK_WINDOW(window),"动态链接测试");
  31.         g_signal_connect(G_OBJECT(window),"delete_event",
  32.                 G_CALLBACK(gtk_main_quit),NULL);
  33.         gtk_window_set_default_size(GTK_WINDOW(window),200,40);
  34.         gtk_container_set_border_width(GTK_CONTAINER(window),10);
  35.         button = gtk_button_new_with_label("测试");
  36.         g_signal_connect(G_OBJECT(button),"clicked",
  37.                 G_CALLBACK(on_button_test),NULL);
  38.         gtk_container_add(GTK_CONTAINER(window),button);
  39.         gtk_widget_show_all(window);
  40.         gtk_main();
  41.         return FALSE;
  42. }
复制代码

makefile
不好使,要自己分三次用。才行。

  1. CC = gcc
  2. all:
  3.         $(CC) `pkg-config --cflags gtk+-2.0` -fPIC -DPIC -c hello.c -o hello.lo
  4. hello.lo:
  5.         $(CC) `pkg-config --libs gtk+-2.0` -shared hello.lo -o libhello.so
  6.         $(CC) main.c -o dll `pkg-config --cflags --libs gmodule-2.0 gtk+-2.0`
  7. clean:
  8.         rm *.o *.lo *.a *.la .libs -fr
复制代码

大家写的代码这样累在一起才能更好的发挥,GTK的长处啊。
发表于 2003-12-19 11:52:02 | 显示全部楼层
GooooooooooooooooooooD! 收下,谢谢
 楼主| 发表于 2003-12-19 18:43:11 | 显示全部楼层
与Linux_Lyb 写的程序并放到网上相比我输入的代码不算什么。
;)
发表于 2003-12-19 20:20:36 | 显示全部楼层
哈哈。。 wide288兄也太谦虚了吧,我们互相学习吧
发表于 2004-4-3 16:16:36 | 显示全部楼层

和基本C调用类似

基本的C动态调用也类似
先open库,然后去函数指针,然后调用函数,最后close库
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表