第02部分Linux下C编程基础_第1页
第02部分Linux下C编程基础_第2页
第02部分Linux下C编程基础_第3页
第02部分Linux下C编程基础_第4页
第02部分Linux下C编程基础_第5页
已阅读5页,还剩72页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第2部分 Linux下C编程基础2. Linux下C编程基础2.1 vim文本编辑器 2.2 gcc编译器2.3 gdb调试器2.4 make工程管理2.5 autotools2基本编程环境要求使用Ubuntu 10.x版本Linux终端的基本命令vim编辑器的基本使用Vim的配置,使其能适合C/C+开发。参考:3基本编程环境要求Makefile文件了解作用,会写基本的Makefile文件Code:Block开发工具安装。可在Ubuntu的软件中以进行。Code:Block没有直接提供Ubuntu的二进制版本,但Ubuntu软件中心提供了。在Code:Block中进行程序的开发(编写、编译及调

2、试等)。41 vim文本编辑器5Vi 由Bill Joy于1976年写成,融合了两种更原始的编辑工具:ed和ex。Vi代表着“visual interface”。Vim兼容所有vi命令。不仅能应用于Linux系统,也有其他系统的运行版本。支持文本字符高亮度显示。几乎所有的Linux系统缺省安装Vi或者Vim。在ubuntu下实际使用的是Vim。 1.1 vi文本编辑器简介6命令区编辑区一般模式: 键盘上的字母键成为功能键编辑模式:键盘上的字母键都可以输入字符命令行模式: 存储、退出、分页等命令1.2 Vim操作模式7h或左方向键 光标向左移动一个字符j或下方向键 光标向下移动一个字符k或上方向

3、键 光标向上移动一个字符l或右方向键 光标向右移动一个字符Ctrl + f 屏幕向前翻动一页Ctrl + b 屏幕向后翻动一页数字0键 移动到这一行的第一个字符处$ 移动到这一行的最后一个字符处n 移动到这个文件的第n行/word 在光标之后查找一个名为word的字符串 1.3 移动光标与查找命令8按$键光标移向句尾按2enter光标下移2行1.3 移动光标与查找命令9按/键输入printf然后enter光标指向要查找的字符处1.3 移动光标与查找命令10插入或添加字符等操作:i , I 在当前光标所在处插入输入的文字a , A 由当前光标所在处的下一个字符开始输入o , O 从光标所在处的下

4、一行行首开始输入字符r , R r会替换光标所指的那个字符,R会一直替换 光标所指的文字cw 替换当前光标到单词的末尾的内容c$ 替换当前光标到行末的内容1.4 文本编辑相关指令11删除字符操作:x , X 在当前光标所在处删除前面的字符 dw 删除当前光标处一个单词d$ 从当前光标删除至当前行末尾 dd 删除一行1.4 文本编辑相关指令12恢复及复制字符相关操作:u 撤消以前的操作U 撤消在一行中所做的改动ctrl + r 撤消以前的撤消命令,恢复以前的操作结果p 重新置入已经删除的文本内容v, y 复制粘帖按键,定义字符串的头尾p,P 粘帖字符串于光标处1.4 文本编辑相关指令13按i在当

5、前光标处添加内容按a在当前光标后开始添加内容,按esc退出编辑模式1.4 文本编辑相关指令14按xorX键删除单个字符按dw删除一个单词按dd删除一行1.4 文本编辑相关指令15光标处按v键按方向-键移动到句尾按下y键按p键粘帖字符串1.4 文本编辑相关指令16命令行状态下:按:按键进入命令状态按set nu设置行号按set nonu 取消行号按q! 不保存退出vi按q 退出但如有修改文本操作,无法退出按wq保存并推出vi,直接输入ZZ相当于wq按w 保存操作按ESC退出命令状态按!命令执行shell下的命令, exit退出shell,即可回到vi下1.5 命令行模式指令17保证当前模式为一般

6、模式按:进入命令行模式输入wqw:保存 q:退出输入q!不保存退出1.5 命令行模式指令18命令行状态下:按sp 分页显示按close 关闭当前页面按new 新建页面按wqall 退出并保存所有页面按qall! 不保存退出所有页面按ctrl+w 页面之间切换按e 打开文本文件1.6 分页操作指令191.6 分页操作指令201.6 分页操作指令211.6 分页操作指令222. Linux下C编程基础2.1 vim文本编辑器 2.2 gcc编译器2.3 gdb调试器2.4 make工程管理2.5 autotools232 gcc编译器 GNU CC(简称为gcc)是GNU项目中符合ANSI C标准

7、的编译系统,能够编译用C、C+和Object C等语言编写的程序。gcc还可以编译如C、C+、Object C、Java、Fortran、Pascal和Ada等多种语言。gcc又是一个交叉平台编译器,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件,尤其适合在嵌入式领域的开发编译。 24gcc编译过程#includeint main() printf(Hello! This is our embedded world!n); return 0;printf()的申明在头文件stdio.h中int printf(const char *fmt, .);printf()的实现在库/li

