《全套课件老邝版Linux第9讲》由会员分享,可在线阅读,更多相关《全套课件老邝版Linux第9讲(34页珍藏版)》请在金锄头文库上搜索。
1、Linux 系统应用与程序设计,主讲:邝颖杰 电邮:,C语言的标准,ANSI C POSIX SVID XPG GNU C,C语言开发环境简介,简单的程序编辑器是vi/vim、gedit和emacs,其中vim是vi的升级版 高级的IDE集成开发环境则有Eclipse CDT、Source Insight和KDevelop等,C头文件和C函数库,用C语言进行程序设计时,我们要用到头文件来提供对常量的定义和对系统及库函数调用的声明。 库是一组预先编译好的函数的集合,这些函数都是按照可重用的原则编写的。,gcc简介,名称: GNU project C and C+ Compiler GNU Com
2、piler Collection 管理与维护 GNU项目 对C/C+编译的控制 预处理(Preprocessing) 编译(Compilation) 汇编(Assembly) 链接(Linking ),GCC文件扩展名规范,(1).c为后缀的文件,是C语言源代码文件。 (2).h为后缀的文件,是头文件。 (3).C,.cc、.cpp、.cp或.cxx为后缀的文件,是C+源代码文件。 (4).h为后缀的文件,是程序所包含的头文件。 (5).i为后缀的文件,是已经预处理过的C源代码文件。 (6).ii为后缀的文件,是已经预处理过的C+源代码文件。 (7).m为后缀的文件,是Objective-C源
3、代码文件。 (8).o为后缀的文件,是编译后的目标文件。 (9).s为后缀的文件,是汇编语言源代码文件。 (10).S为后缀的文件,是经过预编译的汇编语言源代码文件。,gcc的使用,基本使用格式 $ gcc 选项 常用选项及含义,gcc的常用选项,gcc的常用选项,使用gcc编译代码,示例源程序hello.c #include int main() printf(“hello world!rn“); return 0; ,生成预处理文件,命令 $gcc E hello.c o hello.i,预处理文件hello.i的部分内容 extern void funlockfile(FILE *_st
4、ream) _attribute_(_nothrow_); # 844 “/usr/include/stdio.h“ 3 4 # 2 “hello.c“ 2 int main() printf(“hello world!n“); ,生成汇编文件,命令 $gcc S hello.c o hello.s,汇编文件hello.s的部分内容 main: leal 4(%esp), %ecx andl $-16, %esp pushl -4(%ecx) pushl %ebp movl %esp, %ebp pushl %ecx subl $4, %esp movl $.LC0,(%esp) call p
5、uts addl $4, %esp popl %ecx popl %ebp leal -4(%ecx), %esp ret,生成对应的目标文件,gcc -c hello.c -o hello.o 目标代码并不能在CPU上运行,但它离二进制可执行文件已经很近了,再输入以下编译指令即可生成二进制可执行文件。 rootlocalhost# gcc hello.o -o hello,编译多个文件,对于多文件组成的项目,采用GCC编译有两种方案:一步编译和分步编译 采用一步编译 : gcc hello.c say_hello.c -o hello 分步编译的方案 : 思路: 编译每一个.c文件,得到.o
6、的目标文件; 将每一个.o的目标文件链接成一个可执行的文件; gcc -c say_hello.c -o say_hello.o gcc hello.o say_hello.o -o hello,上例的项目目录结构调整如下:,文件hello.c引用的头文件say_hello.h不在当前目录中,也不在GCC默认的头文件搜索路径/usr/include中,这时我们应该使用-I选项指定搜索头文件的特殊目录,具体编译指令如下: gcc hello.c functions/say_hello.c -o hello-Ifunctions,C程序调试,静态调试 用在程序编译阶段查错并修正错误,它主要利用GC
7、C编译器对语法错误的检查进行排错。 动态调试 用在程序运行阶段的错误检查与修正,适用于检查算法的错误、输入输出的错误等。,gdb(GNU DeBugger) 调试工具,为了使gdb正常工作,必须使用-g选项编译源文件,使程序在编译时包含调试信息。 进入gdb环境 rootlocalhost# gdb GNU gdb Red Hat Linux(6.5-25.el5rh) Copyright(C) 2006 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License,
8、 and you are welcome 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 details. This GDB was configured as “i386-redhat-linux-gnu“. (gdb),动态调试举例,常见的动态调试方法: 增加调试语句 ; 记录程序的执
9、行状况 ; 观察内存变化 ; 使用调试工具; GUN Debuger的功能: 启动程序,设置程序执行的上下文环境; 在指定的条件下停止程序; 程序停止时,检查程序的状态; 在程序运行时,改变程序状态,使其按照改变后的状态继续执行。,动态调试举例,创建与使用库函数,静态函数库 这类库的名字一般是libxxx.a 动态函数库 这类库的名字一般是libxxx.so 相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。,使用GCC编译器可以将库与自己开发的程序链接起来,例如libc.so中包含了标准的
10、输入输出函数,当链接程序进行目标代码链接时会自动搜索该程序并将其链接到可执行文件中。,静态函数库创建与使用 编译.c文件生成.o目标文件。 gcc -c pr1.c pr2.c ls -l pr*.o -rw-r-r- 1 root root 864 07-04 05:31 pr1.o -rw-r-r- 1 root root 864 07-04 05:31 pr2.o,链接静态库 ar -rsv libpr.a pr1.o pr2.o ar: creating libpr.a a - pr1.o a - pr2.o ls -l libpr.a -rw-r-r- 1 root root 194
11、2 07-04 05:40 libpr.a,加载库文件编译main.c gcc -o main main.c -L./ -lpr ls -l main -rwxr-xr-x 1 root root 4998 07-04 05:48 main ./main this is the first lib src! this is the second lib src!,动态函数库创建与使用,生成动态库 gcc -fpic -shared -o libpr.so pr1.c pr2.c ls -l libpr.so -rwxr-xr-x 1 root root 4326 07-04 05:53 lib
12、pr.so 隐式调用动态库 gcc -o main_so main.c ./libpr.so ls -l main_so -rwxr-xr-x 1 root root 4994 07-04 05:54 main_so ./main_so this is the first lib src! this is the second lib src!,显式调用动态库 export LD_LIBRARY_PATH=$(pwd) gcc -o main_so_2 main.c -L. -lpr ./main_so_2 this is the first lib src! this is the seco
13、nd lib src!,使用make工具,适用场合: 多个文件组成的软件项目 基本格式: 目标:欲生成的目标文件 依赖项:生成目标需要的文件 原理: 判断依赖项是否为最新,否则,生成新的目标 make工具的使用格式: make 命令选项 命令参数 通常使用make就可以了,make会寻找Makefile作为编译指导文件;,目标:依赖项列表 (Tab缩进)命令,表9-2程序清单的makefile文件,1 hello:hello.o say_hello.o 2 gcc hello.o say_hello.o -o hello 3 say_hello.o:say_hello.c say_hello.
14、h 4 gcc -c say_hello.c -o say_hello.o 5 hello.o:hello.c say_hello.h 6 gcc -c hello.c -o hello.o,makefile文件中还可以定义一些宏,宏的作用类似于C语言中的define命令,利用它们来代表某些多处使用而又可能发生变化的内容,可以节省重复修改的工作,还可以避免遗漏,1 CC=gcc 2 CFLAGS=-Wall-c 3 OBJS= hello.o say_hello.o 4 hello:$OBJS 5 $CC $OBJS -o hello 6 say_hello.o:say_hello.c say_hello.h 7 $CC $CFLAGS say_hello.c -o say_hello.o 8 hello.o:hello.c say_hello.h 9 $CC $CFLAGS hello.c -o hello.o,