Glib库简介
libc、glib、glibc简介
libc、glib、glibc简介glibc和libc都是Linux下的C函数库:libc是Linux下的ANSI C函数库,glibc是Linux下的GUN C函数库。
是⽤C写的⼀些⼯具,即C的⼯具库,和libc/glibc没有关系。
GLib是⼀个跨平台的、⽤C语⾔编写的五个底层库的集合,为GNOME所使⽤。
GLib起初是GTK+的⼀部分,但到了GTK+第⼆版,开发者决定把跟图形界⾯⽆关的代码分开,这些代码于是就组装成了GLib。
因为GLib具有跨平台特性,所以⽤它编写的程序可以⽆需进⾏⼤的修改就可以在其他程序上编译和运⾏。
glib提供了多种⾼级的数据结构,如内存块、双向和单向链表、哈希表、动态字符串以及字符串⼯具(例如词法分析器,字符串切分等)、动态数组,平衡⼆叉树、n-叉树、键值存储、关系和元组,还有带有缓存的内存管理。
Glib还实现了线程相关的函数、多线程编程以及相关的⼯具,例如原始变量访问,互斥锁,异步队列,安全内存池,消息传递和⽇志,钩⼦函数和计时器,同时消息传递还包含了字节序转换和IO channel。
GLib由五个库组成:GObject –对象系统,包括类型系统GTypeGlibGModuleGThreadGIOglibc是linux下⾯c标准库的实现,即GNU C Library。
glibc本⾝是GNU旗下的C标准库,后来逐渐成为了Linux的标准c库,⽽Linux下原来的标准c库Linux libc逐渐不再被维护。
GNU C库(英语:GNU C Library,常简称为glibc)是⼀种按照LGPL许可协议发布的,⾃由的,公开源代码的,⽅便从⽹络下载的C的编译程序。
GNU C运⾏期库,是⼀种C函数库,是程序运⾏时使⽤到的⼀些API集合,它们⼀般是已预先编译好,以⼆进制代码形式存在Linux类系统中,GNU C运⾏期库通常作为GNU C编译程序的⼀个部分发布。
Glibc最初是⾃由软件基⾦会(FSF)为其GNU操作系统所写,但当前最主要的应⽤是配合Linux内核,成为GNU/Linux操作系统⼀个重要的组成部分。
完全认识GNUC语言库glibc
完全认识GNUC语⾔库glibcfrom /6091358.html作者:周⽴发2007-02-051、C语⾔库是⽤来⼲什么的?编程⼈员所提到的库,其英⽂是library,到底是什么呢?简单说就是⼀些通⽤的程序代码被⽣成⽂件存储起来了,以后任何⼈写程序时如果需要⽤到这些通⽤代码只需要调⽤库函数接⼝就可以了。
⽐如我们C程序⾥通常⽤的printf函数,就是⽤来将程序⾥的信息输出到屏幕上的。
如果要求每个写程序的⼈都⾃⼰来写个函数去调⽤内核接⼝实现屏幕输出,那将是极⼤的浪费,所以前⼈已经写好这个函数相关的库了,在我们Linux系统中,这个库是GNU C语⾔库glibc,就是这个⽂件/usr/lib/libc.so。
当然,如果要使⽤⼀个库⽂件,⾸先得有个头⽂件来定义库⽂件⾥的每个函数,⽐如/usr/include/stdio.h,我们写程序时,只需要#include 就可以⽤printf来向屏幕输出信息了。
后⾯我们讲到如何⾃⼰⽣成库⽂件时,⼤家⼀定会相当明⽩,现在先知道库的基础知识吧。
2、如何获得库和⼿册⾸先,搜索到库⽂件,在Ubuntu和Debian系列的Linux系统中,我⽤这个命令就可以:apt-cache search GNU c library此命令输出部分如下:glibc-doc-reference - GNU C Library: Documentationlibc6 - GNU C Library: Shared librarieslibc6-amd64 - GNU C Library: 64bit Shared libraries for AMD64libc6-dbg - GNU C Library: Libraries with debugging symbolslibc6-dev - GNU C Library: Development Libraries and Header Fileslibc6-dev-amd64 - GNU C Library: 64bit Development Libraries for AMD64libc6-i686 - GNU C Library: Shared libraries [i686 optimized]libc6-pic - GNU C Library: PIC archive librarylibc6-prof - GNU C Library: Profiling Librarieslibc6-xen - GNU C Library: Shared libraries [Xen version]或者你可以搜索libc或glibc因为我们要编程序,即进⾏开发,所以我们得安装libc6-dev这个软件包。
glib函数说明
glib函数说明GLib函数说明简介GLib是一个开源的C函数库,提供了许多用于操作字符串、数据结构、文件系统等常见任务的函数。
它起初是为GTK+图形库而开发的,但现在已经被广泛使用于许多其他项目中。
常用函数g_strdup•函数描述:复制一个字符串并返回一个指向新字符串的指针。
•函数原型:gchar* g_strdup (const gchar *str);•示例代码:const char *source = "Hello, world!";char *destination = g_strdup(source);•返回值:返回一个指向复制字符串的指针,如果内存不足则返回NULL。
•注意事项:使用完后需要手动释放返回的指针。
g_list_append•函数描述:在链表的末尾添加一个元素。
•函数原型:GList* g_list_append (GList *list, gpointer data);•示例代码:GList *list = NULL; // 初始为空链表list = g_list_append(list, "Alice");list = g_list_append(list, "Bob");•返回值:返回添加了元素后的链表的指针。
•注意事项:需要传入链表的指针和要添加的元素的指针。
g_hash_table_new•函数描述:创建一个新的哈希表。
•函数原型:GHashTable* g_hash_table_new (GHashFunc hash_func, GEqualFunc key_equal_func);•示例代码:GHashTable *hash_table = g_hash_table_new(g_str_has h, g_str_equal);•返回值:返回指向新创建的哈希表的指针。
•注意事项:需要传入计算哈希值的函数和判断键值相等的函数。
glib库
浅析GLib级别: 初级 宋国伟 (gwsong52@ ),乡村小学英语教师2003 年 5 月 10 日 GLib 是GTK+和GNOME 工程的基础底层核心程序库,是一个综合用途的实用的轻量级的C 程序库,它提供C 语言的常用的数据结构的定义、相关的处理函数,有趣 而实用的宏,可移植的封装和一些运行时机能,如事件循环、线程、动态调用、对象系统等的API 。
它能够在类UNIX 的操作系统平台(如LINUX , HP-UNIX 等),WINDOWS ,OS2和BeOS 等操作系统台上运行。
GLib 需要一个支持线程的操作系统和一个字符集间转换函数iconv 的支持,事实上大多现代的操作系统都有以上两项功能。
GLib 由基础类型、对核心应用的支持、实用功能、数据类型和对象系统五个部分组成的。
GLib 的最新版本是GLib2.2.1,可以到 网站下载其源代码。
使用GLib2.0编写的应用程序,在编译时应该在编译命令中加入 `pkg-config -cflags -libs glib-2.0`,如编译一个名为hello.c 的程序,输出名为hello 的可执行文件,则命令为:gcc `pkg-config -cflags -libs glib-2.0` hello.c -o hello在GLIB 中将线程(gthread ),插件(gmoudle )和对象系统(gobject )这三个子系统区别对待,编译时要注意加入相应的参数。
如程序中用到对象系统,编译时就应加入:`pkg-config --cflags --libs gobject-2.0`用到线程,编译时则加入:文档选项 <tr valign="top"><td width="8"><img alt="" height="1" width="8" src="///i/c.gif"/></td><td width="16"><img alt="" width="16" height="16" src="///i/c.gif"/></td><td class="small" width="122"><p><span class="ast">未显示需要 JavaScript 的文档选项</span></p></td></tr>打印本页将此页作为电子邮件发送`pkg-config --cflags --libs gthread-2.0`用到插件,编译时则加入:`pkg-config --cflags --libs gmoudle-2.0`基础类型GLib的基础是由基础类型、范围限定宏、标准宏、类型转换宏、字节次序变换宏、数学常数定义和杂项宏等各项组成的。
中国高等学校教学资源网
中国高等学校教学资源网GLIB高等职业教育优质教学资源全库简介全库简介为了协助教育部促进全国高职高专院校教学资源的共享工作,提高资源共享的效率和质量,避免重复建设,充分发挥国家级高职高专示范院校的领头作用,“中国高等学校教学资源网”利用其在教学资源服务领域的影响力和网络服务优势,发起创建“高等职业院校优质教学资源全库”(简称CCTR-GLIB)。
GLIB 将各学校不同平台、不同结构的优秀教学资源和共享型专业资源库进行汇总、整合并统一到一个开放式的全专业的共享资源平台中。
目前该资源全库首批整合了“深圳职业技术学院”“天津电子信息职业技术学院和“中国高教学资源网”等上百所高校的优秀教学资源1000G,覆盖200个专业,共享型教学资源库建设是个滚动发展不断充实的过程,欢迎所有愿意开放共享的资源加入我们的建筑中。
我们还将为高职高专院校提供每年二次最新整合教学资源的更新服务。
全库资源架构GLIB以专业(群)为单元建立专业教学资源库群,专业参照教育部高职高专专业目录标准设置,同时实现了资源跨课程、课程跨专业的资源合理分布。
全库包含多家合作院校的优秀教学资源和专业教学资源库,每个专业的资源库按照专题分为以下类库:1.专业建设标准库:介绍每个共建学校该专业的建设信息、培养方案、课程标准、双师队伍模型、教学与教学管理模式、教学质量保障体系等专业建设标准。
2.专业教学课件库:收录相关专业所有课程的高质量多媒体课件;3.专业教学资料库:收录该专业理论课程的教学大纲、教案、计划、案例、试卷等教学资料;4.专业教学素材库:收录该专业的图片、音频、视频和动画素材资源。
5.实验课程资源库:收录实验课程的实验指导、实验相关资料、操作录像等资源;6.实训项目资源库:收录实习项目的相关资料、实训录像和仿真系统等;7.专业网络课程库:收录该专业的网络课程,一种是基于web网页形式的自主学习型网络课程;一种是基于教师课堂实录的讲授型网络课程;8.专业精品课程库:收录该专业各高校各级别的精品课程;9.专业行业应用库:收录该专业的行业应用资料,专业学术讲座视频;10.专业认证学习库:收录该专业相关的认证考试的学习资料、学习视频库;全库软件管理平台特点:1.符合教育部高职学校专业分类标准,按照专业课程的内在逻辑结构设计;按照专业和专业群为核心,以理论课、实验课、实训项目、专业素材及认证学习为实体对象,进行教学资源组织。
libc、glibc和glib的关系
【glibc 和 libc】glibc 和 libc 都是Linux下的 C 函数库。
libc 是 Linux 下的 ANSI C 函数库;glibc 是 Linux 下的 GUN C 函数库。
ANSI C 和 GNU C 有什么区别呢?ANSI C 函数库是基本的 C 语言函数库,包含了 C 语言最基本的库函数。
这个库可以根据头文件划分为 15 个部分,其中包括:1.<ctype.h>:包含用来测试某个特征字符的函数的函数原型,以及用来转换大小写字母的函数原型;2.<errno.h>:定义用来报告错误条件的宏;3.<float.h>:包含系统的浮点数大小限制;4.<math.h>:包含数学库函数的函数原型;5.<stddef.h>:包含执行某些计算 C 所用的常见的函数定义;6.<stdio.h>:包含标准输入输出库函数的函数原型,以及他们所用的信息;7.<stdlib.h>:包含数字转换到文本,以及文本转换到数字的函数原型,还有内存分配、随机数字以及其他实用函数的函数原型;8.<string.h>:包含字符串处理函数的函数原型;9.<time.h>:包含时间和日期操作的函数原型和类型;10.<stdarg.h>:包含函数原型和宏,用于处理未知数值和类型的函数的参数列表;11.<signal.h>:包含函数原型和宏,用于处理程序执行期间可能出现的各种条件;12.<setjmp.h>:包含可以绕过一般函数调用并返回序列的函数的原型,即非局部跳转;13.<locale.h>:包含函数原型和其他信息,使程序可以针对所运行的地区进行修改。
14.地区的表示方法可以使计算机系统处理不同的数据表达约定,如全世界的日期、时间、美元数和大数字;15.<assert.h>:包含宏和信息,用于进行诊断,帮助程序调试。
glib手册
glib手册是一个重要的参考资源,它提供了关于glib库的详细信息和用法指南。
glib库是一个广泛使用的C语言库,用于提供各种与内存管理、字符串处理、文件I/O和其他常见任务相关的功能。
以下是对glib手册的简要概述,以500-800字回答:glib库是一组用于C语言编程的库,它提供了许多实用的功能,包括内存管理、字符串处理、文件I/O和其他常见的任务。
glib库的主要目的是为了提供高效、灵活和易于使用的工具,以便开发人员能够更轻松地编写跨平台的代码。
glib库包含许多功能,其中包括:* 内存管理:glib提供了用于分配和释放内存的函数,以及用于跟踪内存使用情况的工具。
* 字符串处理:glib提供了用于处理字符串的函数,包括字符串连接、格式化输出、查找和替换等。
* 文件I/O:glib提供了用于读取和写入文件的函数,以及用于处理文件路径和文件锁的函数。
* 线程和同步:glib提供了用于创建和管理线程的函数,以及用于同步和事件处理的工具。
要使用glib库,您需要了解其基本概念和功能。
以下是使用glib库的一般步骤:1. 包含glib头文件:在您的代码中包含glib头文件,以便可以使用库中的函数和数据类型。
2. 初始化glib:在使用glib库之前,您需要调用一些初始化函数来设置库的状态。
3. 分配内存:使用glib提供的函数来分配内存,以便您可以在程序中存储数据。
4. 使用函数:使用glib提供的函数来完成您的任务,例如字符串处理、文件I/O等。
5. 释放内存:在使用完内存后,您需要使用glib提供的函数来释放它,以避免内存泄漏。
6. 清理glib:在程序结束时,您需要调用一些清理函数来释放glib的状态并关闭库。
总的来说,glib手册是一个非常有用的资源,它提供了关于glib库的详细信息和用法指南。
通过阅读手册并遵循其中的建议,您可以更好地了解如何使用glib库来编写高效、灵活和易于维护的代码。
第6章Gtk+编程基础
1
Unix/Linux程序环境
第6章
Gtk+编程基础
§6.1 glib库
简介
glib库是Linux平台下最常用的c语言函数库 glib库是Gtk+库和Gnome的基础 glib库为许多标准的、常用的c语言结构提供了相应的替代物 glib库的编码风格是半面向对象的 glib库的标识符使用一个前缀”g”,这是一种通行的命名约定 使用glib库的程序应包含glib的头文件”glib.h”,但如果程序 中已包含gtk.h或gnome.h则不需要。
gshort
glong gint gboolean gfloat gdouble
unsigned short
unsigned long unsigned int void * const void *
gushort
gulong guint gpointer gconstpointer
3
Unix/Linux程序环境
8
Unix/Linux程序环境
第6章
Gtk+编程基础
§6.2 Gtk+入门
第一个Gtk+程序
示例
/* exam3_1.c */ #include <gtk/gtk.h> int main( int argc, char *argv[] ) { // 声明一个窗口构件 GtkWidget *window; // 初始化GTK+ gtk_init (&argc, &argv); // 创建主窗口 window = gtk_window_new (GTK_WINDOW_TOPLEVEL); // 显示主窗口 gtk_widget_show (window); // 进入GTK+循环 gtk_main ();
Glib入门介绍
Glib⼊门介绍gnome是基于gtk+开发的⼀套桌⾯环境,gnome和KDE作为两⼤最流⾏的桌⾯环境,在全世界⼴泛使⽤。
只要是在Linux下⼯作的开发⼈员,对于gtk+⼀定不陌⽣。
⽽对于glib,这个gtk+下的⽆名英雄,其功能强⼤却鲜为⼈知。
今天,在这⾥简要介绍⼀下,如果你是开发⼈员,看完本⽂,相信你会爱上它的。
glib不是gllibc,尽管两者都是基于(L)GPL的开源软件。
但这⼀字之差却误之千⾥,glibc是GNU实现的⼀套标准C的库函数,⽽glib是gtk+的⼀套函数库。
在linux平台上,像其它任何软件⼀样,glib依赖于glibc。
glib不是⼀个学院派的东西,也不是凭空想出来的,完全是在开发gtk+的过程中,慢慢总结和完善的结果。
如果你是⼀个⼯作3年以上的C语⾔程序员,现在让你讲讲写程序的苦恼,你可能有很多话要说,但如果你有时间研究⼀下glib,你会发现,很多苦恼已不再成其为苦恼,glib ⾥很多东西正是你期望已经久的。
gobject是glib的精粹,glib是⽤C实现的,但在很⼤程序是基于⾯向对象思想设计的,gobject是所有类的基类。
signal在其中也是⼀⼤特⾊,signal与操作系统中的signal并不⼀样,它是类似消息⼀样的东西,让消息在各个对象间传递,但尽量降低对象间的耦合。
仔细读⼀下它的代码,唯⼀想说的话就是“绝!”。
动态数组、链表、哈希表等通⽤容器,在不同的公司,在不同的时期,在不同的情况下,我们每个⼈对每⼀种容器,可能都实现过N次以上。
甚⾄在同⼀个项⽬⾥,出现⼏份链表的实现,也并⾮罕见。
⼀直在抱怨,标准C中为什么没有类似于STL的标准容器,让全世界的程序员在数以万次的重复实现它们。
不过,还算⾛运,有了glib,恶梦在此终结了。
glib提供了动态数组、单/双向链表、哈希表、多叉树、平衡⼆叉树、字符串等常⽤容器,完全是⾯向对象设计的,实现得⾮常精致。
不⽤⽩不⽤,别客⽓了。
glib 类实例
glib 类实例glib是一种功能强大的C语言库,用于简化和加速开发过程。
它提供了许多用于处理常见任务的函数和数据结构,使开发人员能够更轻松地创建高效和可靠的应用程序。
一、什么是glib?glib是一种开源的通用库,最初由GNOME项目开发,并被广泛用于Linux和Unix系统中。
它提供了许多常见任务的函数和数据结构,包括字符串处理、内存管理、列表和哈希表等。
glib还提供了一些高级功能,如线程、进程间通信和网络编程等。
它被设计为可移植和高效的,可以在各种操作系统上运行。
二、glib的特点1.跨平台性:glib可以在多个操作系统上运行,包括Linux、Unix、Windows等。
这使得开发人员可以轻松地将其应用程序移植到不同的平台上,而不需要重新编写代码。
2.高效性:glib使用了许多优化技术,以提高性能和效率。
它提供了高效的数据结构和算法,可以快速地执行各种任务。
此外,glib 还支持多线程编程,可以充分利用多核处理器的优势。
3.丰富的功能:glib提供了许多功能丰富的模块,可用于各种开发任务。
例如,glib提供了字符串处理模块,可以方便地进行字符串操作,如拼接、分割和比较等。
另外,glib还提供了内存管理模块,可以帮助开发人员更有效地管理内存资源。
4.易于使用:glib的API设计简洁明了,易于使用和理解。
它提供了详细的文档和示例代码,可以帮助开发人员快速上手。
此外,glib还有一个活跃的社区,开发人员可以在其中获取支持和帮助。
三、glib的应用领域glib在许多开源项目中被广泛使用,尤其是在GNOME桌面环境中。
许多GNOME应用程序使用glib来处理字符串、内存和数据结构等任务。
此外,glib还被一些商业应用程序使用,如Adobe的Acrobat Reader和Google的Chrome浏览器等。
在开发过程中,glib可以帮助开发人员提高工作效率,减少开发时间。
它提供了许多高级功能和工具,如线程和进程管理、网络编程和文件操作等。
GLib简介
常用类型转换宏
主消息循环(The Main Event Loop)
g_main_loop_new g_main_run g_main_quit -> g_main_new, g_main_quit ->gtk_main(), gtk_main_quit() - g_timeout_add/g_timeout_add_seconds - g_source_remove
一个简单的示例
#include <glib.h>
class TestThread{ public: TestThread(); ~TestThread();
void Start(); GMainLoop* GetMainLoop() const; private: static gpointer SetThread(gpointer user_data); static gpointer GetThread(gpointer user_data); static gpointer CheckThread(gpointer user_data); void ProduceThread(gint iValue); void ConsumeThread(); void CheckFinish(); GMutex* m_pMutex; GCond* m_pCond; GMainLoop* m_pMainLoop; gint m_iStorage; gboolean m_bSetThreadEnd; gboolean m_bGetThreadEnd; };
gpointer TestThread::CheckThread(gpointer user_data) { TestThread* pThis = (TestThread*)user_data; if (NULL != pThis) { pThis->CheckFinish(); } return NULL; } void TestThread::ProduceThread(gint iValue) { g_mutex_trylock(m_pMutex); if(m_iStorage != -1) { g_cond_wait(m_pCond, m_pMutex); } m_iStorage = iValue; g_print("produce set: %d\n", m_iStorage); g_cond_signal(m_pCond); g_mutex_unlock(m_pMutex); } void TestThread::ConsumeThread() { g_mutex_trylock(m_pMutex); if(m_iStorage == -1) { g_cond_wait(m_pCond, m_pMutex); } g_print("consume get: %d\n", m_iStorage); m_iStorage = -1; g_cond_signal(m_pCond); g_mutex_unlock(m_pMutex);
glibc各个库作用介绍
glibc各个库作用介绍Library componentContentInclusion guidelinesld(This library component is not itself a library. Instead, ld.so is an executable invoked by the ELF binary format loader to load the dynamically linked libraries into an application’s memory space.)Dynamic linker.Compulsory. Needed to use any shared libraries.Theoretically not necessary if using only a staticallybuilt root filesystem—although this is quite rare,unless you are only using BusyBox, for example.libBrokenLocaleFixup routines to get applications that havebroken locale features to run. Overrides applicationdefaults through preloading. (Need touse LD_PRELOAD.)Rarely used.libSegFaultRoutines for catching segmentation faults anddoing backtraces.Rarely used.libanlAsynchronous name lookup routines.Rarely used.libbsd-compatDummy library for certain BSD programs thatare compiled with -lbsd-compat.Rarely used.libcMain C library routinesCompulsory.libcryptCryptography routines.Required for most applications involved in authentication.libdlRoutines for loading shared objectsdynamicallyRequired for applications that use functions such as dlopen().libmMath routines.Required for math functions.libmemusageRoutines for heap and stack memory profiling.Rarely used.libnslNIS network services library routines.Rarely used.libnss_compatName Switch Service (NSS) compatibility routines for NIS. Loaded automatically by the glibc NSSlibnss_dnsNSS routines for DNS.Loaded automatically by the glibc NSSlibnss_filesNSS routines for file lookups.Loaded automatically by the glibc NSSlibnss_hesiodNSS routines for Hesiod name service.Loaded automatically by the glibc NSSlibnss_nisNSS routines for NIS.Loaded automatically by the glibc NSSlibnss_nisplusNSS routines for NIS plus.Loaded automatically by the glibc NSSlibpcprofileProgram counter profiling routinesRarely used.libpthreadPOSIX 1003.1c threads routines for Linux.Required for threads programming.libresolvName resolver routines.Required for name resolution.librtAsynchronous I/O routines.Rarely used.libthread_dbThread debugging routines.Loaded automatically by gdb when debugging threaded applications. Never actually linked to by any application.libutilLogin routines, part of the user accounting database.Required for terminal connection management.。
Glib库简介
glib 库是 Linux 平台下最常用的 C 语言函数库,它具有很好的可移植性和实用性。glib 是 Gtk+库和 Gnome 的基础。glib 可以在多个平台下使用,比如 Linux、Unix、Windows 等。glib 为许多标准的、常用的 C 语言结构提供了相应的替代物。如果有什么东西本书没有介绍到, 请参考 glib 的头文件:glib . h。glib . h 中的头文件很容易理解,很多函数从字面上都能猜出 它的用处和用法。如果有兴趣, glib 的源代码也是非常好的学习材料。 glib 的各种实用程序具有一致的接口。它的编码风格是半面向对象,标识符加了一个前缀 “g”,这也是一种通行的命名约定。使用 glib 库的程序都应该包含 glib 的头文件 glib . h。如果 程序已经包含了 gtk.h 或 gnome.h,则不需要再包含 glib . h。
glib 的宏 常用宏
glib 定义了一些在 C 程序中常见的宏, 详见下面的列表。 TRUE / FALSE / NULL 就是 1 / 0 / ( ( void* ) 0 )。MIN( ) /MAX( )返回更小或更大的参数。ABS ( )返回绝对值。CLAMP(x, low,high )若 X 在[ low, high]范围内,则等于 X;如果 X 小于 low,则返回 low;如果 X 大于 high,则返回 high。 一些常用的宏列表 #include <glib.h> TRUE FALSE NULL MAX(a, b) MIN(a, b) ABS ( x ) CLAMP(x, low, high) 有些宏只有 glib 拥有,例如在后面要介绍的 gpointer-to-gint 和 gpointer-to-guint。 大多数 glib 的数据结构都设计成存储一个 gpointer。如果想存储指针来动态分配对象,可 以这样做。然而,有时还是想存储一列整数而不想动态地分配它们。虽然 C 标准不能严格保 证,但是在多数 glib 支持的平台上,在 gpointer 变量中存储 gint 或 guint 仍是可能的。在某些 情况下,需要使用中间类型转换。 下面是示例: gint my_int; gpointer my_pointer; my_int = 5; my_pointer = GINT_TO_POINTER(my_int); printf("We are storing %d\n", GPOINTER_TO_INT(my_pointer)); 这些宏允许在一个指针中存储一个整数,但在一个整数中存储一个指针是不行的。如果要 实现的话,必须在一个长整型中存储指针。 宏列表:在指针中存储整数的宏 #include <glib.h> GINT_TO_POINTER ( p ) GPOINTER_TO_INT ( p )
glib2交叉编译
glib2交叉编译1. 什么是glib2glib2是一个开源的C语言通用库,它提供了许多常用的功能和数据结构,如动态数组、哈希表、字符串操作等。
glib2广泛应用于Linux和Unix系统中,被许多桌面环境和应用程序使用。
2. 为什么要进行交叉编译交叉编译是指在一台主机上编译出在另一种体系结构上运行的程序。
在嵌入式系统开发中,由于资源有限,常常需要将开发环境从主机迁移到目标设备上。
而glib2作为一个通用库,在嵌入式系统中也有广泛的应用。
因此,进行glib2的交叉编译可以将开发环境迁移到目标设备上,方便对嵌入式系统进行开发和调试。
3. glib2交叉编译的准备工作在进行glib2交叉编译之前,我们需要先准备好一些工具和环境:3.1 目标设备的交叉编译工具链首先需要获得目标设备的交叉编译工具链。
这个工具链包括了针对目标设备体系结构的GCC、LD等工具,以及一些头文件和库文件。
可以从目标设备的官方网站或开发者社区获取到对应的交叉编译工具链。
3.2 主机环境的配置在主机上进行交叉编译之前,需要先配置好主机的环境。
首先,需要安装好GCC等基本的开发工具。
其次,需要设置好主机与目标设备之间的网络连接,以便后续将交叉编译生成的程序传输到目标设备上。
3.3 获取glib2源代码从glib2的官方网站或开发者社区获取最新版本的源代码包,并解压到本地。
4. glib2交叉编译步骤有了上述准备工作之后,我们就可以开始进行glib2的交叉编译了。
下面是具体步骤:4.1 设置环境变量首先需要设置一些环境变量,以告知编译系统使用交叉编译工具链。
例如:export CC=<path to cross compiler>export CXX=<path to cross compiler>export LD=<path to cross linker>export AR=<path to cross archiver>export AS=<path to cross assembler>其中<path to cross compiler>等是你下载并安装好的交叉编译工具链中对应的可执行文件路径。
glibc 源码 解读
glibc 源码解读
glibc (GNU C Library) 是GNU 和Linux 操作系统的标准C 库,它提供了许多用于开发应用程序的基础函数,如内存管理、文件I/O、网络编程等。
由于glibc 是开源的,因此我们可以直接查看其源代码,了解其内部实现。
解读glibc 源码需要具备一定的C 语言基础和系统编程知识。
下面是一些建议,帮助你开始解读glibc 源码:
了解glibc 的功能和模块:首先,你需要了解glibc 的主要功能和模块,例如内存管理、文件I/O、网络编程等。
这样可以帮助你更好地理解各个模块之间的联系和协作。
从简单函数开始:从简单的函数开始阅读,例如打开文件、读取文件、内存分配等。
这些函数通常是glibc 中的基础函数,其实现相对简单,但包含了glibc 的基本思想和机制。
跟踪调用关系:在阅读源码时,要关注函数之间的调用关系,了解每个函数的作用和输入输出参数。
这有助于你理解整个程序的流程和逻辑。
查看文档和注释:glibc 的源码中包含了许多文档和注释,这些文档和注释可以帮助你更好地理解代码的实现原理和用途。
实践和调试:通过编写简单的程序来调用glibc 函数,并使用调试工具来跟踪程序的执行过程,可以帮助你更好地理解glibc 的实现原理和机制。
参与社区讨论:如果你在阅读过程中遇到问题或困难,可以参与glibc 的社区讨论,与其他开发者交流经验和心得。
glib的ndk交叉编译
glib的ndk交叉编译交叉编译是一种在一种架构上编译生成在另一种架构上运行的程序的方法。
在Android开发中,交叉编译通常用于生成可以在Android 设备上运行的本地代码。
其中,NDK(Native Development Kit)是Android提供的一种用于进行本地开发的工具集,它包含了交叉编译的工具和库。
glib是一种广泛使用的C语言库,本文将介绍如何使用glib和NDK进行交叉编译。
一、准备工作1. 确保已安装Android NDK。
可以从官方网站下载并安装合适的版本。
2. 配置环境变量。
将NDK的安装路径添加到系统环境变量中,以便系统可以找到相关的工具和库。
3. 安装必要的编译工具。
例如,gcc、make等。
4. 下载glib源代码。
可以从官方网站下载glib源代码,或者使用git clone命令从Git仓库中获取。
二、编译glib库1. 进入glib源代码目录。
2. 执行以下命令进行编译:```shell$NDK/build/tools/ndk-build NDKKDIR=<path-to-glib>/src```这将生成一些静态库和共享库文件,可以在Android设备上使用。
三、创建Android.mk文件为了使用NDK进行交叉编译,需要创建一个Android.mk文件,该文件指定了需要编译的源代码文件和需要的库文件。
在glib源代码的根目录下创建Android.mk文件,内容如下:```makefileinclude $(BUILD_SHARED_LIBRARY)LOCAL_SRC_FILES := $(shell find src -name '*.c')include $(BUILD_EXECUTABLE)```这个文件告诉NDK编译器需要编译一个共享库和一个可执行文件,源代码文件位于src目录下。
四、配置build.gradle文件在glib源代码的根目录下创建一个名为build.gradle的文件,内容如下:```groovyapply plugin: 'android'android {compileSdkVersion 30buildToolsVersion "30.0.3"ndk {abiFilters 'armeabi-v7a', 'x86' //指定支持的ABI 类型}}dependencies {implementation fileTree(dir: 'libs', include:['*.jar']) //引入编译生成的jar包}```这个文件配置了Android项目的属性,并指定了支持的ABI类型。
GLIB库:创建链表
GLIB库:创建链表glib提供了普通的单向链表和双向链表,分别是GSList 和GList。
创建链表、添加一个元素的代码:GSList* list = NULL;gchar* element = g_strdup("a string");list = g_slist_append(list, element);删除上面添加的元素并清空链表:list = g_slist_remove(list, element);为了清除整个链表,可使用g_slist_free(),它会快速删除所有的链接;g_slist_free()只释放链表的单元,它并不知道怎样操作链表内容。
访问链表的元素,可以直接访问GSList结构:gchar* my_data = list->data;为了遍历整个链表,可以如下操作:GSList* tmp = list;while (tmp != NULL){printf("List data: %p/n", tmp->data);tmp = g_slist_next(tmp);}下面的代码可以用来有效地向链表中添加数据:void efficient_append(GSList** list, GSList** list_end, gpointer data){g_return_if_fail(list != NULL);g_return_if_fail(list_end != NULL);if (*list == NULL){g_assert(*list_end == NULL);*list = g_slist_append(*list, data);*list_end = *list;}else{*list_end = g_slist_append(*list_end, data)->next;}}要使用这个函数,应该在其他地方存储指向链表和链表尾的指针,并将地址传递给efficient_append ():GSList* list = NULL;GSList* list_end = NULL;efficient_append(&list, &list_end, g_strdup("Foo"));efficient_append(&list, &list_end, g_strdup("Bar"));efficient_append(&list, &list_end, g_strdup("Baz"));函数列表:访问链表中的数据#include <glib.h>GSList* g_slist_find(GSList* list,gpointer data)GSList* g_slist_nth(GSList* list,guint n)gpointer g_slist_nth_data(GSList* list,guint n)GSList* g_slist_last(GSList* list)gint g_slist_index(GSList* list,gpointer data)void g_slist_foreach(GSList* list,GFunc func,gpointer user_data)。
cmake编译glib
cmake编译glib在软件开发过程中,我们常常会使用到一些常用的库来提高开发效率和代码质量。
glib就是其中之一,它是一个功能强大的通用C库,提供了许多实用的数据结构和函数,被广泛用于GTK+和GNOME等项目中。
本文将介绍如何使用cmake来编译glib库。
cmake是一个跨平台的开源构建工具,它可以根据不同的平台和编译器生成相应的构建文件,比如Makefile或Visual Studio项目文件。
使用cmake可以使项目的构建过程更加简单和灵活。
在开始编译之前,我们首先需要安装cmake和glib库。
cmake的安装非常简单,只需下载对应平台的安装包,然后按照提示进行安装即可。
glib库的安装也很简单,可以通过包管理器来进行安装,比如在Ubuntu上可以使用以下命令进行安装:```sudo apt-get install libglib2.0-dev```安装完成后,我们就可以开始编译glib库了。
首先,创建一个新的文件夹,用于存放编译生成的文件。
然后,在该文件夹下创建一个CMakeLists.txt文件,用于描述项目的构建规则。
CMakeLists.txt文件的内容如下:```cmake_minimum_required(VERSION 3.0)project(glib_example)find_package(PkgConfig REQUIRED)pkg_check_modules(GLIB REQUIRED glib-2.0)include_directories(${GLIB_INCLUDE_DIRS})link_directories(${GLIB_LIBRARY_DIRS})add_executable(example main.c)target_link_libraries(example ${GLIB_LIBRARIES})```上述内容首先指定了cmake的最低版本,然后定义了项目的名称为glib_example。
glib库 sv类型 -回复
glib库sv类型-回复每天我们使用的计算机程序中,都有许多不同的库和工具,用于帮助我们更高效地完成工作。
而一个非常有用的库是glib库,它提供了一系列的数据结构、算法和功能,用于简化C编程过程中的常见任务。
在本文中,我们将关注glib库中的sv类型,并逐步回答与之相关的问题。
首先,我们需要了解sv类型是什么以及它的作用。
在glib库中,sv类型代表“串向量”(string vector),它是一种用于存储字符串的动态数组。
与C语言中的常规数组不同,sv类型可以根据需要自动调整大小,并提供了许多与数组操作相关的功能。
通过使用sv类型,我们可以更加轻松和灵活地处理字符串数组,无需担心数组大小的限制或数据的添加和删除。
那么,如何使用sv类型呢?首先,我们需要包含glib库的头文件:"#include<glib.h>"。
然后,我们可以使用glib库提供的函数来创建和操作sv类型的实例。
其中,创建一个sv实例的最简单方法是使用g_array_new()函数,例如:GArray *str_array = g_array_new(FALSE, FALSE, sizeof(gchar*)); 这将返回一个新的sv实例,其元素类型为gchar*。
一旦我们创建了sv实例,我们可以使用一系列的函数来进行添加、删除、查询和修改操作。
例如,我们可以使用g_array_append_val()函数向sv 实例中添加一个新元素,如:g_array_append_val(str_array, "Hello,"); 这将把"Hello,"添加到sv实例的末尾。
同样,我们也可以使用g_array_remove_index()函数删除特定位置的元素,如:g_array_remove_index(str_array, index); 这将删除sv实例中索引为index的元素。
Linux环境常用库简介
Linux环境常用库简介一个程序的开发离不开许多库函数的支持,可是库如此之多,有开源免费的也有收费的。
很希望熟悉编程的前辈把自己的经验整理下,常用的库都包含哪些功能。
下文是在网上找的一个类似的资料。
期待更多更全的内容。
---------------------------------------------------------------------------------------------------看到有时候大家在写代码的时候不知道应该加入何种库,所以特地总结了一下.供大家参考.库头文件描述libGL.so <GL/gl.h> 实现到OpenGL API的接口libGLU.so <GL/glu.h> 实现到OpenGL API的接口libImlib.so <Imlib.h> 实现一套图像处理例程libc.so 实现标准C库(不需要头文件)libcom_err.so <com_err.h> 实现出错处理例程的集合libcrypt.so <crypt.h> 实现加密函数的集合libcurses.so <curses.h> 光标字符模式的屏幕操作库libdb.so <db.h> 创建和操作数据库的库libdl.so <dlfcn.h> 让程序在运行时加载和使用库代码而无须在编译时链接库libform.so <form.h> 实现字符模式应用程序的窗体处理能力libglib.so <glib.h> Glib库,提供了大多数程序需要的大量基本工具函数,比如散列表等libgthread.so <glib.h> 实现对Glib的线程支持libgtk.so <gtk/gtk.h> GIMP下的X库libhistory.so <readline/readline.h> 实现GNU readline(libreadline)包中的命令行历史机制libjpeg.so <jpeglib.h> 定义到JPEG库的接口,赋予应用程序使用JPEG图像文件的能力libm.so <math.h> 实现标准C数学库libmenu.so <menu.h> 提供在字符模式屏幕上创建和使用菜单的例程libncurses.so <ncurses.h> 使用ncurses文本模式屏幕控制系统的应用程序的基础库libnss.so <nss.h> 用于名字服务切换工具的功能,提供了名字数据库比如DNS接口libpanel.so <panel.h> 提供在字符模式屏幕上创建和使用面板的例程libpbm.so <pbm.h> 可移植的位图库,实现了使用多种格式单色位图的接口libpgm.so <pgm.h> 可移植的灰度图库,实现了使用多种格式灰色位图的接口libpng.so <png.h> 用于编码,解码和操作PNG格式图像文件的参考实现libpnm.so <pnm.h> 可移植anymap库是使用多种位图格式的基础库libppm.so <ppm.h> 可移植的像素图库实现了使用多种格式彩色像素图的接口libpthread.so <pthread.h> 实现了POSIX线程库,标准的Linux多线程库libreadline.so <readline/readline.h> GNU readline包的基础库,该软件包能够让应用软件存储,记忆并且编辑命令行.libresolv.so <resolv.h> 提供使用因特网域名服务器和服务的接口libslang.so <slang.h> 提供方便的脚本语言S-lang,用于嵌入其它应用程序libtiff.so <tiffio.h> 读写TIFF格式图像文件的库libz.so <zlib.h> 通用压缩例程库libvga.so <vga.h> Linux的底层VGA和SVGA图形库1、glib库glib 库是gtk+和gnome的基础库,并具是跨平台的,在linux、unix和windows 下都可以用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Glib库简介g l i b库是L i n u x平台下最常用的C语言函数库,它具有很好的可移植性和实用性。
g l i b是G t k +库和G n o m e的基础。
g l i b可以在多个平台下使用,比如L i n u x、U n i x、Wi n d o w s等。
g l i b为许多标准的、常用的C语言结构提供了相应的替代物。
如果有什么东西本书没有介绍到,请参考g l i b的头文件:g l i b . h。
g l i b . h中的头文件很容易理解,很多函数从字面上都能猜出它的用处和用法。
如果有兴趣, g l i b 的源代码也是非常好的学习材料。
g l i b的各种实用程序具有一致的接口。
它的编码风格是半面向对象,标识符加了一个前缀“g”,这也是一种通行的命名约定。
使用g l i b库的程序都应该包含g l i b的头文件g l i b . h。
如果程序已经包含了g t k . h或g n o m e . h,则不需要再包含g l i b . h。
类型定义g l i b的类型定义不是使用C的标准类型,它自己有一套类型系统。
它们比常用的C语言的类型更丰富,也更安全可靠。
引进这套系统是为了多种原因。
例如,g i n t 3 2能保证是3 2位的整数,一些不是标准C的类型也能保证。
有一些仅仅是为了输入方便,比如guint 比u n s i g n e d更容易输入。
还有一些仅仅是为了保持一致的命名规则,比如, g c h a r和c h a r是完全一样的。
以下是g l i b基本类型定义:整数类型:g i n t 8、g u i n t 8、g i n t 1 6、g u i n t 1 6、g i n t 32、g u i n t 3 2、g i n t 6 4、g u i n t 6 4。
其中g i n t 8是8位的整数,g u i n t 8是8位的无符号整数,其他依此类推。
这些整数类型能够保证大小。
不是所有的平台都提供6 4位整型,如果一个平台有这些, g l i b会定义G _ H AV E _ G I N T 6 4。
整数类型g s h o r t、g l o n g、g i n t和s h o r t、l o n g、i n t完全等价。
布尔类型g b o o l e a n:它可使代码更易读,因为普通C没有布尔类型。
G b o o l e a n可以取两个值:T R U E和FA L S E。
实际上FA L S E定义为0,而T R U E定义为非零值。
字符型g c h a r和c h a r完全一样,只是为了保持一致的命名。
浮点类型g f l o a t、g d o u b l e和f l o a t、d o u b l e完全等价。
指针g p o i n t e r对应于标准C的void *,但是比void *更方便。
指针g c o n s t p o i n t e r对应于标准C的const void *(注意,将const void *定义为const gpointer是行不通的)。
glib的宏常用宏g l i b定义了一些在C程序中常见的宏,详见下面的列表。
T R U E / FA L S E / N U L L就是1 / 0 / ( ( v o i d * ) 0 )。
M I N ( ) / M A X ( )返回更小或更大的参数。
A B S ( )返回绝对值。
CLAMP(x, low,h i g h )若X在[ l o w, high]范围内,则等于X;如果X小于l o w,则返回l o w;如果X大于h i g h,则返回h i g h。
一些常用的宏列表#include <glib.h>T R U EF A L S EN U L LMAX(a, b)MIN(a, b)A B S ( x )CLAMP(x, low, high)有些宏只有g l i b拥有,例如在后面要介绍的g p o i n t e r-to-gint 和g p o i n t e r- t o - g u i n t。
大多数g l i b的数据结构都设计成存储一个g p o i n t e r。
如果想存储指针来动态分配对象,可以这样做。
然而,有时还是想存储一列整数而不想动态地分配它们。
虽然C标准不能严格保证,但是在多数g l i b支持的平台上,在g p o i n t e r变量中存储g i n t或g u i n t仍是可能的。
在某些情况下,需要使用中间类型转换。
下面是示例:gint my_int;gpointer my_pointer;my_int = 5;my_pointer = GINT_TO_POINTER(my_int);printf("We are storing %d\n", GPOINTER_TO_INT(my_pointer));这些宏允许在一个指针中存储一个整数,但在一个整数中存储一个指针是不行的。
如果要实现的话,必须在一个长整型中存储指针。
宏列表:在指针中存储整数的宏#include <glib.h>G I N T _ T O _ P O I N T E R ( p )G P O I N T E R _ T O _ I N T ( p )G U I N T _ T O _ P O I N T E R ( p )G P O I N T E R _ T O _ U I N T ( p )调试宏g l i b提供了一整套宏,在你的代码中使用它们可以强制执行不变式和前置条件。
这些宏很稳定,也容易使用,因而G t k +大量使用它们。
定义了G_DISABLE_CHECKS 或G _ D I S A B L E _ A S S E RT之后,编译时它们就会消失,所以在软件代码中使用它们不会有性能损失。
大量使用它们能够更快速地发现程序的错误。
发现错误后,为确保错误不会在以后的版本中出现,可以添加断言和检查。
特别是当编写的代码被其他程序员当作黑盒子使用时,这种检查很有用。
用户会立刻知道在调用你的代码时发生了什么错误,而不是猜测你的代码中有什么缺陷。
当然,应该确保代码不是依赖于一些只用于调试的语句才能正常工作。
如果一些语句在生成代码时要取消,这些语句不应该有任何副作用。
宏列表:前提条件检查#include <glib.h>g _ r e t u r n _ i f _ f a i l ( c o n d i t i o n )g_return_val_if_fail(condition, retval)这个宏列表列出了g l i b的预条件检查宏。
对g _ r e t u r n _ i f _ f a i l ( ),如果条件为假,则打印一个警告信息并且从当前函数立刻返回。
g _ r e t u r n _ v a l _ i f _ f a i l ( )与前一个宏类似,但是允许返回一个值。
毫无疑问,这些宏很有用—如果大量使用它们,特别是结合G t k +的实时类型检查,会节省大量的查找指针和类型错误的时间。
使用这些函数很简单,下面的例子是g l i b中哈希表的实现:v o i dg_hash_table_foreach (GHashTable *hash_table,GHFunc func,gpointer user_data){GHashNode *node;gint i;g_return_if_fail (hash_table != NULL);g_return_if_fail (func != NULL);for (i = 0; i < hash_table->size; i++)for (node = hash_table->nodes[i]; node; node = node->next)(* func) (node->key, node->value, user_data);}如果不检查,这个程序把N U L L作为参数时将导致一个奇怪的错误。
库函数的使用者可能要通过调试器找出错误出现在哪里,甚至要到g l i b的源代码中查找代码的错误是什么。
使用这种前提条件检查,他们将得到一个很不错的错误信息,告之不允许使用N U L L参数。
宏列表:断言#include <glib.h>g _ a s s e r t ( c o n d i t i o n )g _ a s s e r t _ n o t _ r e a c h e d ( )g l i b也有更传统的断言函数。
g _ a s s e r t ( )基本上与a s s e r t ( )一样,但是对G _ D I S A B L E _ A S S E RT响应(如果定义了G _ D I S A B L E _ A S S E RT,则这些语句在编译时不编译进去),以及在所有平台上行为都是一致的。
还有一个g _ a s s e r t _ n o t _ r e a c h e d ( ),如果执行到这个语句,它会调用a b o r t ( )退出程序并且(如果环境支持)转储一个可用于调试的c o r e文件。
应该断言用来检查函数或库内部的一致性。
g _ r e t u r n _ i f _ f a i l ( )确保传递到程序模块的公用接口的值是合法的。
也就是说,如果断言失败,将返回一条信息,通常应该在包含断言的模块中查找错误;如果g _ r e t u r n _ i f _ f a i l ( )检查失败,通常要在调用这个模块的代码中查找错误。
这也是断言与前提条件检查的区别。
下面g l i b日历计算模块的代码说明了这种差别:G D a t e *g_date_new_dmy (GDateDay day, GDateMonth m, GDateYear y){GDate *d;g_return_val_if_fail (g_date_valid_dmy (day, m, y), NULL);d = g_new (GDate, 1);d->julian = FALSE;d->dmy = TRUE;d->month = m;d->day = day;d->year = y;g_assert (g_date_valid (d));return d;}开始的预条件检查确保用户传递合理的年月日值;结尾的断言确保g l i b构造一个健全的对象,输出健全的值。
断言函数g_assert_not_reached() 用来标识“不可能”的情况,通常用来检测不能处理的所有可能枚举值的s w i t c h语句:switch (val){case FOO_ONE:b r e a k ;case FOO_TWO:b r e a k ;d e f a u l t :/* 无效枚举值* /g _ a s s e r t _ n o t _ r e a c h e d ( ) ;b r e a k ;}所有调试宏使用g l i b的g _ l o g ( )输出警告信息,g _ l o g ( )的警告信息包含发生错误的应用程序或库函数名字,并且还可以使用一个替代的警告打印例程。