Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1247410
  • 博文数量: 479
  • 博客积分: 12240
  • 博客等级: 上将
  • 技术积分: 4999
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-24 17:12
文章分类

全部博文(479)

文章存档

2014年(1)

2013年(1)

2012年(1)

2011年(95)

2010年(177)

2009年(167)

2008年(16)

2007年(21)

分类: LINUX

2009-12-03 16:56:22


编程

编程

直接C编程,由于比较繁琐,暂时不深究。等到工程实例需要的时候再进行逐个研究。再者,GTK+编程,有教材可以参考。

编程

可以使用glade-2.0编程,也可以使用gtk+-1.2+编程,不过,使用后者,工程属性的C Options中,必须将Gettext Support去掉,否则将会出现错误。但是,去掉这个属性不知道会对应用带来何种影响。

使用GLADE编程,在主机上编译通过以后,然后进行交叉编译。首先make clean,并配置好交叉编译器变量CC,然后重新configure

make clean
export CC=iwmmxt_le-gcc
./configure --host=iwmmxt_le --build=i686 --target=iwmmxt_le --with-gtk-exec-prefix=/opt/pro41/montavista/mobilinux/devkit/arm/iwmmxt_le/target/usr

交叉编译后得到的可执行文件,在ARM板上就能够运行了。不过要在目标系统的终端上运行。后台启动IceWM后,在串口终端也可以启动运行这些程序。

不过编译过程中有这样的警告:

cc1: warning: include location "/usr/include/gtk-2.0" is unsafe for cross-compilation
cc1: warning: include location "/usr/include/atk-1.0" is unsafe for cross-compilation
cc1: warning: include location "/usr/include/pango-1.0" is unsafe for cross-compilation
cc1: warning: include location "/usr/X11R6/include" is unsafe for cross-compilation
cc1: warning: include location "/usr/include/freetype2" is unsafe for cross-compilation
cc1: warning: include location "/usr/include/glib-2.0" is unsafe for cross-compilation

Makefile中有一句:

includedir = ${prefix}/include

oldincludedir = ${prefix}/include

 

或许,在./configure的时候加上:

includedir=/opt/pro41/montavista/mobilinux/devkit/arm/iwmmxt_le/target/usr/include

 

 

./configure --host=iwmmxt_le --build=i686 --target=iwmmxt_le includedir=/opt/pro41/montavista/mobilinux/devkit/arm/iwmmxt_le/target/usr/include oldincludedir=/opt/pro41/montavista/mobilinux/devkit/arm/iwmmxt_le/target/usr/include --with-gtk-exec-prefix=/opt/pro41/montavista/mobilinux/devkit/arm/iwmmxt_le/bin/

configure的时候加不行,必须在./autogen的时候加:

./autogen.sh --host=iwmmxt_le  CC=iwmmxt_le-gcc  includedir=/opt/pro41/montavista/mobilinux/devkit/arm/iwmmxt_le/target/usr/include oldincludedir=/opt/pro41/montavista/mobilinux/devkit/arm/iwmmxt_le/target/usr/include

出现警告:

/opt/pro41/montavista/mobilinux/devkit/arm/iwmmxt_le/bin/glib-gettextize: line 130:

 cd: /opt/montavista/foundation/devkit/arm/iwmmxt_le/share/glib-2.0/gettext: No such file or directory

gettext source directory

'/opt/montavista/foundation/devkit/arm/iwmmxt_le/share/glib-2.0/gettext' doesn't exist

这是gtk-2.0的缘故,使用gtk+-1.2+没有这个问题。

修改该文件:

vi /opt/pro41/montavista/mobilinux/devkit/arm/iwmmxt_le/bin/glib-gettextize

修改其中的gettext_dir变量后带来一些问题,同时也不能解决问题。恢复原样。

 

如果直接使用命令编译(主机):

gcc -Wall -g base.c -o base `gtk-config --cflags`  `gtk-config --libs`

1.2.1 交叉编译

使用gtk+-1.2+编程后进行交叉编译:

./autogen.sh --host=iwmmxt_le --build=i686 --target=iwmmxt_le CC=iwmmxt_le-gcc  --with-gtk-prefix=/opt/pro41/montavista/mobilinux/devkit/arm/iwmmxt_le/target/usr/ --with-gtk-exec-prefix=/opt/pro41/montavista/mobilinux/devkit/arm/iwmmxt_le/target/usr

 

还有:cc1: warning: include location "/usr/include/glib-1.2" is unsafe for cross-compilation这样的警告,无所谓了。

1.2.2 运行

