54
Acegene IT Co. Ltd. 1 Linux 操操操操操 操操 操操 操操操操操操操操操操操操 操操操操操操操操操操操操

Linux 操作系统 开发

Embed Size (px)

DESCRIPTION

Linux 操作系统 开发. 周炯 上海艾基信息技术有限公司. 内容提要. 使用 gcc 使用 Gnu ’ s make 管理项目 使用 autoconf 创建自配置软件 比较和归并源文件 使用 RCS 进行版本控制. 一、使用 gcc. 1 gcc 特性 2 使用简介 3 常用命令行选项. 1 gcc 特性. 编译过程 预处理、编译、链接 支持风格 ANSI C 、 C++ 、 Objective C 调试信息 能够在生成调试信息同时进行优化 交叉编译 大量扩展(降低可移植性). 2 使用简介. - PowerPoint PPT Presentation

Citation preview

Page 1: Linux 操作系统 开发

Acegene IT Co. Ltd. 1

Linux 操作系统开发

周炯周炯上海艾基信息技术有限公司上海艾基信息技术有限公司

Page 2: Linux 操作系统 开发

Acegene IT Co. Ltd. 2

内容提要• 使用 gcc• 使用 Gnu’s make 管理项目• 使用 autoconf 创建自配置软件• 比较和归并源文件• 使用 RCS 进行版本控制

Page 3: Linux 操作系统 开发

Acegene IT Co. Ltd. 3

一、使用 gcc• 1 gcc 特性• 2 使用简介• 3 常用命令行选项

Page 4: Linux 操作系统 开发

Acegene IT Co. Ltd. 4

1 gcc 特性• 编译过程

– 预处理、编译、链接• 支持风格

– ANSI C 、 C++ 、 Objective C• 调试信息

– 能够在生成调试信息同时进行优化• 交叉编译• 大量扩展(降低可移植性)

Page 5: Linux 操作系统 开发

Acegene IT Co. Ltd. 5

2 使用简介• #include <stdio.h>int main(void){ fprintf(stdout,”Hello World!\n”); return 0;}• gcc hello.c –o hello• ./hello

Page 6: Linux 操作系统 开发

Acegene IT Co. Ltd. 6

2 使用简介• 过程:

– cpp 预处理所有的宏、展开头文件– 编译为目标代码– 使用 ld 链接成二进制文件

• gcc -E hello.c -o hello.cpp• gcc -x cpp-output -c hello.cpp hello.o• gcc hello.o -o hello• gcc test2.c test.c -o test

Page 7: Linux 操作系统 开发

Acegene IT Co. Ltd. 7

2 使用简介• 常用扩展名解释• .c c 语言源代码• .C,.cc c++ 源代码• .i 预处理后的 c 源代码• .ii 预处理后的 c++ 源代码• .S,.s 汇编语言源代码• .o 汇编后的目标代码• .a,.so 库代码

Page 8: Linux 操作系统 开发

Acegene IT Co. Ltd. 8

3 常用命令行选项• -o FILE 指定输出文件名,未指定 a.out• -c 只编译,不链接• -DFOO=BAR 定义预处理宏• -IDIR 将 DIR 指定的目录添加到头文件搜索路径中• -LDIR 将 DIR 加入到库文件的搜索目录列表中,缺省情况下 gcc 只链接共享库• -static 链接静态库• -lFOO 链接名为 FOO 的函数库,如 -lmath

Page 9: Linux 操作系统 开发

Acegene IT Co. Ltd. 9

3 常用命令行选项• -g 在可执行文件中包含调试信息• -ggdb 在可执行程序中包含只有 GNU debugger 才能识别的大量调试信息• -p 加入 prof 能够识别的统计信息• -ON 编译时进行优化 (N 为优化级别 )• -w 关闭所有警告• -Wall 发出所有 gcc 能提供的警告• -werror 将警告转化为错误,中止编译• -v 显示每一步详细信息

Page 10: Linux 操作系统 开发

Acegene IT Co. Ltd. 10

二、使用 Gnu’s make 管理项目• 为何使用 make• 编写 makefile• 深入了解 makefile• 额外的 make 命令行选项• 调试 make• 常见错误• 常用的 makefile 目标

Page 11: Linux 操作系统 开发

Acegene IT Co. Ltd. 11

1 为何使用 make• 包含多个源文件的项目在编译时有长而复杂的命令行,可以通过 makefile 保存这些命令行来简化该工作• make 可以减少重新编译所需要的时间,因为 make 可以识别出哪些文件是新修改的• Make维护了当前项目中各文件的相关关系,从而可以在编译前检查是否可以找到所有的文件