8、b/libc.so.6中printf.o;25gcc编译过程26gcc所支持后缀名解释 27gcc - 预处理阶段(1)对包含的头文件(#include)和宏定义(#define、#ifdef等)进行处理 。可以使用gcc的选项“-E” 让gcc在预处理结束后停止编译过程。 rootlocalhost# gcc E hello.c o hello.i/* hello.i */typedef int (*_gconv_trans_fct) (struct _gconv_step *, struct _gconv_step_data *, void *, _const unsigned char

9、*, _const unsigned char *, _const unsigned char *, unsigned char *, size_t *);# 2 hello.c 2int main()printf(Hello! This is our embedded world!n);return 0;28gcc -编译阶段(2)gcc首先检查代码的规范性、是否有语法错误等,以确定代码实际要做的工作,在检查无误后,gcc把代码翻译成汇编语言。用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。rootlocalhost# gcc S hello.i o hell

10、o.s29gcc -编译阶段(2)/* hello.s */ .filehello.c .section.rodata .align 4.LC0: .string Hello! This is our embedded world! .text.globl main .type main, functionmain: pushl %ebp movl %esp, %ebp subl $8, %esp andl $-16, %esp movl $0, %eax addl $15, %eax addl $15, %eax shrl $4, %eax sall $4, %eax subl %eax,

11、%esp subl $12, %esp pushl $.LC0 call puts addl $16, %esp movl $0, %eax leave ret .sizemain, .-main .ident GCC: (GNU) 4.0.0 200X0Y19 (Red Hat 4.0.0-8) .section .note.GNU-stack,progbits30gcc -汇编阶段(3)将编译阶段生成的”.s”文件转成目标文件,用选项 “-c”只产生目标代码,不链接。rootlocalhost# gcc c hello.s o hello.o31gcc -链接阶段(4)将库链接进来生成可执

12、行文件rootlocalhost# gcc hello.o o hello32gcc - 常用选项33gcc -库选项 将一些常用公共函数编译并集成到函数库中,不仅能够节省内存资源,而且大大降低开发难度和开销,提高开发效率并增强程序的结构性。静态库是一系列的目标文件(.o文件)的归档文件(文件名格式为libname.a),如果在编译某个程序时链接静态库,则链接器将会搜索静态库,从中提取出它所需要的目标文件并直接拷贝到该程序的可执行二进制文件(ELF格式文件)之中;动态库(文件名格式为libname.so.主版本号.次版本号.发行号)在程序编译时并不会被链接到目标代码中,而是在程序运行时才被载入

13、。 34gcc -库选项 35Linux函数库的创建与使用/* unsgn_pow.c:库程序 */unsigned long long unsgn_pow(unsigned int x, unsigned int y) unsigned long long res = 1; if (y = 0) res = 1; else if (y = 1) res = x; else res = x * unsgn_pow(x, y - 1); return res;/* pow_test.c */#include #include int main(int argc, char *argv) unsi

14、gned int x, y; unsigned long long res; if (argc 3) | (sscanf(argv1, %u, &x) != 1) | (sscanf(argv2, %u, &y) != 1) printf(Usage: pow base exponentn); exit(1); res = unsgn_pow(x, y); printf(%u %u = %un, x, y, res); exit(0);36静态库的创建和使用$ gcc -c unsgn_pow.c $ ar rcsv libpow.a unsgn_pow.o$ gcc -o pow_test

15、pow_test.c -L. lpow$ ./pow_test 2 102 10 = 1024 编译时链接到库文件libpow.a中37动态库的创建和使用$ gcc -fPIC -Wall -c unsgn_pow.c$ gcc -shared -o libpow.so unsgn_pow.o$ gcc -o pow_test pow_test.c -L. lpow 在运行可执行程序之前,需要注册动态库的路径名。其方法有几种:修改/etc/ld.so.conf文件,或者修改LD_LIBRARY_PATH环境变量,或者将库文件直接拷贝到/lib或者/usr/lib目录下(这两个目录为系统的默认的

16、库路径名)。$ cp libpow.so /lib$ ./pow_test 2 102 10 = 1024 38静态库与动态库的比较动态库只有在使用它的程序执行时才被链接使用,而不是将需要的部分直接编译入可执行文件中,并且一个动态库可以被多个程序使用故可称为共享库;静态库将会整合到程序中,因此在程序执行时不用加载静态库。 从而可知,链接到静态库会使你的程序臃肿,并且难以升级,但是可能会比较容易部署。而链接到动态库会使你的程序轻便,并且易于升级,但是会难以部署。 39gcc - 警告选项(1)#includevoid main() long long tmp=1; printf(“This is

