使用 Netbeans 编写 gtk+ 程序

安装好Netbeans和gtk+2.0,可以打开Netbeans创建C/C++代码咯。
偶是想用Realbasic创建一个桌面程序,用Realbasic创建界面,用C来写和系统相关的功能。
因为是在gnome的桌面环境下,所以,要用到gtk+库和其他。

从网上复制了一段拷贝屏幕的代码,用Netbeans打开,但gint,...没有定义。代码如下:

...
#include <gdk/gdk.h>
...
void do_capture_screenshot (char *file, int sec)
{
        gint x, y;
        GdkScreen* cur_screen = NULL;
        GdkWindow* window = NULL;
        GdkPixbuf* pixbuf_screenshot = NULL;
        GdkRectangle rect;
        GdkRectangle screen_rect;
...

加上 #include <gdk/gdk.h>,告知找不到这个头文件,难道是相关库没有加载?
将gnome,gdk,gtk什么的一股脑统统安装上系统,还是一样。

想来应该是项目中没有装载这些头文件的路径,打开项目的属性,在C编译器选项中找到[包含目录],加入头文件路径:
/usr/include/gtk-2.0
/usr/include/atk-1.0
/usr/include/cairo
/usr/include/pango-1.0
/usr/include/glib-2.0
/usr/include/freetype2
/usr/include/libpng12
/usr/lib/glib-2.0/include
/usr/lib/gtk-2.0/include
这样当前的.c文件能够编译咯。老实讲,上面这些包含文件目录,偶也不清楚它们是干什么用的,等看了文档再说。

可以开始编译项目了,但奇怪的是:
编译单个文件没问题,生成时,却出现未定义的引用错误:
/home/perry/xp_share/Test/copyscreen/copyscreen.c:40: undefined reference to `gdk_screen_get_default'
...
一大堆类似的提示,编译当然不会成功了。
在Netbeans的项目中找了半天没看到包含目录在那儿加,也没看到make文件在哪,左试下,右试下,象玩冒险游戏样...。
试了一天半,原来可以这样:
在项目上按右键,选择“将项目添加到重要文件中”,选择工程目录下的nbproject
就能在项目树中看到这个目录下的文件
可以找到.mk后缀的make文件了。
一大堆的gcc选项,要怎么改?看系统中的开发帮助文档(Devhelp),里头有这么一段:
-------------------------------------------------------------
Compiling GTK+ Applications on UNIX

To compile a GTK+ application, you need to tell the compiler where to find the GTK+ header files and libraries. This is done with the pkg-config utility.

The following interactive shell session demonstrates how pkg-config is used (the actual output on your system may be different):

$ pkg-config --cflags gtk+-2.0
-I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/pango-1.0 -I/usr/X11R6/include -I/usr/include/freetype2 -I/usr/include/atk-1.0 
$ pkg-config --libs gtk+-2.0
-L/usr/lib -L/usr/X11R6/lib -lgtk-x11-2.0 -lgdk-x11-2.0 -lXi -lgdk_pixbuf-2.0 -lm -lpangox -lpangoxft -lXft -lXrender -lXext -lX11 -lfreetype -lpango -latk -lgobject-2.0 -lgmodule-2.0 -ldl -lglib-2.0 

The simplest way to compile a program is to use the "backticks" feature of the shell. If you enclose a command in backticks (not single quotes), then its output will be substituted into the command line before execution. So to compile a GTK+ Hello, World, you would type the following:

$ cc `pkg-config --cflags --libs gtk+-2.0` hello.c -o hello
-------------------------------------------------------------

$ cc `pkg-config --cflags --libs gtk+-2.0` hello.c -o hello
看来是要在编译系统之前加入`pkg-config --cflags --libs gtk+-2.0`这段,照猫画虎,修改成:
gcc `pkg-config --cflags --libs gtk+-2.0` -o dist/Debug/${PLATFORM}/copyscreen ${OBJECTFILES} ${LDLIBSOPTIONS}

终于编译成功了,庆贺下!慢点,更正,应该是终于链接成功了。编译只是将当前文本变成对应CPU指令的二进制代码,而链接是将这些代码和外部库按操作系统规则组织成可执行文件(具体要看编译原理)。
这也是为什么编译单个文件没问题,项目生成时出现一堆错误这个现象。

更进一步:

`pkg-config --cflags --libs gtk+-2.0`
难道要手工加入吗?应该不会
在项目属性中,选链接器,在最下面有一个其他选项,将`pkg-config --cflags --libs gtk+-2.0`(注意要带'号)填入到它后面的文本框中。
再看由IDE自动生成的mk文件:
LDLIBSOPTIONS=
dist/Debug/${PLATFORM}/copyscreen: ${OBJECTFILES}
${MKDIR} -p dist/Debug/${PLATFORM}
gcc `pkg-config --cflags --libs gtk+-2.0` -o dist/Debug/${PLATFORM}/copyscreen  ${OBJECTFILES} ${LDLIBSOPTIONS}
和手工加入的一样,链接当然OK。

生成项目是,在Netbeans的输出窗口看最终的链接语句:
gcc `pkg-config --cflags --libs gtk+-2.0` -o dist/Debug/GNU-Linux-x86/copyscreen  build/Debug/GNU-Linux-x86/copyscreen.o
就是这个意思,不过不知道这是什么语法,要看gcc的文档。

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/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12  -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lpangoft2-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lgio-2.0 -lcairo -lpango-1.0 -lfreetype -lz -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lglib-2.0
就是列出了一堆相关的库路径。看来gcc `pkg-config --cflags --libs gtk+-2.0`,是先执行pkg-config --cflags --libs gtk+-2.0,输出文本到gcc的参数表中。

这样,Netbeans创建基于gtk+的工程成功结束。

长经验:
1 搞清楚编译和链接的关系
2 仔细看相关文档,尤其是官方的手册
 转载:http://blog.163.com/lghct@126/blog/static/6455180820102703037563/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值