Chinaunix首页 | 论坛 | 博客
  • 博客访问: 135246
  • 博文数量: 38
  • 博客积分: 2510
  • 博客等级: 少校
  • 技术积分: 376
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-07 22:44
文章分类
文章存档

2010年(38)

我的朋友

分类: LINUX

2010-07-24 16:47:50

2.3 GTK+开发环境

2.3.1 PC机编译环境的搭建                                     
1
、安装gcc

$ sudo apt-get install build-essential

安装完毕后写个helloworld程序就可以验证是否安装成功         

2
、安装GTK环境

GTK环境只要安装一个gnome-core-devel就可以了,里面集成了很多其他的包。除此之外还要转一些其他的东西,如 libglib2.0 -doclibgtk2.0-doc帮助文档,devhelp帮助文档查看,glade-gnomeglade-commonglade-doc 形界面设计等。

$ sudo apt-get install libgtk2.0-dev

$ sudo apt-get install gnome-core-devel
$ sudo apt-get install libglib2.0-doc libgtk2.0-doc
$ sudo apt-get install devhelp
$ sudo apt-get install glade-gnome glade-common glade-doc



3
、测试程序

#include
void hello(GtkWidget *widget,gpointer data)
{
g_print("Hello Ubuntu!\n");
} 54ne.com
gint delete_event(GtkWidget *widget,GdkEvent *event,gpointer data)
{
g_print ("delete event occurred\n");
return(TRUE);
}
void destroy(GtkWidget *widget,gpointer data)
{
gtk_main_quit();
}
int main( int argc, char *argv[] )
{
GtkWidget *window;
GtkWidget *button;
gtk_init (&argc, &argv);
window=gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_signal_connect (GTK_OBJECT(window),"delete_event",GTK_SIGNAL_FUNC(delete_event),NULL);
gtk_signal_connect (GTK_OBJECT (window), "destroy",GTK_SIGNAL_FUNC (destroy), NULL);
gtk_container_set_border_width (GTK_CONTAINER (window), 10);
button = gtk_button_new_with_label ("Hello Ubuntu!");
gtk_signal_connect (GTK_OBJECT (button), "clicked",GTK_SIGNAL_FUNC (hello), NULL);
gtk_signal_connect_object(GTK_OBJECT(button),"clicked",GTK_SIGNAL_FUNC (gtk_widget_destroy),GTK_OBJECT (window));
gtk_container_add (GTK_CONTAINER (window), button);
gtk_widget_show (button);
gtk_widget_show (window);
gtk_main();
return(0);

}


用下面命令编译运行
$ gcc gtkhello.c -o gtktest `pkg-config --cflags --libs gtk+-2.0`
$ ./gtktest
会显示一个带有一个按钮的窗口,点击按钮以后窗口关闭,命令行显示Hello Ubuntu

2.3.2 MIPS
交叉编译环境的搭建
1
、安装交叉编译器
根据厂家提供的安装说明,把工具链放到/opt,设置环境变量

$ export PATH=/opt/mipsel/bin:$PATH
$ export PKG_CONFIG_PATH=/opt/mipsel/mipsel-linux/lib/pkgconfig


$ mipsel-linux-gcc test.c –o test
编译通过并且能在MIPS平台上运行,说明编译器路径设置成功
使用file命令可查看二进制可执行文件的信息(包括内核版本号,处理器信息)

$ file test

MIPS平台可执行文件信息


ELF 32-bit LSB executable, MIPS, version 1 (SYSV), for GNU/Linux 2.4.0, dynamically linked (uses shared libs), not stripped


对比之下,
Intel
平台可执行文件信息

ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.8, dynamically linked (uses shared libs), not stripped


2
、编译能在开发板上运行的gtk+程序
测试程序

#include
void hello(GtkWidget *widget,gpointer data)
{
g_print("Hello Ubuntu!\n");
}
gint delete_event(GtkWidget *widget,GdkEvent *event,gpointer data)
{
g_print ("delete event occurred\n");
return(TRUE);
}
void destroy(GtkWidget *widget,gpointer data)
{
gtk_main_quit();
}
int main( int argc, char *argv[] )
{
GtkWidget *window;
GtkWidget *button;
gtk_init (&argc, &argv);
window=gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_signal_connect (GTK_OBJECT(window),"delete_event",GTK_SIGNAL_FUNC(delete_event),NULL);
gtk_signal_connect (GTK_OBJECT (window), "destroy",GTK_SIGNAL_FUNC (destroy), NULL);
gtk_container_set_border_width (GTK_CONTAINER (window), 10);
button = gtk_button_new_with_label ("Hello Ubuntu!");
gtk_signal_connect (GTK_OBJECT (button), "clicked",GTK_SIGNAL_FUNC (hello), NULL);
gtk_signal_connect_object (GTK_OBJECT (button), "clicked",GTK_SIGNAL_FUNC (gtk_widget_destroy),GTK_OBJECT (window));
gtk_container_add (GTK_CONTAINER (window), button);
gtk_widget_show (button);
gtk_widget_show (window);
gtk_main();
return(0);

}


