1. 简介
glib (注意不是glibc)是一个常用的c语言库,据我所知GNOME、GTK、Gstreamer、Qemu等都或多或少使用到了这个它。这个库里面包含了丰富的功能,比如常用数据结构与算法的实现、网络基础库、事件监听、线程相关、gobject(实现了类的概念)等等。
2. glib库编译方法[ref]
这里我们需要编译glib,glib的代码托管在GNOME的gitlab上面,并且至今一直在频繁更新,写这个文档时已经到了2.63。
https://gitlab.gnome.org/GNOME/glib
这里我们直接抓最新的code来编译。最新的库基于meson来build,而不是Makefile
这个库编译期间可能会自动下载libffi、zlib库,另外还对libmount-dev、perl、pkg-config等库有依赖。
还有需要注意的是gcc和binutils的版本不能太旧,可能导致build failed,比如编译会用到objcopy 的–add-sym这个option,旧版本objcopy不存在这个选项。
下面是详细步骤
1) 下载
git clone https://gitlab.gnome.org/GNOME/glib
2)安装meson 环境
apt install python3-pip
python3 -m pip install meson
python3 -m pip install ninja
3)编译 command,进入glib 的root 目录
meson _build
ninja -C _build
ninja -C _build install # 这一步会将build好的库安装到 /usr/local/ 目录
4)大致看看安装的目录
头文件
/usr/local/include/glib-2.0/
gio glib glib-object.h glib-unix.h glib.h gmodule.h gobject
so文件
root@gstreamer:/map/projs/gstreamer/glib# ls /usr/local/lib/x86_64-linux-gnu
glib-2.0 libffi.so.7.1.0 libgio-2.0.so.0.6301.0 libglib-2.0.so.0.6301.0 libgmodule-2.0.so.0.6301.0 libgobject-2.0.so.0.6301.0 libgthread-2.0.so.0.6301.0
libffi.so libgio-2.0.so libglib-2.0.so libgmodule-2.0.so libgobject-2.0.so libgthread-2.0.so libz.so
libffi.so.7 libgio-2.0.so.0 libglib-2.0.so.0 libgmodule-2.0.so.0 libgobject-2.0.so.0 libgthread-2.0.so.0 pkgconfig
.pc 文件
root@gstreamer:/map/projs/gstreamer/glib# ls /usr/local/lib/x86_64-linux-gnu/pkgconfig/
gio-2.0.pc gio-unix-2.0.pc glib-2.0.pc gmodule-2.0.pc gmodule-export-2.0.pc gmodule-no-export-2.0.pc gobject-2.0.pc gthread-2.0.pc libffi.pc zlib.pc
3. glib app的编写
3.1 使用glib库需要包含相对应功能的头文件,
glib.h, glib-object.h, gio.h,gmodule.h, glib-unix.h, glib/gi18n-lib.h or glib/gi18n.h, glib/gprintf.h and glib/gstdio.h
3.2 另外需要指定相关的编译参数,按照依赖的模块,在gcc 编译参数加入如下部分或者全部
pkg-config --cflags --libs gobject-2.0
pkg-config --cflags --libs gmodule-no-export-2.0
pkg-config --cflags --libs gmodule-2.0
pkg-config --cflags --libs glib-2.0
相关链接如下:https://developer.gnome.org/glib/stable/glib-compiling.html
3.3 下面是一个简单的打印时间日期的例子,说明编译app的方法。
1)编译命令
gcc main.c `pkg-config --cflags glib-2.0 --libs glib-2.0`
2)main.c
#include <locale.h>
#include <glib.h> // 这里引用了glib的头文件
int
main (int argc, char *argv[])
{
gchar *fmt;
GDateTime *dt;
gchar *str;
setlocale (LC_ALL, "");
if (argc > 1)
fmt = argv[1];
else
fmt = "%x %X";
dt = g_date_time_new_now_local (); // glib的函数大都以 g_ 开头
str = g_date_time_format (dt, fmt);
g_print ("%s\n", str);
g_free (str);
g_date_time_unref (dt);
return 0;
}