分类: 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`
使用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这样的警告,无所谓了。
可以在Tiny-X开启控制台,进入程序所在目录运行,也可以在串口终端输入如下命令运行:
# DISPLAY=0:0 ./hello
假定hello程序放在/home/root/gtk/目录下。
修改Tiny-X的菜单:
menu
Demo folder {
prog "Hello,Gtk"
/home/root/gtk/hello /home/root/gtk/hello
}
prog 显示的名称 程序(可包含路径) 执行程序(可包含路径)
在RedHat中,启动Gtk+ 1.2+ GUI builder软件(注意,完全安装的RedHat 9.0系统有两个版本的Glade,另外一个版本是Gtk 2.0)。
选择FileàNew Project,选择新建一个工程,在弹出的提示框选择OK,然后开始构建工程。
在Pallete的GTK+ Basic栏,点击Window控件,向工程添加一个窗口,在Properties的Widget选项卡,在Tittle栏将窗口标题设置为“Hello,Gtk!”。
再选中Common栏,将窗口的高度和宽度分别设置为320、240。
打开Signals选项卡,在Signal栏选择信号delete_event,Handler栏设置为on_window1_delete_event,然后点击Add按钮,结果如下:
点击Palette的Fixed Positions控件,然后点击刚刚创建的主窗口。同样,在Properties的Common栏设置该控件的大小为320x240。
点击Palette栏的Button控件,然后点击主窗口,连续放置两个按钮,并分别修改名称为PUSH ME和EXIT,并调整按钮的大小和位置,如下图:
点击Palette的Label控件,添加一个标签,并设置显示的字符串为“Hello, Gtk!”,调整标签大小,保证能完全显示字符串。
为按钮PUSH ME添加信号和处理函数:
为EXIT按钮添加信号和处理函数:
点击Save按钮,保存工程,并对工程属性进行设置:在General选项卡页面设置工程名称和保存路径,同时将Gnome的Enable Gnome Support去掉。
在C
Options选项卡页面,将Gettext Support去掉:
然后保存。
保存后,在工程目录下仅有一个工程文件hello.glade以及这个文件的备份文件。
[root@RedHat hello]# ls
hello.glade hello.glade.bak
点击Glade的Bulder按钮,生成代码,将会产生很多文件和目录。
[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
如果是主机编译的话,只需要执行autogen.sh文件,生成Makefile文件,然后Make即可。完毕,在src目录下会生成hello文件,执行即可。不过点击程序界面的任何按钮都没有反映,关闭程序后也不能退回到提示符,是因为没有任何代码支持的缘故。要实现这些功能,还需要编写一些简单的代码。
如果已经进行过主机编译,最好先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到目标系统,即可运行。
为了实现需要的功能,点击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编程手册的书卖,可以参考网站: