linux011之内存管理的makefile分析

CC=gcc   #GNU C 语言编译器
CFLAGS=-O -Wall -fstrength-reduce -fcombine-regs -fomit-frame-pointer\
				-finline-functions -nostdinc -I../include
#C编译程序选项.-Wall显示所有的警告信息;-O优化选项,优化代码长度和执行时间;
#-fstrength-reduce优化循环执行代码,排除重复变量;-fomit-frame-pointer省略保存不必要
#的框架指针;-fcombine-regs合并寄存器,减少寄存器类的使用;-finline-fucntions将所有
#简单短小的函数代码嵌入到调用程序中;-nostdinc -I../include不能使用默认路径中的包含文件
#而使用这里指定目录中的包含文件

AS=gas #GNU 汇编程序
AR=gar #GNU 二进制文件处理程序,用于创建、修改以及从归档文件中抽取文件
LD=gld #GNU链接程序
CPP=gcc -E -nostdinc -I../include #
#C预处理选项.-E只运行C预处理,对所有指定的C程序进行预处理并将处理结果输出到标准输出
#设备或者指定的输出文件中,-nostdinc -I../include同前

#下面编译规则指示make利用下面的语句将所有的.c文件编译成.s汇编程序.该规则的命令指使gcc采
#用CFLAGS所指定的选项对C代码编译后不进行汇编就停止(-S),从而产生与输入的各个C文件对应
#的汇编代码文件.默认情况下所产生的汇编程序文件名是原C文件名去掉.c而加上.s后缀.-o表示输出
#文件的名称.其中$*.s(或$@)是自动目标变量
#$<代表第一个先决条件,这里既是符合条件*.c的文件
#
.c.o:
		$(CC) $(CFLAGS) -c -o $*.o $< # 将.c文件生成.o
.s.o:
		$(AS) -o $*.o $<							#将.s生成.o
.c.s:
		$(CC) $(CFLAGS) -S -o $*.s $< #将.c生成.s
	