Page 12: Linux 操作系统 开发

Acegene IT Co. Ltd. 12

2 编写 makefile• makefile :一个文本形式的文件,其中包含一些规则告诉make 编译哪些文件以及怎样编译这些文件,每条规则包含以下内容:

– 一个 target ,即最终创建的东西– 一个和多个 dependencies 列表,通常是编译目标文件所需要的其他文件– 需要执行的一系列 commands ,用于从指定的相关文件创建目标文件

Page 13: Linux 操作系统 开发

Acegene IT Co. Ltd. 13

2 编写 makefile• make 执行时按顺序查找名为 GNUmakefile , makefile或者 Makefile 文件,通常,大多数人常用 Makefile• Makefile规则:• target: dependency dependency [..]commandcommand[..]•注意: command前面必须是制表符

Page 14: Linux 操作系统 开发

Acegene IT Co. Ltd. 14

2 编写 makefile•例子:

editor: editor.o screen.o keyboard.ogcc -o editor editor.o screen.o keyboard.oeditor.o : editor.c editor.h keyboard.h screen.hgcc -c editor.cscreen.o: screen.c screen.hgcc -c screen.ckeyboard.o : keyboard.c keyboard.hgcc -c keyboard.cclean: rm editor *.o

Page 15: Linux 操作系统 开发

Acegene IT Co. Ltd. 15

3 深入了解 makefile•伪目标:如上例中的 clean•变量:

– 声明 VARNAME=sometext [..]– 使用 $(VARNAME)– 递归展开变量,如 TOPDIR=/home/young, SRCDIR=$(TOPDIR)/src ,则 SRCDIR=/home/young/src

• make 可以检测到错误的递归展开,如 CC = gcc CC=$(CC) –o• 解决方案 CC:=gcc -o CC+= -O2

Page 16: Linux 操作系统 开发

Acegene IT Co. Ltd. 16

例子• OBJS = editor.o screen.o keyboard.o• HDRS = editor.h screen.h keyboard.h• editor: $(OBJS)• gcc -o editor $(OBJS)• editor.o : editor.c $(HDRS)• gcc -c editor.c• screen.o: screen.c screen.h• gcc -c screen.c• keyboard.o : keyboard.c keyboard.h• gcc -c keyboard.c• clean:• rm editor $(OBJS)

Page 17: Linux 操作系统 开发

Acegene IT Co. Ltd. 17

3 深入了解 makefile• 环境变量: make会自动读取环境变量并使用• 自动变量:• $@ 规则的目标对应的文件名• $< 规则中的第一个相关文件名• $^ 规则中的所有相关文件的列表• $? 规则中日期新于目标的所有相关文件的列表• $(@D) 目标文件的目录部分(如果目标在子目录中)• $(@F) 目标文件的文件名部分

Page 18: Linux 操作系统 开发

Acegene IT Co. Ltd. 18

3 深入了解 makefile• 预定义变量:• AR 归档维护程序 ar• AS 汇编程序 as• CC C 编译程序 cc• CPP C 预处理程序 cpp• RM 文件删除程序 rm –f• ARFLAGS ASFLAGS CPPFLAGS LDFLAGS

Page 19: Linux 操作系统 开发

Acegene IT Co. Ltd. 19

3 深入了解 makefile•隐式规则

OBJS = editor.o screen.o keyboard.oeditor: $(OBJS)gcc -o editor $(OBJS) clean: rm editor $(OBJS)•模式规则%.o:%.c$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@

Page 20: Linux 操作系统 开发

Acegene IT Co. Ltd. 20

3 深入了解 makefile• 添加注释:行首加 #符号• 额外 make 命令行参数• -f file 指定 makefile 的文件名• -n 打印要执行的命令但不实际执行• -r 禁止使用所有 make 的内置规则• -d 打印调试信息• -k 某个编译目标失败,继续编译其他目标

Page 21: Linux 操作系统 开发

Acegene IT Co. Ltd. 21

4 调试 make• 使用 -d参数• 输出信息:

– 重新编译时需要比较的文件– 被比较文件以及比较结果– 需要被重新生成的文件– make想要使用的隐含规则– make实际使用的隐含规则以及所执行的命令

Page 22: Linux 操作系统 开发

Acegene IT Co. Ltd. 22

5 常见的 make 出错信息• No rule to make target ‘target’. Stop•‘target’ is up to date• Target ‘target’ not remake because of errors (-k参数 )• command: Command not found• Illegal option - option

Page 23: Linux 操作系统 开发

Acegene IT Co. Ltd. 23

