版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Linux 下的C编程,熟悉Linux系统下的开发环境 熟悉vi 的基本操作 熟悉gcc编译器的基本原理 熟练使用gcc编译器的常用选项 熟悉Makefile基本原理及语法规范 熟练使用autoconf和automake来生成Makefile,C语言的特点,C语言的硬件无关性和可移植性,成为最广泛使用的计算机语言 C语言把高级语言的基本结构与低级语言的实用性结合。 C语言是结构化的语言。 C语言功能齐全。各种数据类型,图形,计算,逻辑判断。 C语言可移植性强。适合多种操作系统,Linux下的C语言编程环境概述,编辑器:Linux中最常用的编辑器有vi(vim)和Emacs。编辑源程序 编译链接
2、器: 编译过程是非常复杂的,包括词法、语法和语义的分析、中间代码的生成和优化、符号表的管理和出错处理等。在Linux中最常用的编译器是gcc。它是GNU推出的功能强大、性能优越的多平台编译器。 调试器:并不是代码执行的必备工具,而是专为程序员方便调试程序而用的。gdb是绝大多数linux开发人员所使用调试器,可以方便地设置断点、但不跟踪。 项目管理工具:Liunx中项目管理器make有些类似windows中visualC+里的工程,是一种控制编译或重复编译软件的工具,另外,他还能自动管理软件编译的内容、方式和时机,使程序员能够把精力集中在代码的编写而不是在源代码的组织上。,vi 编辑器,gcc
3、编译器,计算机可执行的,进入vi(vim) (编辑器),Linux系统提供了一个完整的编辑器家族系列,如Ed、Ex、vi 和Emacs等。按功能它们分为两大类:行编辑器(Ed、Ex)和全屏幕编辑器(vi 、Emacs)。 vi 是Linux系统的第一个全屏幕交互式编辑程序,是人们主要使用的文本编辑工具。具有强大的功能。,vi / vim 的模式,3种工作模式 命令行模式(编辑模式) 插入模式 底行模式,vi 编辑器,编辑(指令)模式:vi 在初始启动后首先进入,这时用户可以利用一些预先定义的按键来移动光标、删除文字、 复制或粘贴文字等 。 插入模式:当用户在编辑模式下键入 i, a, o 等命
4、令之后,可进入插入模式;按 Esc 之后,从插入模式切换到编辑模式 。 末行模式:在编辑模式下输入冒号:,就为末行模式。用户就可以键入一些命令。这些命令可用来保存文件、读取文件内容,Vi的基本流程,进入vi ,首先进入命令行模式,指令(编辑)模式(command mode),文本输入模式(Input Mode),底行模式(last line mode),ESC返回指令模式,a i o 输入模式,指令错误返回,:进底行模式,vi / vim 编辑器,通过在Linux文字模式下键入 vi 文件名 例如: # vi hello.c 进入到vi编辑器,插入模式,A在光标所在行的末尾输入正文 a 在光标
5、右侧输入正文 I 在光标所在行的开头输入正文 i 在光标左侧输入正文 O 在光标所在行的上一行增添新行 o 在光标所在行的下一行增添新行 进入插入模式后,屏幕下端显示 -insert- 输入任何字符 Esc 退出插入模式,编辑(指令)模式-移动光标,G 移动光标到最后一行 nG 移动光标到第n行 0 数字0,左移光标,到本行的开头 $ 右移光标,到本行的末尾 n 光标下移n行 k、j、h、l 功能分别等同于上、下、左、右箭头键 Ctrl+ b 后翻页 ctrl+f 前翻页 Ctrl+u 后翻半页,ctrl+d 前翻半页,编辑模式-替换和删除,将光标定位于文件内指定位置后,可以用其他字符来替换光
6、标所指向的字符,或从当前光标位置删除一个或多个字符。 rc 用 c 替换光标所指向的当前字符 nrc 用 c 替换光标所指向的前 n 个字符 x 删除光标所指向的当前字符 nx 删除光标所指向的前 n 个字符 dw 删除光标右侧的字 ndw 删除光标右侧的 n 个字 db 删除光标左侧的字 ndb 删除光标左侧的 n 个字 dd 删除光标所在行,并去除空隙 ndd 删除 n 行内容,并去除空隙,编辑模式-粘贴和复制,yy 复制当前行到内存缓冲区 nyy 复制 n 行内容到内存缓冲区 p 小写字母 p,将缓冲区的内容粘贴到光标的后面 P 大写字母 P,将缓冲区的内容粘贴到光标的前面 u 恢复前一
7、个动作。,编辑模式-搜索字符串,/str1 正向搜索字符串 str1 n 继续搜索,找出 str1 字符串下次出现的位置 ?str2 反向搜索字符串 str2 无论搜索方向如何,当到达文件末尾或开头时,搜索工作会循环到文件的另一端并继续执行,末行模式 文件操作,: q 在未作修改的情况下退出 : q! 放弃所有修改,退出编辑程序 :w 将编辑的内容写入原始文件,用来保存编辑的中间结果 :w! 强行保存 :wq 将编辑的内容写入原始文件并退出编辑程序 :w file 将编辑的内容写入 file 文件,保持原有文件的内容不变 :e file 编辑新文件 file 代替原有内容 :f file 将当
8、前文件重命名为 file,末行模式-选项设置,:set option 设置选项 option 常见的功能选项包括: autoindent 设置该选项,则正文自动缩进 ignorecase 设置该选项,则忽略规则表达式中大小写字母的区别 number 设置该选项,则显示正文行号 nonumber 不显示行号 ruler 设置该选项,则在屏幕底部显示光标所在行、列的位置 tabstop 设置按 Tab 键跳过的空格数。 例如 :set tabstop=n,n 默认值为 8,用vi编辑一个c程序, hello.c,#include int main() printf(“Hello! This is
9、our embbed world!n”); printf(“This is my test file!n”); printf(“This is my test file!n”); return 0; ,用vi编辑文件,上机练习,vi 编辑器,gcc编译器,计算机可执行的,gcc编译器,GNU符合ANSI C标准的编译系统, 编译 C,C+,Object C Java Pascal Ada gcc也是一个交叉平台编译器,在当前cpu平台上为多种不同体系结构的硬件平台开发软件。适合嵌入式领域的开发编译。,gcc编译器支持编译元文件的后缀,gcc编译器gcc编译流程,编译器的gcc的编译流程分为4个
10、步骤 预处理: pre-processing 将.h文件插入到源文件中 .i 编译: compiling 检查代码的规范性,语法,检查无误后,代码翻译成汇编语言 .s 汇编: assembing .s 文件转换成目标代码 .o 链接: Linking 把函数库链接到文件中生成可执行文件,gcc 一般的格式为 gcc 选项 文件名 选项 目标文件 其中目标文件可缺省,默认生成的可执行文件为: .out,gcc编译器gcc编译流程,gcc E hello.c o hello.i 预编译 (头文件包含进来) gcc S hello.i o hello.s 编译 (成为汇编语言) gcc c hell
11、o.s o hello.o 汇编 (二进制代码) gcc hello.o o hello 链接 (库函数) gcc hellol.c -I /root/workplace/gcc/ -o hello1 gcc hello_sq.c -L /root/workplace/gcc/lib -lsunq o hello_sq,gcc编译选项分析 (1)总体选项,gcc编译选项分析 (2)告警和出错选项,编译LinuxC程序,vi score.c,文件分割,分割成3个文件,make 工程管理软件,make是一种代码维护工具.在大中型项目中,他将根据程序各个模块的更新情况,自动的维护和生成目标.能很好的
12、做到”不多”,”不重”不漏”. 不多:他只更新那些需要更新的文件 不重:是指当make对某个文件进行更新时,即使有很多文件过时,他也将只更新一次,当然,这一次就足够了 不漏:是指他不会漏下任何应该更新的文件.,make 工程管理软件,make是自动编译管理器,“自动”是指它能根据时间戳自动发现更新过的文件而减少编译的工作量. 通过读入Makefile文件的内容来执行大量的编译工作.用户只需编写一次简单的编译语句就可以了。几乎所有Linux的项目编程均会涉及它。,Makefile基本结构,Makefile是Make读入的唯一配置文,Make工具最主要也是最基本的功能就是通过Makefile文件来
13、描述源程序之间的相互关系并自动维护编译工作。 Makefile 文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系。,makefile的结构,基本格式:target:dependency files command target :需要由make工具创建的目标体,通常是目标文件或可执行文件; dependecy files:要创建目标体所依赖的文件; command:创建每个目标体需要运行的命令。,例:有两个文件hello.c和hello.h,创建的目标体为hello.o,执行的命令为gcc编译指令:gcc c hello.c ,
14、那么,对应的makefile可以写为: 注意:command前必须有 “Tab”符 使用make的格式为:make target,这样make就会自动读入Makefile并执行相应的target的command语句,并会找到相应的依赖文件。,分割成3个文件,实际中使用makefile往往包含很多的文件和命令。 sunq : kang.o yul.o gcc kang.o yul.o o sunq kang.o : kang.c kang.h head.h gcc Wall O g c kang.c o kang.o yul.o : bar.c head.h gcc Wall O g c bar
15、.c o yul.o,makefile 变量,变量是Makefile中定义的名字,用来代替一个文本字符串。该文本字符串为该变量的值 文本可以代替目标体,依赖文件,命令和Makefile中的其他部分。 变量的定义 递归展开式 VAR=var 简单扩展式 VAR := var Make中变量的使用 $(VAR),OBJS=kang.o yul.o CC =gcc CFLAGS = -Wall O g sunq :$(OBJS) $(CC) $(OBJS) o sunq kang.o :kang.c kang.h head.h $(CC) $(CFLAGS) -c kang.c o kang.o y
16、ul.o : bar.c head.h $(CC) $(CFLAGS) c bar.c o yul.o,sunq : kang.o yul.o gcc kang.o yul.o o sunq kang.o : kang.c kang.h head.h gcc Wall O g c kang.c o kang.o yul.o : bar.c head.h gcc Wall O g c bar.c o yul.o,makefile 变量,用户自定义变量:用户自己定义的 OBJS 预定义变量:常见编译器,汇编器及其编译选项 自动变量:代表编译语句中出现的目标文件和依赖文件,具有本地含义 环境变量:系
17、统在启动时会自动读取环境变量,makefile 变量-预定义变量,需列出 CC=gcc CFLAGS= -Wall O -g,makefile 变量自动变量,OBJS=kang.o yul.o CC =gcc CFLAGS = -Wall O g sunq :$(OBJS) $(CC) $(OBJS) o sunq kang.o :kang.c kang.h head.h $(CC) $(CFLAGS) -c kang.c o kang.o yul.o : bar.c head.h $(CC) $(CFLAGS) c bar.c o yul.o,OBJS=kang.o yul.o CC =gc
18、c CFLAGS = -Wall O g sunq :$(OBJS) $(CC) $ -o $ kang.o :kang.c kang.h head.h $(CC) $(CFLAGS) c $ -0 $ yul.o : bar.c head.h $(CC) $(CFLAGS) c $ -c$,makefile的规则,makefile的规则是Make进行处理的依据,它包括了目标体,依赖文件及其之间的命令语句 隐试规则 模式规则,makefile规则隐式规则,隐式规则告诉make怎样完成任务,当用户使用它们时就不必详细指定编译细节,对应语言的后缀名 规则 C编译 .c 变为.o $(CC) c $
19、(CPPFLAGS) $(CFLAGS) C+编译 .cc或 .变为.o $(CXX) c $(CPPFLAGS) $(CXXFLAGS) Pascal .p .o $(PC) c $(PFLAGS) Fortran .r .o $(FC) c $(FFLAGS),OBJS=kang.o yul.o CC =gcc CFLAGS = -Wall O g sunq :$(OBJS) $(CC) $ -o $ kang.o :kang.c kang.h head.h $(CC) $(CFLAGS) c $ -o $ yul.o : yul.c yul.h $(CC) $(CFLAGS) c $ -
20、o $,OBJS = kang.o yul.o CC =gcc CFLAGS = -Wall O g sunq :$(OBJS) $(CC) $ -o $,makefile规则模式规则,模式规则使用定义相同的处理规则的多个文件。模式规则可以引入用户自定义的变量,为多个文件建立相同的规则。简化makefile的编写 规则中的相关文件必须用 %表明。,OBJS=kang.o yul.o CC =gcc CFLAGS = -Wall O g sunq :$(OBJS) $(CC) $ -o $ kang.o :kang.c kang.h head.h $(CC) $(CFLAGS) c $ -o $
21、 yul.o : yul.c yul.h $(CC) $(CFLAGS) c $ -o $,OBJS=kang.o yul.o CC =gcc CFLAGS = -Wall O g sunq :$(OBJS) $(CC) $ -o $ %.o :%.c $(CC) $(CFLAGS) c $ -o $,make管理器,make管理器非常简单,只需在make命令后键入目标名即可建立指定的目标 如果直接运行make,则建立makefile中的第一个目标。,make命令行的选项,-dir 读入指定目录下的makefile -f file 读入当前目录下的file文件作为makefile i 忽略所有
22、的命令执行错误 -I dir 指定被包含的Makefile所在的目录 -n 只打印要执行的命令,但不执行它们 -p 显示make变量数据库和隐含规则 s 在执行命令时不显示命令 -w 如果make在执行过程中改变目录,则打印当前目录,Makefile应用,为单个文件编写makefile 为多个文件编写makefile 使用不同目录的文件的makefile的写法 多个子模块的文件的makefile写法,Makefile应用,为单个文件编写makefile 编写hello.c程序 #include int main(void) printf(Hello world!n); return 0; ,M
23、akefile应用,执行: $ vi Makefile =makefile开始= # This is a sample CC = gcc all:hello.o $(CC) o hello hello.o hello.o:hello.c $(CC) c o hello.o hello.c clean: rm *.o hello =makefile结束=,Makefile应用,为多个文件编写makefile 有四个文件menu.c,music.c,picture.c,menu.h /*menu.c*/,#include #include“menu.h” int main(void) int ch
24、oice; printf(-welcome you ! -n); printf( * 1 music! *n); printf( * 2 picture! *n); printf(-have a choice!-n); scanf(d,switch(choice) case 1: music(); break; case 2: picture(); break; printf(Good Bye!n); return 0; ,Makefile应用,为多个文件编写makefile /*music.c*/ #include #include void music(void) printf(Liste
25、n to music!n); ,Makefile应用,为多个文件编写makefile /*picture.c*/ #include void picture(void) printf(Have a look at picture!n); ,Makefile应用,为多个文件编写makefile /* menu.h */ void music(void); void picture(void);,Makefile应用,为多个文件编写makefile 几个文件间的依赖关系,Makefile应用,上面程序的makefile: =makefile开始= CC=gcc all:menu.o music.o
26、 picture.o $(CC) menu.o music.o picture.o -o menu menu.o:menu.c menu.h $(CC) -c menu.c -o menu.o music.o:music.c $(CC) -c music.c -o music.o picture.o:picture.c $(CC) -c picture.c -o picture.o clean: rm *.o menu =makefile结束=,Makefile应用,上面程序的makefile:实际上,可以用$代表目标文件,$代表源文件,于是可以将makefile写成这样: =makefile
27、开始= CC=gcc all:menu.o music.o picture.o $(CC) $ -o menu menu.o:menu.c menu.h $(CC) -c $ -o $ music.o:music.c $(CC) -c $ -o $ picture.o:picture.c $(CC) -c $ -o $ clean: rm *.o menu =makefile结束=,Makefile应用,上面程序的makefile:由于各个文件的编译命令几乎没有什么差别,可以使用通配符%或*进一步简化 : =makefile开始= CC=gcc all:menu.o music.o pictu
28、re.o $(CC) $ -o menu %.o:%.c $(CC) -c -o $ $ clean: rm *.o menu =makefile结束=,Makefile应用,使用不同目录的文件的makefile的写法 假设程序的目录结构如下: bin 存放生成的可执行文件(menu) obj 存放.o文件(menu.o,music.o,picture.o) include 存放.h文件(menu.h) src 存放源程序文件和makefile(menu.c,picture.c,music.c),Makefile应用,=makefile开始= CC=gcc all:./obj/menu.o .
29、/obj/music.o ./obj/picture.o $(CC) -o ./bin/menu $ ./obj/menu.o:./menu.c ./include/menu.h $(CC) -o $ -c $ -I ./include ./obj/music.o:./music.c $(CC) -o $ -c $ ./obj/picture.o:./picture.c $(CC) o $ -c $ clean: rm ./bin/menu =makefile结束=,Makefile应用,=makefile开始= CC=gcc SRC_DIR = ./ OBJ_DIR = ./obj/ BIN
30、_DIR = ./bin/ INC_DIR = ./include all:$(OBJ_DIR)menu.o $(OBJ_DIR)music.o $(OBJ_DIR)picture.o $(CC) $ -o $(BIN_DIR)menu $(OBJ_DIR)menu.o:$(SRC_DIR)menu.c $(INC_DIR)/menu.h $(CC) -I$(INC_DIR) -c -o $ $ $(OBJ_DIR)music.o:$(SRC_DIR)music.c $(CC) -c $ -o $ $(OBJ_DIR)picture.o:$(SRC_DIR)picture.c $(CC) -c
31、 $ -o $ clean: rm $(BIN_DIR)menu =makefile结束=,Makefile应用,多个子模块的文件的makefile写法 以上面的文件(多个目录)为例,将menu.c、music.c和picture.c分别放入src目录下的三个子目录menu、music和picture中,创造多模块环境 需要写四个makefile,分别为于src、menu、music目和picture目录下,分别管理各自目录下的文件,Makefile应用,src目录下的makefile CC=gcc SRC_DIR = ./ OBJ_DIR = ./obj/ BIN_DIR = ./bin/
32、INC_DIR = ./include all:$(OBJ_DIR)menu.o $(OBJ_DIR)music.o $(OBJ_DIR)picture.o $(CC) $ -o $(BIN_DIR)menu include $(SRC_DIR)menu/makefile include $(SRC_DIR)music/makefile include $(SRC_DIR)picture/makefile,Makefile应用,src/menu目录下的makefile $(OBJ_DIR)menu.o:$(SRC_DIR)menu/menu.c $(INC_DIR)/menu.h $(CC)
33、-I$(INC_DIR) -c -o $ $ src/music目录下的makefile $(OBJ_DIR)music.o:$(SRC_DIR)music/music.c $(CC) -c $ -o $ src/picture目录下的makefile $(OBJ_DIR)picture.o:$(SRC_DIR)picture/picture.c $(CC) -c $ -o $,使用autotools,编写Makefile确实不是一件轻松的事,尤其对于一个较大的项目更是如此。 使用autotools轻松生成Makefile。 只需输入简单的目标文件、依赖文件、文件目录等就可以轻松地生成Make
34、file了。 该工具还可以完成系统配置信息的收集,从而方便的处理各种移植性的问题。 Linux的软件开发一般都用autotools来制作Makefile,使用autotools 工具自动生成makefile,autotools使用流程,首先确认系统是否装了一下工具 aclocal autoscan autoconf autoheader automake 用which命令查看,例,建目录 /home/lfl 将文件hello.c复制到该目录下。 1. autoscan,2. autoconf 编辑configure.scan vi configure.scan,将configure.scan
35、的内容如下修改存盘,然后将文件configure.scan 改名为configure.in,3 autoheader,4 automake automake要用到脚本配置文件Makefile.am,如果hello这个程序是由多个源文件产生,则必须把所有的原始文件都列出来,并且用空格分隔。 例如 hello_SOURCES=hello.c sunq.c hello.h 如果要定义多个可执行文件,则对每个执行程序都要定义相应的file_SOURCES.,5 运行configure 生成Makefile,使用autotools所生成的Makefile,1 make 编译 生成可执行文件hello 运
36、行 ./hello,使用autotools所生成的Makefile,2 make install 把可执行文件hello安装到系统目录中去。,使用autotools所生成的Makefile,3 make clean 清除之前所编译的可执行文件及目标文件,使用autotools所生成的Makefile,4 make dist 将程序和相关的文档打包为一个压缩文档供发布。,小结,C语言程序的编辑 ,编辑工具vi或 vim的使用,(参看资料vim的使用) 编译器的使用,gcc 选项 文件 Make管理器的使用,Makefile的编写 阅读参考资料,第2章 嵌入式交叉编译环境,Gdb(GNU debu
37、gger)是GNU开发组织发布的一个强大的Unix/Linux下的程序调试工具。 是一个命令行的调试器,但gdb具有比很多图形化调试器更强大的功能。 可以调试各种程序,包括C,C+,JAVA,PASCAL等 具有远程调试功能对嵌入式非常有用,2.6 GDB调试器,Gdb主要可以完成下面任务: (1)启动程序,并可以指定某些参数控制程序的运行 (2)可让被调试的程序在用户所指定的断点处停住 (3)当程序停止时,检查程序的状态 (4)动态地改变程序的参数,可以避过bug,继续查找其他的问题,2.6 GDB调试器,gdb program也就是你的执行文件,一般在当前目录下,2.6 GDB调试器,Gd
38、b的命令可以使用help命令来查看,help命令只是列出gdb的命令种类。 可以使用help命令,显示class种类中的所有命令。 可以使用help命令,查看command命令的帮助。 Gdb中输入命令时,可以不用输入命令的全称,只用输入命令的前几个字符就可以。 在linux下,可以按两次TAB键来补齐命令的全称。 Gdb中运行Linux的shell程序,如shell 。,2.6 GDB调试器,3.3 GDB调试器,加载要调试的执行文件 file 加载要调试的执行程序exec。,2.6 GDB调试器,3.3 GDB调试器,查看源代码 list 显示程序第linenum行的周围的源程序 list
39、 显示函数名为function的函数周围的源程序 list 显示当前行后面的源程序 list - 显示当前行前面的源程序 set listsize n 设置一次显示源代码的行数 show listsize 查看当前listsize的设置,2.6 GDB调试器,设置断点(BreakPoint) break-进入指定函数时停住。 break-在指定行号停住,2.6 GDB调试器,清除断点 delete breakpoints range 删除指定的断点,breakpoints为断点号,range表示断点号的范围(如:2-4)。如果不指定断点号,则表示删除所有的断点。其简写命令为d。 比删除更好的一
40、种方法是disable断点,disable了断点,gdb不会删除,当还需要时,enable即可,就好像回收站一样。,2.6 GDB调试器,3.3 GDB调试器,设置观察点 观察点一般用来观察某个表达式的值是否变化了。 watch 为表达式(变量)expr设置一个观察点。一旦表达式值有变化时,马上停住。 info watchpoints 列出当前设置的所有观察点,2.6 GDB调试器,恢复程序运行和单步调试 run (r) 从程序开始运行程序 continue (c) 恢复程序运行,直到程序结束,或是下一个断点到来。 step (s) 单步执行,进入调用的函数的内部 next (n) 单步执行,
41、不会进入调用的函数内部 finish (f) 如果已进入了某函数,而想退出该函数返回到它的调用函数中,2.6 GDB调试器,查看运行时数据 print 查看当前程序的运行数据。为格式。,2.6 GDB调试器,退出GDB quit or q 退出 GDB,练习1(1) 键入vi,编辑一个新文件gexam.c。其内容如下: #vi gexam.c #include main() int a,i=0; a=0; while(i10) a=a+2; printf(the value of a=%d n,a); sleep(1); i=i+1; ,2.6 GDB调试器,练习1(2) 保存退出exam.c
42、 编译exam.c 。 #gcc -o examo exam.c # gcc - g -o gexam exam.c 比较gexam 与 examo的大小,因为 gexam含有调试信息,所以gexam比 examo大。 执行gexam与examo 执行examo # ./examo 。这里./表示当前目录 执行gexam # ./gexam。,2.6 GDB调试器,练习1(3) 使用gdb调试程序 (1)启动gdb程序 (gdb) gdb (2)读入调试程序 (gdb) file gexam (3)列出相应于正在执行的程序的原文件内容 (gdb) list (4)在程序a=0;处设置一个断点
43、(gdb) break 4(注:这里4 为程序a=0;所在程序的行号,若自己更改) (5)在程序printf(“the value of a=%d n”,a);处设置一个断点 (6)执行该程序 (gdb)run (7)查看变量a的值 (gdb) print a (8)查看变量a的类型(gdb) whatis a (9)执行下一个源程序行(gdb) next (10)从断点开始继续执行到下一个断点 (gdb) continue (11)查看变量a的值(gdb) print a ,看看a是否有变化 (12)不停地执行(gdb)continue,直到程序结束。 (13)退出(gdb) quit,2.
44、6 GDB调试器,练习2:程序功能为先显示一个字符串,再反序显示,使用GDB找出其中的错误并改正 #include void my_print(char *string) printf (The string is %sn, string); void my_print2 (char *string) char *string2; int size, i; size = strlen (string); string2 = (char *) malloc (size + 1); for (i = 0; i size; i+) string2size - i = stringi; string2
45、size+1 = 0; printf (The string printed backward is %sn, string2); ,2.6 GDB调试器,练习2:程序功能为先显示一个字符串,再反序显示,使用GDB找出其中的错误并改正 int main() char my_string = hello there; my_print (my_string); my_print2 (my_string); return; ,2.6 GDB调试器,第2章 嵌入式交叉编译环境,3.4 make工具的使用,Make工具及makefile文件概述 Makefile基本知识 Makefile应用 1)为单
46、个文件编写makefile 2)为多个文件编写makefile 3)使用不同目录的文件的makefile的写法,Make工具及makefile文件概述,GNU Make是程序自动维护工具 在大型的开发项目中,通常有几十到上百个的源文件,如果每次均手工键入 gcc 命令进行编译的话,则会 非常不方便。因此,人们通常利用 make 工具来自动完成编译工作。 这些工作包括: 1)如果仅修改了某几个 源文件,则只重新编译这几个源文件; 2)如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。,Makefile基本知识,基本makefile结构 Makefile由一系列规则组成,规则格式如下:
47、其中: target需要由 make 工具创建的项目,通常是目的文件和可执行文件。通常使用“目标(target)”一词来表示要创建的项目。 prerequisites 要创建的项目依赖于哪些文件。 command 创建每个项目时需要运行的命令。 注:命令前面需要敲入tab键,而不是空格!,target : prerequisites 依赖关系 command 命令,Make工具及makefile文件概述,Make及makefile原理 GNU make的主要工作是读进文本文件makefile。这些文件主要是有关那些文件(目的文件)是从哪些别的文件(依靠文件)中产生的,用什么命令来进行这个产生的
48、过程。 有了这些信息,make会检查磁盘上的文件,如果目的文件的时间比至少它的一个依靠文件旧,Make将执行相应的命令,以便更新目的文件。目的文件不一定是最后的可执行文件,它可以是任何一个文件。,Makefile基本知识,Makefile实例: makefile开始 myprog : foo.o bar.o gcc foo.o bar.o -o myprog foo.o : foo.c foo.h bar.h gcc -c foo.c -o foo.o bar.o : bar.c bar.h gcc -c bar.c -o bar.o clean: -rm *.o myprog makefil
49、e结束,Makefile基本知识,实例说明 从上面的例子注意到,第一个字符为 # 的行为注释行。 第一个非注释行指定 myprog为目标,并且依赖于 foo.o 和bar.o 文件。 foo.o 和bar.o文件又各自有自己的依赖规则 makefile中一般都有clean规则,在重新编译之前删除以前生成的各个文件,此条规则没有依赖文件 使用make工具的执行makefile的命令为: make或make makefile) 缺省文件名为当前目录下的makefile或Makefile或 GNUmakefile ,也可以使用命令行参数f指定文件名: 例如 make f filename,Makef
50、ile基本知识,实例说明 如果没有“-f”参数,在Linux中, GNU make 工具在当前工作目录中按照GNUmakefile、makefile、Makefile的顺序搜索 makefile文件。 通过命令行参数中的target ,可指定make要编译的目标,并且允许同时定义编译多个目标,操作时按照从左向右的顺序依次编译target选项中指定的目标文件。 如果命令行中没有指定目标,则系统默认target指向描述文件中第一个目标文件。 如 make make clean,Makefile基本知识,Makefile变量 环境变量: (1)存储文件名列表。 (2)存储可执行文件名。 (3)存储编
51、译器标识。 (4)存储参数列表。 比如我们利用makefile变量把上面的makefile文件重写一遍。,Makefile基本知识,Makefile变量 使用环境变量后的makefile实例 =makefile开始= OBJS=foo.o bar.o CC=gcc CFLAGS=-Wall O g EXEC=myprog $(EXEC):$(OBJS) $(CC) $(OBJS) o $(EXEC) foo.o:foo.c foo.h bar.h $(CC) $(CFLAGS) c foo.c o foo.o bar.o:bar.c bar.h $(CC) $(CFLAGS)bar.c o b
52、ar.o =makefile结束=,Makefile基本知识,Makefile变量 内部变量: $-扩展成当前规则的目的文件名 $ -扩展成依靠列表中的第一个依靠文件 $ -扩展成整个依靠的列表 利用这些变量,可以把上面的makefile写成:,Makefile基本知识,Makefile变量 =makefile开始= OBJS = foo.o bar.o CC = gcc CFLAG =-Wall O g myprog:$(OBJS) $(CC) $ -o $ foo.o:foo.c foo.h bar.h $(CC) $(CFLAG) c $ -o $ bar.o:bar.c bar.h $
53、(CC) $(CFLAG) c $ -o $ =makefile结束=,Makefile应用,为单个文件编写makefile 为多个文件编写makefile 使用不同目录的文件的makefile的写法 多个子模块的文件的makefile写法,Makefile应用,为单个文件编写makefile 编写hello.c程序 #include int main(void) printf(Hello world!n); return 0; ,Makefile应用,执行: $ vi Makefile =makefile开始= # This is a sample CC = gcc all:hello.o
54、$(CC) o hello hello.o hello.o:hello.c $(CC) c o hello.o hello.c clean: rm *.o hello =makefile结束=,Makefile应用,为多个文件编写makefile 有四个文件menu.c,music.c,picture.c,menu.h /*menu.c*/,#include #include“menu.h” int main(void) int choice; printf(-welcome you ! -n); printf( * 1 music! *n); printf( * 2 picture! *n)
55、; printf(-have a choice!-n); scanf(d,switch(choice) case 1: music(); break; case 2: picture(); break; printf(Good Bye!n); return 0; ,Makefile应用,为多个文件编写makefile /*music.c*/ #include #include void music(void) printf(Listen to music!n); ,Makefile应用,为多个文件编写makefile /*picture.c*/ #include void picture(vo
56、id) printf(Have a look at picture!n); ,Makefile应用,为多个文件编写makefile /* menu.h */ void music(void); void picture(void);,Makefile应用,为多个文件编写makefile 几个文件间的依赖关系,Makefile应用,上面程序的makefile: =makefile开始= CC=gcc all:menu.o music.o picture.o $(CC) menu.o music.o picture.o -o menu menu.o:menu.c menu.h $(CC) -c menu.c -o menu.o music.o:music.c $(CC) -
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 企业安全生产建设方案
- 康养中心消防设计方案
- 工矿废弃场地生态修复技术渠道发展展望梳理
- 2026中国消费级无人机空域管理政策与避障技术演进
- 2026中国消费级3D打印机市场教育阶段与增长拐点预测
- 2026中国消费电子产业创新方向与品牌全球化路径研究报告
- 2026中国海水淡化装备制造技术路线与经济性比较分析
- 2026中国汽车铝合金压铸件行业产能扩张与供需平衡预测
- 2026中国氢能源汽车产业化进程与关键技术投资价值报告
- 2026中国氢能储运技术突破与商业化应用前景研究
- 法学学历提升考试题目及答案
- 中国热射病诊断与治疗指南(2025版)解读
- 消化内科护理核心技能体系
- 2025年河北省中考物理试题(含答案解析)
- 2024年广州市海珠区凤阳街道招聘雇员真题
- 2025年安徽滁州市工安机动车辆技术检测有限公司招聘笔试参考题库含答案解析
- 批发药品管理法培训课件
- 电力线路迁改工程施工组织设计(完整常用版)
- HG∕T 2972-2017 工业用一甲胺
- 达拉特旗100万千瓦矿区光伏+储能项目环评报告书
- 冠心病中医治疗
评论
0/150
提交评论