在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库的源码中使用了这个宏),对于本程序而言,实际上没有作用,可以忽略。