6 有用的 makefile 目标• install 目标安装• dist 生成准备发布的软件包,删除编译工作目录中的旧的二进制文件和目标文件并创建一个归档文件• distclean • uninstall• test或者 check 诊断安装包• installtest或 installcheck

Page 24: Linux 操作系统 开发

Acegene IT Co. Ltd. 24

三、使用 autoconf 创建自配置软件• 开发在不同 UNIX和类 UNIX 上都可以运行的软件:

– 代码需要可移植– 开发者必须对不同系统的编译和运行环境,甚至是硬件体系结构有足够的了解

• 使用 autoconf 可以生成一个自动配置源代码包的 shell脚本,以使程序能够在许多不同品牌的 UNIX和类 UNIX 上编译和运行。这个脚本通常叫做 configure ,它检查在当前系统中是否提供程序所需要的某些功能,并在此基础上生成 makefile。

Page 25: Linux 操作系统 开发

Acegene IT Co. Ltd. 25

四、比较和归并源文件• 1 比较文件• 2 生成补丁

Page 26: Linux 操作系统 开发

Acegene IT Co. Ltd. 26

1 比较文件• cmp 命令• diff 命令• diff3 命令• sdiff 命令

Page 27: Linux 操作系统 开发

Acegene IT Co. Ltd. 27

cmp 命令• cmp [options] file1 file2• 比较两个文件,给出差别字符的位置和行号。同时可以设置选项使得 cmp给出结果时同时显示差别字符。• -c 显示第一个差别字符• -l 以十进制显示差别字符的位置,并以八进制显示其数值

Page 28: Linux 操作系统 开发

Acegene IT Co. Ltd. 28

diff 命令• diff [options] file1 file2•普通输出格式:

– 仅按序显示差别行•上下文输出格式: -C

– 以一些行作为上下文(上下文 hunk )来显示差别行,以便用户更清楚地知道所比较文件的差别。• 统一输出格式: -U

– 修改了上下文格式,取消了重复的上下文并简化了输出。

Page 29: Linux 操作系统 开发

Acegene IT Co. Ltd. 29

diff3 命令•两个人同时修改了一个公用文件的情况下,使用 diff3 命令,可以比较两个文件对一个源文件的修改,并把结果合并在一个输出文件中,用以指出两个文件对源文件所作的修改的冲突之处。• diff3 [options] myfile oldfile yourfile

Page 30: Linux 操作系统 开发

Acegene IT Co. Ltd. 30

sdiff 命令• 使用交互方式来合并文件,并以逐字格式显示文件。使用交互特性时,应在命令行使用 -o file 选项指定输出文件,在执行时, sdiff显示每一个 hunk ,并在其后输出提示符%,此时键入所需要的命令,然后回车,可用的命令如下:

– l 把左边的列复制到输出文件– r 把右边的列复制到输出文件– el 先编辑左边的列,然后复制– er 先编辑右边的列,然后复制– e 放弃左右两列,输入新文本,然后把新文本复制到输出文件– eb 链接左右两列并进行修改,然后把结果复制到输出文件– q 退出

Page 31: Linux 操作系统 开发

Acegene IT Co. Ltd. 31

2 准备补丁• 创建补丁:• diff -c sigrot.1 sigrot.2 > sigrot.patch• diff -u sigrot.1 sigrot.2 > sigrot.patch• 使用 -r参数来遍历目录• patch -p0 < sigrot.patch• p0 表示指定使用补丁前补丁中所包含的文件名中需要剥离的” /” 的重数, -p则剥离了除最终文件名之外的所有部分。• 恢复: patch -p0 -R < sigrot.patch

Page 32: Linux 操作系统 开发

Acegene IT Co. Ltd. 32

使用 RCS 进行版本控制•什么是版本控制• 为什么需要版本控制• RCS 和 CVS•术语•基本用法• RCS 关键字

Page 33: Linux 操作系统 开发

Acegene IT Co. Ltd. 33

什么是版本控制•跟踪和管理文件变化的自动过程• RCS (Revision Control System)修改控制系统•其他类似的 GNU 软件

– SCCS Source Code Control System– CVS Concurrent Version System

Page 34: Linux 操作系统 开发

Acegene IT Co. Ltd. 34

为什么需要版本控制• 1 也许有一天你对源代码做了关键改动,删除了老的文件并且忘记了所作改动的确切位置• 2 同时跟踪关于当前版本,下一版本以及修改过的错误的情况等信息是冗长并且容易出错的事情• 3 也许你的同事不经意间修改了你的代码,会使得你不得不在备份磁带上疯狂查找以找回合适的版本