OBJS &#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容: 一. Bootloader 二.Kernel引导入口 三.核心数据结构初始化--内核引导第一部分 四.外设初始化--内核引导第二部分 五.init进程和inittab引导指令 六.rc启动脚本 七.getty和login 八.bash 附:XDM方式登录 本文以Redhat 6.0 Linux 2.2.19 for Alpha/AXP为平台,描述了从开机到登录的 Linux 启动全过程。该文对i386平台同样适用。 一. Bootloader 在Alpha/AXP 平台上引导Linux通常有两种方法,一种是由MILO及其他类似的引导程序引导,另一种是由Firmware直接引导。MILO功能与i386平台的LILO相近,但内置有基本的磁盘驱动程序(如IDE、SCSI等),以及常见的文件系统驱动程序(如ext2,iso9660等), firmware有ARC、SRM两种形式,ARC具有类BIOS界面,甚至还有多重引导的设置;而SRM则具有功能强大的命令行界面,用户可以在控制台上使用boot等命令引导系统。ARC有分区(Partition)的概念,因此可以访问到分区的首扇区;而SRM只能将控制转给磁盘的首扇区。两种firmware都可以通过引导MILO来引导Linux,也可以直接引导Linux的引导代码。 “arch/alpha/boot” 下就是制作Linux Bootloader的文件。“head.S”文件提供了对 OSF PAL/1的调用入口,它将被编译后置于引导扇区(ARC的分区首扇区或SRM的磁盘0扇区),得到控制后初始化一些数据结构,再将控制转给“main.c”中的start_kernel(), start_kernel()向控制台输出一些提示,调用pal_init()初始化PAL代码,调用openboot() 打开引导设备(通过读取Firmware环境),调用load()将核心代码加载到START_ADDR(见 “include/asm-alpha/system.h”),再将Firmware中的核心引导参数加载到ZERO_PAGE(0) 中,最后调用runkernel()将控制转给0x100000的kernel,bootloader部分结束。 “arch/alpha/boot/bootp.c”以“main.c”为基础,可代替“main.c”与“head.S” 生成用于BOOTP协议网络引导的Bootloader。 Bootloader中使用的所有“srm_”函数在“arch/alpha/lib/”中定义。 以上这种Boot方式是一种最简单的方式,即不需其他工具就能引导Kernel,前提是按照 Makefile的指导,生成bootimage文件,内含以上提到的bootloader以及vmlinux,然后将 bootimage写入自磁盘引导扇区始的位置中。 当采用MILO这样的引导程序来引导Linux时,不需要上面所说的Bootloader,而只需要 vmlinux或vmlinux.gz,引导程序会主动解压加载内核到0x1000(小内核)或0x100000(大内核),并直接进入内核引导部分,即本文的第二节。 对于I386平台 i386系统中一般都有BIOS做最初的引导工作,那就是将四个主分区表中的第一个可引导 分区的第一个扇区加载到实模式地址0x7c00上,然后将控制转交给它。 在“arch/i386/boot” 目录下,bootsect.S是生成引导扇区的汇编源码,它首先将自己拷贝到0x90000上,然后将紧接其后的setup部分(第二扇区)拷贝到0x90200,将真正的内核代码拷贝到0x100000。以上这些拷贝动作都是以bootsect.S、setup.S以及vmlinux在磁盘上连续存放为前提的,也就是说,我们的bzImage文件或者zImage文件是按照bootsect,setup, vmlinux这样的顺序组织,并存放于始于引导分区的首扇区的连续磁盘扇区之中。 bootsect.S完成加载动作后,就直接跳转到0x90200,这里正是setup.S的程序入口。 setup.S的主要功能就是将系统参数(包括内存、磁盘等,由BIOS返回)拷贝到 0x90000-0x901FF内存中,这个地方正是bootsect.S存放的地方,这时它将被系统参数覆盖。以后这些参数将由保护模式下的代码来读取。 除此之外,setup.S还将video.S中的代码包含进来,检测和设置显示器和显示模式。最 后,setup.S将系统转换到保护模式,并跳转到0x100000(对于bzImage格式的大内核是 0x100000,对于zImage格式的是0x1000)的内核引导代码,Bootloader过程结束。 对于2.4.x版内核 没有什么变化。 二.Kernel引导入口 在arch/alpha/vmlinux.lds 的链接脚本控制下,链接程序将vmlinux的入口置于 "arch/alpha/kernel/head.S"中的__start上,因此当Bootloader跳转到0x100000时, __start处的代码开始执行。__start的代码很简单,只需要设置一下全局变量,然后就跳转到start_kernel去了。start_kernel()是"init/main.c"中的asmlinkage函数,至此,启动过程转入体系结构无关的通用C代码中。 对于I386平台 在i386体系结构中,因为i386本身的问题,在 "arch/alpha/kernel/head.S"中需要更多的设置,但最终也是通过call SYMBOL_NAME(start_kernel)转到start_kernel()这个体系结构无关的函数中去执行了。 所不同的是,在i386系统中,当内核以bzImage的形式压缩,即大内核方式(__BIG_KERNEL__)压缩时就需要预先处理bootsect.S和setup.S,按照大核模式使用$(CPP) 处理生成bbootsect.S和bsetup.S,然后再编译生成相应的.o文件,并使用 "arch/i386/boot/compressed/build.c"生成的build工具,将实际的内核(未压缩的,含 kernel中的head.S代码)与"arch/i386/boot/compressed"下的head.S和misc.c合成到一起,其中的 head.S代替了"arch/i386/kernel/head.S"的位置,由Bootloader引导执行(startup_32入口),然后它调用misc.c中定义的decompress_kernel()函数,使用 "lib/inflate.c"中定义的gunzip()将内核解压到0x100000,再转到其上执行 "arch/i386/kernel/head.S"中的startup_32代码。 对于2.4.x版内核 没有变化。 三.核心数据结构初始化--内核引导第一部分 start_kernel()中调用了一系列初始化函数,以完成kernel本身的设置。 这些动作有的是公共的,有的则是需要配置的才会执行的。 在start_kernel()函数中, 输出Linux版本信息(printk(linux_banner)) 设置与体系结构相关的环境(setup_arch()) 页表结构初始化(paging_init()) 使用"arch/alpha/kernel/entry.S"中的入口点设置系统自陷入口(trap_init()) 使用alpha_mv结构和entry.S入口初始化系统IRQ(init_IRQ()) 核心进程调度器初始化(包括初始化几个缺省的Bottom-half,sched_init()) 时间、定时器初始化(包括读取CMOS时钟、估测主频、初始化定时器中断等,time_init()) 提取并分析核心启动参数(从环境变量中读取参数,设置相应标志位等待处理,(parse_options()) 控制台初始化(为输出信息而先于PCI初始化,console_init()) 剖析器数据结构初始化(prof_buffer和prof_len变量) 核心Cache初始化(描述Cache信息的Cache,kmem_cache_init()) 延迟校准(获得时钟jiffies与CPU主频ticks的延迟,calibrate_delay()) 内存初始化(设置内存上下界和页表项初始值,mem_init()) 创建和设置内部及通用cache("slab_cache",kmem_cache_sizes_init()) 创建uid taskcount SLAB cache("uid_cache",uidcache_init()) 创建文件cache("files_cache",filescache_init()) 创建目录cache("dentry_cache",dcache_init()) 创建与虚存相关的cache("vm_area_struct","mm_struct",vma_init()) 块设备读写缓冲区初始化(同时创建"buffer_head"cache用户加速访问,buffer_init()) 创建页cache(内存页hash表初始化,page_cache_init()) 创建信号队列cache("signal_queue",signals_init()) 初始化内存inode表(inode_init()) 创建内存文件描述符表("filp_cache",file_table_init()) 检查体系结构漏洞(对于alpha,此函数为空,check_bugs()) SMP机器其余CPU(除当前引导CPU)初始化(对于没有配置SMP的内核,此函数为空,smp_init()) 启动init过程(创建第一个核心线程,调用init()函数,原执行序列调用cpu_idle() 等待调度,init()) 至此start_kernel()结束,基本的核心环境已经建立起来了。 对于I386平台 i386平台上的内核启动过程与此基本相同,所不同的主要是实现方式。 对于2.4.x版内核 2.4.x中变化比较大,但基本过程没变,变动的是各个数据结构的具体实现,比如Cache。 四.外设初始化--内核引导第二部分 init()函数作为核心线程,首先锁定内核(仅对SMP机器有效),然后调用 do_basic_setup()完成外设及其驱动程序的加载和初始化。过程如下: 总线初始化(比如pci_init()) 网络初始化(初始化网络数据结构,包括sk_init()、skb_init()和proto_init()三部分,在proto_init()中,将调用protocols结构中包含的所有协议的初始化过程,sock_init()) 创建bdflush核心线程(bdflush()过程常驻核心空间,由核心唤醒来清理被写过的内存缓冲区,当bdflush()由kernel_thread()启动后,它将自己命名为kflushd) 创建kupdate核心线程(kupdate()过程常驻核心空间,由核心按时调度执行,将内存缓冲区中的信息更新到磁盘中,更新的内容包括超级块和inode表) 设置并启动核心调页线程kswapd(为了防止kswapd启动时将版本信息输出到其他信息中间,核心线调用kswapd_setup()设置kswapd运行所要求的环境,然后再创建 kswapd核心线程) 创建事件管理核心线程(start_context_thread()函数启动context_thread()过程,并重命名为keventd) 设备初始化(包括并口parport_init()、字符设备chr_dev_init()、块设备 blk_dev_init()、SCSI设备scsi_dev_init()、网络设备net_dev_init()、磁盘初始化及分区检查等等, device_setup()) 执行文件格式设置(binfmt_setup()) 启动任何使用__initcall标识的函数(方便核心开发者添加启动函数,do_initcalls()) 文件系统初始化(filesystem_setup()) 安装root文件系统(mount_root()) 至此do_basic_setup()函数返回init(),在释放启动内存段(free_initmem())并给内核解锁以后,init()打开 /dev/console设备,重定向stdin、stdout和stderr到控制台,最后,搜索文件系统中的init程序(或者由init=命令行参数指定的程序),并使用 execve()系统调用加载执行init程序。 init()函数到此结束,内核的引导部分也到此结束了,这个由start_kernel()创建的第一个线程已经成为一个用户模式下的进程了。此时系统中存在着六个运行实体: start_kernel()本身所在的执行体,这其实是一个"手工"创建的线程,它在创建了init()线程以后就进入cpu_idle()循环了,它不会在进程(线程)列表中出现 init线程,由start_kernel()创建,当前处于用户态,加载了init程序 kflushd核心线程,由init线程创建,在核心态运行bdflush()函数 kupdate核心线程,由init线程创建,在核心态运行kupdate()函数 kswapd核心线程,由init线程创建,在核心态运行kswapd()函数 keventd核心线程,由init线程创建,在核心态运行context_thread()函数 对于I386平台 基本相同。 对于2.4.x版内核 这一部分的启动过程在2.4.x内核中简化了不少,缺省的独立初始化过程只剩下网络 (sock_init())和创建事件管理核心线程,而其他所需要的初始化都使用__initcall()宏 包含在do_initcalls()函数中启动执行。 五.init进程和inittab引导指令 init进程是系统所有进程的起点,内核在完成核内引导以后,即在本线程(进程)空 间内加载init程序,它的进程号是1。 init程序需要读取/etc/inittab文件作为其行为指针,inittab是以行为单位的描述性(非执行性)文本,每一个指令行都具有以下格式: id:runlevel:action:process其中id为入口标识符,runlevel为运行级别,action为动作代号,process为具体的执行程序。 id一般要求4个字符以内,对于getty或其他login程序项,要求id与tty的编号相同,否则getty程序将不能正常工作。 runlevel 是init所处于的运行级别的标识,一般使用0-6以及S或s。0、1、6运行级别被系统保留,0作为shutdown动作,1作为重启至单用户模式,6 为重启;S和s意义相同,表示单用户模式,且无需inittab文件,因此也不在inittab中出现,实际上,进入单用户模式时,init直接在控制台(/dev/console)上运行/sbin/sulogin。 在一般的系统实现中,都使用了2、3、4、5几个级别,在 Redhat系统中,2表示无NFS支持的多用户模式,3表示完全多用户模式(也是最常用的级别),4保留给用户自定义,5表示XDM图形登录方式。7- 9级别也是可以使用的,传统的Unix系统没有定义这几个级别。runlevel可以是并列的多个值,以匹配多个运行级别,对大多数action来说,仅当runlevel与当前运行级别匹配成功才会执行。 initdefault是一个特殊的action值,用于标识缺省的启动级别;当init由核心激活 以后,它将读取inittab中的initdefault项,取得其中的runlevel,并作为当前的运行级别。如果没有inittab文件,或者其中没有initdefault项,init将在控制台上请求输入 runlevel。 sysinit、 boot、bootwait等action将在系统启动时无条件运行,而忽略其中的runlevel,其余的action(不含initdefault)都与某个runlevel相关。各个action的定义在inittab的man手册中有详细的描述。 在Redhat系统中,一般情况下inittab都会有如下几项: id:3:initdefault: #表示当前缺省运行级别为3--完全多任务模式; si::sysinit:/etc/rc.d/rc.sysinit #启动时自动执行/etc/rc.d/rc.sysinit脚本 l3:3:wait:/etc/rc.d/rc 3 #当运行级别为3时,以3为参数运行/etc/rc.d/rc脚本,init将等待其返回 0:12345:respawn:/sbin/mingetty tty0 #在1-5各个级别上以tty0为参数执行/sbin/mingetty程序,打开tty0终端用于 #用户登录,如果进程退出则再次运行mingetty程序 x:5:respawn:/usr/bin/X11/xdm -nodaemon #在5级别上运行xdm程序,提供xdm图形方式登录界面,并在退出时重新执行. 六.rc启动脚本 上一节已经提到init进程将启动运行rc脚本,这一节将介绍rc脚本具体的工作。 一般情况下,rc启动脚本都位于/etc/rc.d目录下,rc.sysinit中最常见的动作就是激活交换分区,检查磁盘,加载硬件模块,这些动作无论哪个运行级别都是需要优先执行的。仅当rc.sysinit执行完以后init才会执行其他的boot或bootwait动作。 如果没有其他boot、bootwait动作,在运行级别3下,/etc/rc.d/rc将会得到执行,命令行参数为3,即执行 /etc/rc.d/rc3.d/目录下的所有文件。rc3.d下的文件都是指向/etc/rc.d/init.d/目录下各个Shell脚本的符号连接,而这些脚本一般能接受start、stop、restart、status等参数。rc脚本以start参数启动所有以S开头的脚本,在此之前,如果相应的脚本也存在K打头的链接,而且已经处于运行态了(以/var/lock/subsys/下的文件作为标志),则将首先启动K开头的脚本,以stop 作为参数停止这些已经启动了的服务,然后再重新运行。显然,这样做的直接目的就是当init改变运行级别时,所有相关的服务都将重启,即使是同一个级别。 rc程序执行完毕后,系统环境已经设置好了,下面就该用户登录系统了。 七.getty和login 在rc返回后,init将得到控制,并启动mingetty(见第五节)。mingetty是getty的简化,不能处理串口操作。getty的功能一般包括: 打开终端线,并设置模式 输出登录界面及提示,接受用户名的输入 以该用户名作为login的参数,加载login程序 缺省的登录提示记录在/etc/issue文件中,但每次启动,一般都会由rc.local脚本根据系统环境重新生成。 注:用于远程登录的提示信息位于/etc/issue.net中。 login程序在getty的同一个进程空间中运行,接受getty传来的用户名参数作为登录的用户名。 如果用户名不是root,且存在/etc/nologin文件,login将输出nologin文件的内容,然后退出。这通常用来系统维护时防止非root用户登录。 只有/etc/securetty中登记了的终端才允许root用户登录,如果不存在这个文件,则root可以在任何终端上登录。/etc/usertty文件用于对用户作出附加访问限制,如果不存在这个文件,则没有其他限制。 当用户登录通过了这些检查后,login将搜索/etc/passwd文件(必要时搜索 /etc/shadow文件)用于匹配密码、设置主目录和加载shell。如果没有指定主目录,将默认为根目录;如果没有指定shell,将默认为 /bin/sh。在将控制转交给shell以前, getty将输出/var/log/lastlog中记录的上次登录系统的信息,然后检查用户是否有新邮件(/usr/spool/mail/ {username})。在设置好shell的uid、gid,以及TERM,PATH 等环境变量以后,进程加载shell,login的任务也就完成了。 八.bash 运行级别3下的用户login以后,将启动一个用户指定的shell,以下以/bin/bash为例继续我们的启动过程。 bash 是Bourne Shell的GNU扩展,除了继承了sh的所有特点以外,还增加了很多特性和功能。由login启动的bash是作为一个登录shell启动的,它继承了 getty设置的TERM、PATH等环境变量,其中PATH对于普通用户为"/bin:/usr/bin:/usr/local/bin",对于 root 为"/sbin:/bin:/usr/sbin:/usr/bin"。作为登录shell,它将首先寻找/etc/profile 脚本文件,并执行它;然后如果存在~/.bash_profile,则执行它,否则执行 ~/.bash_login,如果该文件也不存在,则执行~/.profile文件。然后bash将作为一个交互式shell执行~/.bashrc文件(如果存在的话),很多系统中,~/.bashrc都将启动 /etc/bashrc作为系统范围内的配置文件。 当显示出命令行提示符的时候,整个启动过程就结束了。此时的系统,运行着内核,运行着几个核心线程,运行着init进程,运行着一批由rc启动脚本激活的守护进程(如 inetd等),运行着一个bash作为用户的命令解释器。 附:XDM方式登录 如果缺省运行级别设为5,则系统中不光有1-6个getty监听着文本终端,还有启动了一个XDM的图形登录窗口。登录过程和文本方式差不多,也需要提供用户名和口令,XDM 的配置文件缺省为/usr/X11R6/lib/X11/xdm/xdm-config文件,其中指定了 /usr/X11R6/lib/X11/xdm/xsession作为XDM的会话描述脚本。登录成功后,XDM将执行这个脚本以运行一个会话管理器,比如gnome-session等。 除了XDM以外,不同的窗口管理系统(如KDE和GNOME)都提供了一个XDM的替代品,如gdm和kdm,这些程序的功能和XDM都差不多。
本书介绍了Linux下图形用户接口(GUI)编程技术。全书共18章,分五个部分。第一部分介绍Linux GUI编程架构以及编程基础知识,第二部分介绍Linux 编程常用C语言函数库glibc、构件库Gtk+、Gnome,第三部分介绍Linux下的GUI生成器Glade,第四部分介绍Linux编程调试工具gdb及xxgdb。第五部分包括三个附录,附录A是书中使用的示例GnomeHello的源代码,附录B介绍了一些与Gtk+/Gnome编程相关的在线资源,附录C是Gtk+/Gnome对象的简要介绍。本书中的Gtk+构件示例都来自于GTK 1.2.3软件包的示例。如果下载并安装了GTK 1.2.3软件包,则能够在展开的源代码目录下找到这些示例代码。本书适用于有Linux使用经验及C语言编程基础的读者阅读。 目 录 前言 第一部分 Linux GUI编程框架及编程基础 第1章 Linux软件开发概述 1 1.1 关于Linux 1 1.2 关于Linux的桌面环境 2 1.3 Linux系统中的软件开发 3 1.3.1 开发所使用的库 3 1.3.2 Gnome的开发结构 4 1.4 开发Linux应用程序的编程语言 和编程工具 6 1.5 本书的结构 7 第2章 Gtk+/Gnome开发简介 8 2.1 安装Gtk+/Gnome库 8 2.2 第一个Gtk+应用程序 9 2.2.1 一个什么也不能做的窗口 9 2.2.2 示例代码的含义 9 2.2.3 GTK的Hello World 10 2.2.4 Gtk+的信号和回调函数原理 12 2.2.5 Hello World代码解释 14 2.2.6 运行helloworld 17 2.3 Gnome应用程序 17 2.4 GNU C 编译器 18 2.4.1 使用 gcc 18 2.4.2 gcc 选项 18 2.5 初始化库 19 2.6 用popt分析参数 20 2.6.1 参数分析方法 20 2.6.2 GnomeHello程序的参数分析 22 2.7 国际化 25 2.8 保存配置信息 27 2.8.1 读出存储的配置数据 28 2.8.2 在配置文件中存储数据 30 2.8.3 配置文件迭代器 30 2.8.4 节迭代器 33 2.8.5 其他的配置文件操作 33 2.9 会话管理 34 2.10 Gtk+的主循环 36 2.10.1 主循环基本知识 36 2.10.2 退出函数 36 2.10.3 Timeout函数 37 2.10.4 idle函数 37 2.10.5 输入函数 38 2.11 编译应用程序 39 2.11.1 生成源代码树 39 2.11.2 configure.in文件 41 2.11.3 Makefile.am文件 43 2.11.4 安装支持文件 44 第二部分 Linux 编程常用C 语言 函数库及构件库 第3章 glib库简介 49 3.1 类型定义 49 3.2 glib的宏 49 3.2.1 常用宏 49 3.2.2 调试宏 50 3.3 内存管理 52 3.4 字符串处理 53 3.5 数据结构 55 3.5.1 链表 55 3.5.2 树 59 3.5.3 哈希表 63 3.6 GString 65 3.7 计时器函数 66 3.8 错误处理函数 67 3.9 其他实用函数 67 第4章 构件定位 69 4.1 构件的显现、映射和显示 69 4.2 其他的构件概念 70 4.3 构件的类型转换 72 4.4 组装构件 72 4.4.1 尺寸分配 73 4.4.2 GtkWindow构件 74 4.4.3 GtkBox 76 4.4.4 表格构件GtkTable 79 4.4.5 固定容器构件GtkFixed 83 4.4.6 布局容器构件GtkLayout 85 第5章 按钮构件 87 5.1 普通按钮GtkButton 87 5.2 开关按钮GtkToggleButton 90 5.3 检查按钮GtkCheckButton 91 5.4 无线按钮GtkRadioButton 91 第6章 调整对象 95 6.1 创建一个调整对象 95 6.2 使用调整对象 95 6.3 调整对象内部机制 96 第7章 文本构件GtkText 98 7.1 创建、配置文本构件 98 7.2 操作文本 99 7.3 键盘快捷键 100 7.4 GtkText示例 100 第8章 范围构件GtkRange 105 8.1 滚动条构件GtkScrollBar 105 8.2 比例构件GtkScale 105 8.2.1 函数和信号 105 8.2.2 常用的范围函数 106 8.2.3 键盘和鼠标绑定 107 8.2.4 示例 107 第9章 杂项构件 114 9.1 标签构件GtkLabel 114 9.2 箭头构件GtkArrow 117 9.3 工具提示对象GtkTooltips 119 9.4 进度条构件GtkProgressBar 120 9.5 对话框构件 126 9.6 pixmap 127 9.7 标尺构件GtkRuler 134 9.8 文本输入构件GtkEntry 137 9.9 微调按钮构件GtkSpinButton 140 9.10 组合框GtkCombo 146 9.11 日历构件GtkCalendar 148 9.12 颜色选择构件GtkColorSelect 158 9.13 文件选择构件GtkFileSelect 162 第10章 容器构件GtkContainer 165 10.1 事件盒构件GtkEventBox 165 10.2 对齐构件GtkAlignment 166 10.3 框架构件GtkFrame 167 10.4 比例框架构件GtkAspectFrame 169 10.5 分栏窗口构件GtkPanedWindow 170 10.6 视角构件GtkViewport 174 10.7 滚动窗口构件GtkScrolled Window 175 10.8 按钮盒构件GtkButtonBox 177 10.9 工具条构件GtkToolbar 181 10.10 笔记本构件GtkNotebook 187 第11章 分栏列表构件GtkCList 193 11.1 创建分栏列表构件GtkCList 193 11.2 操作模式 193 11.3 操作分栏列表构件列标题 194 11.4 操纵列表 194 11.5 向列表中添加行 196 11.6 在单元格中设置文本和pixmap 图片 197 11.7 存储数据指针 198 11.8 处理选择 198 11.9 信号 199 11.10 GtkCList示例 199 第12章 树构件 204 12.1 创建新树构件 204 12.1.1 添加一个子树 204 12.1.2 处理选中的列表 205 12.1.3 树构件内部机制 205 12.1.4 信号 206 12.1.5 函数和宏 206 12.2 树项构件GtkTreeItem 208 12.2.1 信号 209 12.2.2 函数和宏 210 12.3 树构件示例 210 第13章 GnomeApp构件和GnomeUIInfo 215 13.1 主窗口GnomeApp 215 13.2 GnomeUIInfo 216 13.2.1 创建GnomeUIInfo 216 13.2.2 将GnomeUIInfo转换为构件 218 第14章 状态条构件 221 14.1 状态条构件简介 221 14.2 GnomeAppBar构件 221 14.3 状态条构件GtkStatusbar 222 第15章 对话框 225 15.1 GnomeDialog构件 225 15.1.1 创建对话框 225 15.1.2 填充对话框 226 15.1.3 处理GnomeDialog的信号 226 15.1.4 最后的修饰 227 15.2 模态对话框 229 15.3 一个对话框示例 230 15.4 特殊对话框 231 15.4.1 GnomeAbout 231 15.4.2 GnomePropertyBox—属性框 233 15.4.3 GnomeMessageBox—消息框 234 第16章 GDK 基础 236 16.1 GDK和Xlib 236 16.2 GdkWindow 237 16.2.1 GdkWindow和GtkWidget 237 16.2.2 GdkWindow属性 238 16.3 视件和颜色表 240 16.3.1 GdkVisual 240 16.3.2 视件的类型 241 16.3.3 颜色和GdkColormap 242 16.3.4 获得颜色表 244 16.4 可绘区和pixmap 244 16.5 事件 245 16.5.1 事件类型 245 16.5.2 事件屏蔽 247 16.5.3 在Gtk+中接收Gdk事件 248 16.5.4 鼠标按键事件 250 16.5.5 键盘事件 252 16.5.6 鼠标移动事件 254 16.5.7 焦点变更事件 257 16.6 鼠标指针 257 16.6.1 指针定位 257 16.6.2 独占指针 258 16.6.3 改变光标 259 16.7 字体 259 16.8 图形上下文 263 16.9 绘图 267 16.9.1 画点 267 16.9.2 画线 268 16.9.3 矩形 268 16.9.4 画弧 269 16.9.5 多边形 269 16.9.6 文本 270 16.9.7 pixmap像素映射图形 270 16.9.8 RGB缓冲 271 第三部分 Linux GUI 生成器Glade 第17章 Glade:GUI生成器 273 17.1 安装Glade 273 17.1.1 Glade简介 273 17.1.2 安装Glade 273 17.1.3 在Gnome主菜单下为Glade 创建菜单项 274 17.1.4 在Gnome面板上创建快捷 按钮 275 17.2 用Glade生成图形用户接口 275 17.2.1 Glade的界面简介 275 17.2.2 用Glade创建应用程序界面 277 第四部分 调试工具 第18章 程序调试 283 18.1 用gdb调试应用程序 283 18.1.1 为调试程序做准备 283 18.1.2 获得gdb帮助 284 18.1.3 gdb常用命令 284 18.1.4 gdb 应用举例 286 18.2 用xxgdb调试应用程序 289 第五部分 附 录 附录A GnomeHello源代码 293 附录B 在线资源 304 附录C Gtk+/Gnome对象总览 306

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值