17、 a bad code!n”); return 0;-Werror40gcc - 警告选项(2)$ gcc ansi warning.c o warningwarning.c: 在函数“main”中:warning.c:7 警告:在无返回值的函数中,“return”带返回值warning.c:4 警告:“main”的返回类型不是“int”#includevoid main() long long tmp=1; printf(“This is a bad code!n”); return 0;41gcc - 警告选项(3)$ gcc pedantic warning.c o warningwar

18、ning.c: 在函数“main”中:warning.c:5 警告:ISO C90不支持“long long”warning.c:7 警告:在无返回值的函数中,“return”带返回值warning.c:4 警告:“main”的返回类型不是“int” #includevoid main() long long tmp=1; printf(“This is a bad code!n”); return 0;42gcc - 警告选项(3)$ gcc Wall warning.c o warningwarning.c: 在函数“main”中: warning.c:7 警告:在无返回值的函数中,“re

19、turn”带返回值warning.c:4 警告:“main”的返回类型不是“int”warning.c:5 警告:未使用的变量“tmp” #includevoid main() long long tmp=1; printf(“This is a bad code!n”); return 0;43gcc - 优化选项gcc可以对代码进行优化,通过编译选项“-On”来控制优化代码的生成,其中n是一个代表优化级别的整数。-O: 告诉GCC同时减小代码的长度和执行时间,其效果等价于-O1。-O2:告诉GCC除了完成所有“-O1”级别的优化之外,同时还要进行一些额外的调整工作,如处理器指令调度等。-O

20、3: 除O2外,还包括循环展开和其他一些与处理器特性相关的优化工作。44gcc - 体系结构相关选项45gcc编译选项:gcc options 需要编译链接的文件名列表。-E 仅完成预处理。-S 生成汇编代码文件。-c不进行链接,只生成目标文件。-o file 输出文件名,缺省名为a.out。-On 编译优化级别,n为0、1、2、3,默认值为1,最通常的优化为2。-g在目标文件中嵌入调试信息,这些信息可以供如gdb之类的调试软件使用。最简编译gcc g hello.c -o hello gcc c hello.s o hello.ogcc S hello.i o hello.sgcc hell

21、o.c -o hello gcc E hello.c o hello.igcc O2 hello.c -o hello 小结 462. Linux下C编程基础2.1 vim文本编辑器 2.2 gcc编译器2.3 gdb调试器2.4 make工程管理2.5 autotools473 gdb调试器gdb调试器是一款GNU开发组织发布的UNIX/Linux下的程序调试工具。虽然没有图形化的友好界面,但是它强大的功能也足以与微软的VC工具等媲美。 $ gcc -g test.c -o test$ gdb testGNU gdb Red Hat Linux (-1.21rh)Copyrig

22、ht 2004 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you arewelcome to change it and/or distribute copies of it under certain conditions.Type show copying to see the conditions.There is absolutely no warranty for GDB. Type show warranty for detai

23、ls.This GDB was configured as i386-redhat-linux-gnu.Using host libthread_db library /lib/libthread_db.so.1.(gdb)48gdb调试器(gdb) b 6Breakpoint 1 at 0 x804846d: , line 6. (gdb) l1 #include 2 int sum(int m);3 int main()4 5 int i,n = 0;6 sum(50);7 for(i = 1; i = 50; i+)8 9 n += i;10 (gdb) l11 printf(The s

24、um of 150 is %d n, n );12 13 14 int sum(int m)15 16 int i, n = 0;17 for(i = 1; i = m; i+)18 19n += i;20 21 printf(The sum of 1m is = %dn, n);20 (gdb) b 19(gdb) cBreakpoin 2, sum(m=50) at test.c:1919 printf(“The sum of 1-m is %dn”, n);(gdb) bt#0 sum(m=50) at test.c:19#1 0 x080483e8 in main() at test.

25、c:6(gdb) info bNum Type Disp Enb Address What1 breakpoint keep y 0 x0804846d in main at test.c:6(gdb) rStarting program: /root/workplace/gdb/testReading symbols from shared object read from target memory.done.Loaded system supplied DSO at 0 x5fb000Breakpoint 1, main () at test.c:66 sum(50);49gdb调试器(

26、gdb) p n$1 = 0(gdb) p i$2 = 134518440(gdb) nThe sum of 1-m is 12757 for (i = 1; i = 50; i+) (gdb) ssum (m=50) at test.c:1616 int i, n = 0;(gdb) cContinuing.The sum of 1-50 is :1275Program exited with code 031. (gdb) helpList of classes of commands:aliases - Aliases of other commandsbreakpoints - Mak

27、ing program stop at certain pointsdata - Examining datafiles - Specifying and examining filesinternals - Maintenance commandsType help followed by a class name for a list of commands in that class.Type help followed by command name for full documentation.Command name abbreviations are allowed if una