可以在Tiny-X开启控制台,进入程序所在目录运行,也可以在串口终端输入如下命令运行:

# DISPLAY=0:0 ./hello

 

1.2.3 添加到Tiny-X

假定hello程序放在/home/root/gtk/目录下。

修改Tiny-X的菜单:

menu Demo folder {
        prog "Hello,Gtk" /home/root/gtk/hello /home/root/gtk/hello
    }

 

prog  显示的名称    程序(可包含路径)   执行程序(可包含路径)

 

1.2.4 HelloGtk+

RedHat中,启动Gtk+ 1.2+ GUI builder软件(注意,完全安装的RedHat 9.0系统有两个版本的Glade,另外一个版本是Gtk 2.0)。

选择FileàNew Project,选择新建一个工程,在弹出的提示框选择OK,然后开始构建工程。

1. 新建窗口,设置属性

       PalleteGTK+ Basic栏,点击Window控件,向工程添加一个窗口,在PropertiesWidget选项卡,在Tittle栏将窗口标题设置为“HelloGtk!”。

再选中Common栏,将窗口的高度和宽度分别设置为320240

打开Signals选项卡,在Signal栏选择信号delete_eventHandler栏设置为on_window1_delete_event,然后点击Add按钮,结果如下:

1. 添加控件

点击PaletteFixed Positions控件,然后点击刚刚创建的主窗口。同样,在PropertiesCommon栏设置该控件的大小为320x240

       点击Palette栏的Button控件,然后点击主窗口,连续放置两个按钮,并分别修改名称为PUSH MEEXIT,并调整按钮的大小和位置,如下图:

点击PaletteLabel控件,添加一个标签,并设置显示的字符串为“Hello, Gtk!”,调整标签大小,保证能完全显示字符串。       

为按钮PUSH ME添加信号和处理函数:

EXIT按钮添加信号和处理函数:

点击Save按钮,保存工程,并对工程属性进行设置:在General选项卡页面设置工程名称和保存路径,同时将GnomeEnable Gnome Support去掉。

C Options选项卡页面,将Gettext Support去掉:

然后保存。

1. 生成代码

保存后,在工程目录下仅有一个工程文件hello.glade以及这个文件的备份文件。

[root@RedHat hello]# ls
hello.glade  hello.glade.bak

点击GladeBulder按钮,生成代码,将会产生很多文件和目录。

[root@RedHat hello]# ls
acconfig.h  autogen.sh  configure.in  hello.glade.bak  Makefile.am  README  stamp-h.in
AUTHORS     ChangeLog   hello.glade   macros           NEWS         src

2. 主机编译

如果是主机编译的话,只需要执行autogen.sh文件,生成Makefile文件,然后Make即可。完毕,在src目录下会生成hello文件,执行即可。不过点击程序界面的任何按钮都没有反映,关闭程序后也不能退回到提示符,是因为没有任何代码支持的缘故。要实现这些功能,还需要编写一些简单的代码。

3. 交叉编译

如果已经进行过主机编译,最好先make distclean一下,如果没有进行过主机编译,直接运行命令:

./autogen.sh --host=iwmmxt_le --build=i686 --target=iwmmxt_le CC=iwmmxt_le-gcc  --with-gtk-prefix=/opt/pro41/montavista/mobilinux/devkit/arm/iwmmxt_le/target/usr/ --with-gtk-exec-prefix=/opt/pro41/montavista/mobilinux/devkit/arm/iwmmxt_le/target/usr

该命令指定的交叉编译器的路径等信息需要根据用户安装路径不同而进行修改。命令执行完毕,直接Make即可,得到的hello文件,下载或者NFS到目标系统,即可运行。

4. 编写具体代码

为了实现需要的功能,点击PUSH ME按钮,往终端答应一个字符串,点击EXIT按钮或者窗口的关闭按钮,程序退出。

程序在吗在src/callbacks.c文件中实现。黑色代码是系统自动生成的,只有蓝色代码是需要根据需要添加的代码。

gboolean
on_window1_delete_event                (GtkWidget       *widget,
                                        GdkEvent        *event,
                                        gpointer         user_data)
{

g_print("window1 delete event!\n");
    gtk_main_quit ();

    return FALSE;
}

void
on_button1_clicked                     (GtkButton       *button,
                                       gpointer         user_data)
{
    g_print("Hello, who clicked me?\n");
}

void
on_button2_clicked                     (GtkButton       *button,
                                       gpointer         user_data)
{
    gtk_main_quit ();
}

       然后再次make即可得到符合要求的程序了。

 

很少有GTK编程手册的书卖,可以参考网站:



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