Page 35: Linux 操作系统 开发

Acegene IT Co. Ltd. 35

RCS 和 CVS• CVS 建立在 RCS 的基础上,新增了两个特性:

– 1 CVS 比 RCS更适合于管理多目录的服务,因为它处理层次目录结构时比 RCS 简单,同时它对于项目的概念也更加完整,可以认为, RCS 是面向文件的,而 CVS则面向项目– 2 支持分布式项目的开发,多个开发者可以在不同的地点或者 Internet上共同开发一个项目,他们所存取和操作的是一个单独的代码库。其成功例子: KDE 和Debian 的 Linux 版本

Page 36: Linux 操作系统 开发

Acegene IT Co. Ltd. 36

术语• RCS Files: 在 RCS 目录下的文件,由 RCS控制,并通过 RCS 命令存取。一个 RCS 文件包含某一特殊文件的所有版本。通常, RCS 文件的扩展名是 ,v• Working file: 从 RCS 源代码库 (即 RCS 目录 ) 中检索到的一个或者多个文件,放置在当前工作目录下,并能够被编辑

Page 37: Linux 操作系统 开发

Acegene IT Co. Ltd. 37

术语• Lock: 以编辑目的取回工作文件时别人就不能同时编辑这个文件。此时,文件由第一个编辑它的人锁定• Revision: 源文件的一个特定版本,用数字标识。 Revision 的编号从 1.1 开始,并依次递增,除非强制指定修订版本号• RCS 自动处理各版本的存储、检索、更改日志、存取控制、发行管理、修订标识和合并;并且,由于它只跟踪文件的变化,所以只需要最小的空间。

Page 38: Linux 操作系统 开发

Acegene IT Co. Ltd. 38

基本用法• ci : Check In• co : Check Out• mkdir RCS• ci howdy.c 建立一个 RCS 文件,名为 howdy.c,v ,将版本号设置为 1.1 ,并要求输入描述• co howdy.c 将 howdy.c 文件从最新的版本中取出,存为工作文件,如果想修改文件,必须使用 co -l howdy.c ,将其锁定。• 编辑完之后,如果想知道做了什么改动,有什么区别,可以使用 rcsdiff howdy.c• 遇到无法锁定的情况,可以使用 rcs -l howdy.c 来获得锁。

Page 39: Linux 操作系统 开发

Acegene IT Co. Ltd. 39

基本用法• 如果是单用户使用,可以使用 rcs -U howdy.c 来关闭锁机制,用 rcs -L howdy.c 来打开锁机制。• 如果你想把文件变成 RCS 文件,但是又不想工作文件被删除,使用:• ci -l f.c 或者 ci -u f.c•前者执行之后用户仍拥有锁,而后者执行后用户不再有锁 (也就是,不可写 )。

Page 40: Linux 操作系统 开发

Acegene IT Co. Ltd. 40

基本用法• 其他参数 • -r 指定需要获取的版本号• -f 强制 RCS覆盖当前的工作文件• 如果你想把当前的版本号改变,使用• ci -r2 howdy.c 或者 ci -r2.1 howdy.c• 将使用新的版本号。以后的版本将自动使用 2.2, 2.3...• 如果不强调 -r ,总是取出当前版本号最大的版本。 • 如果 check in 时使用 ci -r1.3.1, 则新版本号会是 1.3.1.1• 关于分支,使用 rcsfile

Page 41: Linux 操作系统 开发

Acegene IT Co. Ltd. 41

基本用法• ident :可以在所有类型的文件中定位 RCS 关键字(形如 $KEYWORD:VALUE$的字符串,不一定非得是 RCS 关键字),开发人员利用这个特性就能找出程序的特定发行版本中所使用的各个模块的版本号或者其他附加信息。• 在模块中内嵌信息是一种有用的手段,因为这样就可以把特定的问题定位到特定的代码模块。

Page 42: Linux 操作系统 开发

Acegene IT Co. Ltd. 42

基本用法• rcsdiff -rVer1 -rVer2 Filename• rlog Filename 打印日志消息和其他信息• rlog –R 只显示文件名 -L 列出被加锁的文件 -l 列出被某个指定用户加锁的文件• rcsmerge 可以合并多个版本,生成一个单独的工作文件• rcsmerge -rAncestor -rDescendant Working_file -p > Merged_file

Page 43: Linux 操作系统 开发

Acegene IT Co. Ltd. 43

