glib的开发环境

Glib中的Floating references中,我们自己写了一个glib的小程序。这篇文章详细描述一下怎样在已经安装了glib的linux服务器上实现这个小程序的编译。

int main(void)
{
    GObject *obj;

    obj = g_object_new(G_TYPE_INITIALLY_UNOWNED, NULL);
    g_print("1. ref_count = %u, is_floating=%u\n", obj->ref_count, g_object_is_floating (obj));

    g_object_ref_sink(obj);
    g_print("2. ref_count = %u, is_floating=%u\n", obj->ref_count, g_object_is_floating (obj));

    // Critial reported only if glib is compiled with G_ENABLE_DEBUG, not test APP.
    // Seeing g_object_finalize() in gobject.c
    //g_object_unref(g_object_ref_sink(obj));
    g_object_unref(obj);
    g_print("At end, ref_count = %u\n", obj->ref_count);

    return 0;
}

确定使用的glib库

基本的libglib*.so是肯定需要的。此外,g_object_new/g_object_ref_sink等函数都是声明在gobject.h中的,因此还需要一个libgobject*.so这样的库。

linux的库一般都会放在/usr/lib/这个路径下,因此,我们直接在这个路径下查找这两个库,以便确认库文件的最终名称(路径也可以确认,但后面会用一种更好的方法来确认makefile中的库文件路径,因此这里对于输出的路径可以忽略)。输入命令:

find /usr/lib/ -name "libglib*"
find /usr/lib/ -name "libgobject*"

以下是输出的结果,

/usr/lib/x86_64-linux-gnu/libglib-2.0.a
/usr/lib/x86_64-linux-gnu/libglib-2.0.so
/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.5600.4

/usr/lib/x86_64-linux-gnu/libgobject-2.0.a
/usr/lib/x86_64-linux-gnu/libgobject-2.0.so
/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5600.4

"libglib-2.0.so"后面跟了类似".0"或者".0.5600.4"这样数字的,表示不同的版本,但库文件都是“libglib-2.0.so”,其在Makefile中的名称都是"lglib-2.0"。对于libgobject-2.0.so类似。

确定使用的glib头文件

在linux服务器上输入find命令查找对应的头文件

find /usr/include/ -name "glib*.h"

得到如下输出:

/usr/include/glib-2.0/glib/glib-autocleanups.h
/usr/include/glib-2.0/glib-object.h
/usr/include/glib-2.0/glib-unix.h
/usr/include/glib-2.0/glib.h
/usr/include/glib-2.0/gobject/glib-types.h
/usr/include/pulse/glib-mainloop.h

在本程序里,需要的是这两个:

/usr/include/glib-2.0/glib-object.h
/usr/include/glib-2.0/glib.h

于是,代码中,需要加入头文件

#include <glib.h>
#include <glib-object.h>

写Makefile

关于Makefile一般的写法,这里不作过多描述,网上这类文章很多,随便参考一份都可以。我这里参考的是这篇文章:makefile详解 - 一叶飘落尽知秋 - 博客园 (cnblogs.com)

对于本次实践而言,最重要的是确定“CFLAGS”和“LDFLAGS”怎么写。对于这个问题,有一个非常简便的方法,即在工作的linux服务器上敲以下命令:

pkg-config --cflags --libs glib-2.0 gobject-2.0

--cflags和--libs选项表明会输出后面库用到的头文件和动态链接库的详细名称。在我的服务器上,上述命令的输出如下:

-I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lgobject-2.0 -lglib-2.0

“-I”的内容放到CFLAGS中,-l的内容放到LDFLAGS中,于是可以确定:

CFLAGS=-I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include
LDFLAGS=-lgobject-2.0 -lglib-2.0

最终的Makefile内容如下:

.PHONY: clean
CC = gcc
RM = rm
EXE = float_ref
OBJS = main.o
CFLAGS=-I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -DG_ENABLE_DEBUG
LDFLAGS=-lgobject-2.0 -lglib-2.0
$(EXE):$(OBJS)
	$(CC) -o $(EXE) $(OBJS) $(LDFLAGS)
main.o: glib_floating_reference.c
	$(CC) $(CFLAGS) -o main.o -c glib_floating_reference.c
clean:
	$(RM) $(EXE) $(OBJS) 

注意:

  • $(EXE):$(OBJS) 这一行是最后的链接,因此$(LDFLAGS)用在这个命令中。而后面的".o"的生成命令是编译,因此$(CFLAGS)用在这个命令中
  • -DG_ENABLE_DEBUG是指打开“G_ENABLE_DEBUG”宏编译选项。这个宏编译选项其实是编译glib库时用的(可以看到glib库的源码中使用了这个宏),对于本程序而言,实际上没有作用,可以忽略。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值