1_05_GLib库入门与实践_第一个基于GLib库的程序

基于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_printg_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库。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值