基本用法• rcs 用于两种情形:• 如果以只读方式取出文件后做修改,并且想保存结果,此时可以使用 rcs -l Filename ,取出该文件,并加锁,同时不覆盖现有的同名文件。• 如果需要打开其他人对文件的加锁,可以使用 rcs -u filename ,此时文件被解锁,并且原来的加锁者将受到一条解释信息。• 此外: rcs -mrev:msg 可以修改某个版本的描述信息

Page 44: Linux 操作系统 开发

Acegene IT Co. Ltd. 44

基本用法• rcsclean 清除 RCS 文件,基本用法为 rcsclean [options] file1 file2 …• 不加任何选项的 rcsclean删除哪些在取出后没有更改的工作文件• -u 选项可以先解锁所有已经加锁的文件,然后再删除没有更改的那些工作文件。使用 -rM.N 可以删除指定的版本,例如: rcsclean –r2.3 howdy.c 将删除 howdy.c 的 2.3 版

Page 45: Linux 操作系统 开发

Acegene IT Co. Ltd. 45

RCS 关键字• $Id$ • $Log$ 日志消息, RCS 是在先前的日志消息上面插入新的消息,而不是用最新的消息取代以前的消息• $Author$ 存入该版本的用户登录名• $Date$ 该版本存入的日期和时间,使用 UTC 格式• $Header$ RCS 文件的全路径名,版本号,日期,时间,作者,状态,加锁者(在文件被加锁的情形下)

Page 46: Linux 操作系统 开发

Acegene IT Co. Ltd. 46

RCS 关键字• $Locker$ 锁定该版本的使用者的登陆名• $Name$ 用于取回该版本的符号名• $RCSfile$ 不包含路径的 RCS 文件名• $Revision$ 该版本的版本号• $Source$ RCS 文件的全路径名• $State$ 版本的状态: Exp( 试验版本 ) 、Stab(稳定版本 ) 、 Rel( 发行版本 ) ,缺省为 Exp

Page 47: Linux 操作系统 开发

Acegene IT Co. Ltd. 47

ABI Compatibility• What is Application Binary Interface

– Runtime compatibility mechanism– Allows for an upgrade option on

components so long as the “binary” interface is maintained

– If “binary” interface changed then ABI is said to have “changed” losing compatibility

Page 48: Linux 操作系统 开发

Acegene IT Co. Ltd. 48

ABI Illustration#define ARRAY_SIZE 8struct my_struct{ int array[ARRAY_SIZE];};

init_struct( struct my_struct *p ){ memset( p, 0, sizeof(struct mystruct);

}

Page 49: Linux 操作系统 开发

Acegene IT Co. Ltd. 49

Glibc Compatibility• Usually only affected by 2nd-digit change

– e.g., glibc-2.1 glibc-2.2• Symbols are versioned to provide executable binary compatibility• Does NOT provide link time compatibility

– Must link against the same version of glibc that objects were compiled against– Since Oracle links at the customer site, we get around this by using glibc stubs for linking

Page 50: Linux 操作系统 开发

Acegene IT Co. Ltd. 50

Gcc C++ Compatibility• C++ ABI has changed between 2.96

and 3.2– C++ on Linux now closer to ISO

standard– C++ programs built with gcc-2.96 will

not run with runtime libraries from gcc-3.2

• compatibility package ???

Page 51: Linux 操作系统 开发

Acegene IT Co. Ltd. 51

Current Architectures• These are the CPUs that can run

Linux today: – List all CPUs one would need to build for

if wanted to send a product on all types of CPUs.

– IBM s/390, IA32– Building for i386 covers most bases w/o

optimizations

Page 52: Linux 操作系统 开发

Acegene IT Co. Ltd. 52

Debugging your code• Spinning process? Oracle shadow? Attach to process using gdb debugger:

$ gdb -pid 8520 `which oracle`GDB is free software, covered by the GNU General PublicAttaching to program: oracle, process 8520Reading symbols from 9.2.0/lib/libodm9.so...done.(gdb) where#0 0x40550104 in semop () from /lib/i686/libc.so.6#1 0x0981aae9 in sskgpwwait () Wait on Semaphore… … …#6 0x0822ed45 in kslwait ()#7 0x084fbaf0 in kjudbm () Mount Instance(gdb) detach

Page 53: Linux 操作系统 开发

Acegene IT Co. Ltd. 53

Profiling your code• Is your code doing what you think it should?

– To find out or learn more on 3rd party tools, use oprofile, a freeware runtime profiling tool• Works on UL but not on RHEL 2.1AS

– Intel compiler: vtune

Page 54: Linux 操作系统 开发

Acegene IT Co. Ltd.

AQ&Q U E S T I O N SQ U E S T I O N SA N S W E R SA N S W E R S