$ mipsel-linux-gcc gtktest.c –o gtktest `pkg-config --cflags --libs gtk+-2.0`

编译成功后放到开发板上运行的时候提示无法display,估计是因为开发板上原来就已经有显示界面GPE的缘故,修改/etc/init.d/rcS后,成功运行。但是窗口的没有边框,重新开启GPE的时候就有边框了,可能是窗口管理器的问题。

虽然运行成功了,但是通过命令
          $ pkg-config –cflags –libs gtk+-2.0
出现的路径信息

-I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/pixman-1 -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 -ldl -lglib-2.0


就可以发现此时链接的库是本地计算机的库,而不是厂家提供的适合运行在开发板上的库。

使用命令

$ export PKG_CONFIG_PATH=/opt/mipsel/mipsel-linux/lib/pkgconfig
$ pkg-config –cflags –libs gtk+-2.0


出现路径信息

-DPNG_NO_MMX_CODE -I/opt/mipsel/mipsel-linux/include/gtk-2.0 -I/opt/mipsel/mipsel-linux/lib/gtk-2.0/include -I/opt/mipsel/mipsel-linux/include/atk-1.0 -I/opt/mipsel/mipsel-linux/include/cairo -I/opt/mipsel/mipsel-linux/include/pango-1.0 -I/opt/mipsel/mipsel-linux/include/glib-2.0 -I/opt/mipsel/mipsel-linux/lib/glib-2.0/include -I/opt/mipsel/mipsel-linux/include/freetype2 -I/opt/mipsel/mipsel-linux/include -I/opt/mipsel/mipsel-linux/include/libpng12 -L/opt/mipsel/mipsel-linux/lib -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 -ldl -lglib-2.0


这时候链接的库才是厂家所提供的库
虽然使用本地计算机的库也可以编译并在开发板上运行,然而使用厂家提供的库还是非常必要的。

3
、环境变量的生效
$ sudo vim /root/.bashrc
   
最后面添加

$ export PATH=/opt/mipsel/bin:$PATH
$ export PKG_CONFIG_PATH=/opt/mipsel/mipsel-linux/lib/pkgconfig


重启之后生效

2.3.3
集成开发环境的建立
集成开发环境使设计界面与其它部分代码完全分开,并且有可能做到在对界面进行改动后不必对应用进行编译。图形用户界面设计小组可不必关心应用程序的运行细 节, 同时编程人员也可以把他们的时间用于其它方面,而不需为界面的修改重复编写大量烦琐的gtk+函数。这种分工开发的形式符合软件工程的要求,对GUI软件 的开发也更方便。

glade
的优点
     1.
Glade设计出界面元素,设置界面元素属性,为构件的信号设置回调函数;
   2.将其存为XML格式,观察并修改不符合要求的部分;
   3.编写应用其它部分代码,并在应用中载入Glade文件,编译C代码生成执行文件。

安装glade2
在应用程序->添加/删除里面搜索glade,把相关的项选上并下载
此外还需要下载libgladelibglade依赖于libxmlgtk+

有两种交叉编译方式

自己写Makefile

CC = mipsel-linux-gcc

CFLAGS= -Wall -O3 -g

GTK_CONFIG_CFLAGS= `pkg-config --cflags gtk+-2.0`

GTK_CONFIG_LIBS= `pkg-config --libs gtk+-2.0`

test: main.o support.o interface.o callbacks.o

$(CC) main.o support.o interface.o callbacks.o -o initform $(GTK_CONFIG_LIBS)

main.o: main.c support.h interface.h callbacks.h

$(CC) $(CFLAGS) -c main.c -o main.o $(GTK_CONFIG_CFLAGS)

support.o: support.c support.h

$(CC) $(CFLAGS) -c support.c -o support.o $(GTK_CONFIG_CFLAGS)

interfaceo: interface.c interface.h support.h callbacks.h

$(CC) $(CFLAGS) -c interface.c -o interface.o $(GTK_CONFIG_CFLAGS)

callbacks.o: callbacks.c callbacks.h support.h interface.h

$(CC) $(CFLAGS) -c callbacks.c -o callbacks.o $(GTK_CONFIG_CFLAGS)

clean:

rm -f *.o test

$ make

成功编译并在开发板上运行

第二种方法

画好界面,点击联编后,命令行输入

# ./autogen.sh
# export CC=mipsel-linux-gcc
# ./configure --host=mipsel --build=i686 --target=mipsel --with-gtk-exec-
   prefix=/opt/mipsel/mipsel-linux

# make

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