28、mbiguous.(gdb) help callCall a function in the program.The argument is the function name and arguments, in the notation of thecurrent working language. The result is printed and saved in the valuehistory, if it is not void.50gdb工作环境相关命令 51gdb设置断点与恢复命令 52gdb中源码查看相关相关命令 将路径添加到源文件搜索的路径的开头DIR53gdb中查看运行数

29、据的相关命令 542. Linux下C编程基础2.1 vim文本编辑器 2.2 gcc编译器2.3 gdb调试器2.4 make工程管理2.5 autotools554 make工程管理器make工程管理器用于管理较多的文件,其是一个“自动编译管理器”。这里的“自动”是指它能够:根据文件时间戳自动发现更新过的文件而减少编译的工作量;通过读入makefile文件的内容来执行大量的编译工作 564 工程管理器make例一个工程项目由多个源文件组成,直接用gcc将会很麻烦Make会根据文件时间戳自动发现更新过的文件而减少编译工作量make通过读入makefile文件查找文件依赖关系执行编译 main

30、.cheald1.hheald2.htest1.ctest2.cheald3.hmain.otest1.otest2.otest项目test57makefile基本结构(1)makefile是make读入的惟一配置文件,因此本节的内容实际就是讲述makefile的编写规则。在一个makefile中通常包含如下内容:目标体(target):通常是目标文件或可执行文件;依赖的文件:创建目标体所依赖的文件;命令:创建目标体时需要运行的命令,这一行必须以制表符(tab键)开头。58makefile格式makefile例子使用make项目管理器makefile基本结构(2)target: depende

31、ncy_filescommand /* 该行必须以tab键开头*/hello.o: hello.c hello.h gcc c hello.c o hello.o$ make 或 make hello.o gcc c hello.c o hello.o$ lshello.c hello.h hello.o makefile 59makefile变量变量用来代替一个文本字符串 变量定义的两种方式递归展开方式VAR=var简单方式 VAR:=var变量使用$(VAR)OBJS = kang.o yul.oCC = gccCFLAGS = -Wall -O -gdavid : $(OBJS) $(C

32、C) $(OBJS) -o davidkang.o : kang.c kang.h $(CC) $(CFLAGS) -c kang.c -o kang.oyul.o : yul.c yul.h $(CC) $(CFLAGS) -c yul.c -o yul.o60makefile变量变量种类用户自定义变量预定义变量自动变量环境变量 OBJS = kang.o yul.oCC = gccCFLAGS = -Wall -O -gdavid : $(OBJS) $(CC) $ -o $kang.o : kang.c kang.h $(CC) $(CFLAGS) -c $ -o $yul.o : yu

33、l.c yul.h $(CC) $(CFLAGS) -c $ -o $用户自定义变量61Makefile变量-预定义变量OBJS = kang.o yul.oCC = gccCFLAGS = -Wall -O -gdavid : $(OBJS) $(CC) $ -o $kang.o : kang.c kang.h $(CC) $(CFLAGS) -c $ -o $yul.o : yul.c yul.h $(CC) $(CFLAGS) -c $ -o $预定义变量62Makefile变量-自动变量$*$+$?$%OBJS = kang.o yul.oCC = gccCFLAGS = -Wall

34、-O -gdavid : $(OBJS) $(CC) $ -o $kang.o : kang.c kang.h $(CC) $(CFLAGS) -c $ -o $yul.o : yul.c yul.h $(CC) $(CFLAGS) -c $ -o $63Makefile变量-环境变量make在启动时会自动读取系统当前已经定义了的环境变量,并且会创建与之具有相同名称和数值的变量,但是 如果用户在makefile中定义了相同名称的变量,那么用户自定义变量将会覆盖同名的环境变量 64makefile规则 makefile的规则是make进行处理的依据,它包括了目标体、依赖文件及其之间的命令语句。隐

35、含规则模式规则65隐式规则隐含规则能够告诉make怎样使用传统的规则完成任务,这样,当用户使用它们时就不必详细指定编译的具体细节,而只需把目标文件列出即可 例子OBJS = kang.o yul.oCC = gccCFLAGS = -Wall -O -gdavid : $(OBJS) $(CC) $ -o $OBJS = kang.o yul.oCC = gccCFLAGS = -Wall -O -gdavid : $(OBJS) $(CC) $ -o $kang.o : kang.c kang.h $(CC) $(CFLAGS) -c $ -o $yul.o : yul.c yul.h $(CC) $(CFLAGS) -c $ -o $66模式规则为多个文件建立相同的规则,以简化makefile的编写格式类似于普通规则,这个规则中的相关文件前必须用“%”标明例OBJS = kang.o yul.oCC = gccCFLAGS = -Wall -O -gdavid : $(OBJS) $(CC) $ -o $%.o

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论