基于GLib-2.0开发的程序,与基于其他C语言库开发的程序并无区别,只需要在编译时指定GLib-2.0的头文件及库路径即可。下面介绍动态方式和静态方式如何开发基于GLib的程序。
动态方式调用GLib-2.0库
动态调用Glib-2.0库有多种方式,下面介绍三种。
首先创建一个main.c文件,内容如下。
#include <glib.h>
#include <glib/gprintf.h>
int main(int argc, char **argv)
{
g_print("hello, world! \n");
g_printf("hello, world! \n");
return 0;
}
上述程序演示了如何使用g_print
和g_printf
输出一句话。
注意:如果使用g_printf函数,需要包含头文件glib/gprintf.h
。
pkg-config查找头文件和动态库
pkg-config执行结果如下:
[root@centos7 glib]# pkg-config --cflags --libs glib-2.0
-I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -lglib-2.0
对于上述main.c文件,我们可以使用下面编译方式。
gcc -Wall `pkg-config --cflags glib-2.0` main.c `pkg-config --libs glib-2.0`
或者
gcc -Wall main.c `pkg-config --cflags --libs glib-2.0`
直接引用系统下的GLib-2.0库头文件和动态库
如果pkg-config命令不存在,或者没有pc文件,则可以直接引用系统GLib库的头文件和动态库。
如下提示说明没有pkg-config命令。
root@uos20-server:~# uname -r
4.19.0-loongson-3-server
root@topsec-PC:~# pkg-config --cflags --libs glib-2.0
-bash: pkg-config:未找到命令
root@topsec-PC:~#
如下提示说明没有glib-2.0.pc文件
[root@uos20 ~]# pkg-config --cflags --libs glib-2.0
Package glib-2.0 was not found in the pkg-config search path.
Perhaps you should add the directory containing `glib-2.0.pc'
to the PKG_CONFIG_PATH environment variable
Package 'glib-2.0', required by 'virtual:world', not found
[root@uos20 ~]#
对于无法使用pkg-config这种方式,我们可以直接引用系统GLib库头文件和静态库。命令如下所示。
[root@centos7 glib]# gcc -Wall -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include main.c -lglib-2.0
[root@centos7 glib]# ldd a.out
linux-vdso.so.1 => (0x00007ffc44de1000)
libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x00007f9c79abe000)
libc.so.6 => /lib64/libc.so.6 (0x00007f9c796f1000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f9c7948f000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f9c79273000)
/lib64/ld-linux-x86-64.so.2 (0x00007f9c79dd4000)
通过ldd命令可以查看到a.out引用了系统路径下的libglib-2.0.so库。
引用指定路径下的头文件和动态库
如果GLib-2.0库是我们自己编译的,或者是从其他设备拷贝过来的,则需要使用-Wl,-rpath
参数指定引用动态库的路径。
[root@centos7 glib]# gcc -Wall -I/opt/glib/include/glib-2.0 -I/opt/glib/lib/glib-2.0/include/ -Wl,-rpath=/opt/glib/lib main.c -lglib-2.0
[root@centos7 glib]# ldd a.out
linux-vdso.so.1 => (0x00007fffdda25000)
libglib-2.0.so.0 => /opt/glib/lib/libglib-2.0.so.0 (0x00007fc306ef5000)
libc.so.6 => /lib64/libc.so.6 (0x00007fc306b28000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fc30690c000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc307235000)
使用ldd命令查看编译出的二进制文件,可以看到引用的是用户指定路径下的glib库文件。
静态方式调用GLib-2.0库
静态库方式调用GLib-2.0库如下所示。
[root@centos7 glib]# gcc -Wall -I/opt/glib/include/glib-2.0 -I/opt/glib/lib/glib-2.0/include/ main.c /opt/glib/lib/libglib-2.0.a -lpthread
[root@centos7 glib]# ./a.out
hello, world!
hello, world!
[root@centos7 glib]# ldd a.out
linux-vdso.so.1 => (0x00007ffc745b8000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f67f2956000)
libc.so.6 => /lib64/libc.so.6 (0x00007f67f2589000)
/lib64/ld-linux-x86-64.so.2 (0x00007f67f2b72000)
[root@centos7 glib]#
使用ldd命令查看编译出的二进制文件,已经不再显示静态引用的glib库。