Linux环境下的C语言编程第一部分:Linux下的C编程实战之开发平台搭建准备工作建议在PC内存足够大的情况下,不要直接安装Linux操作系统,最好把它安装在运行VMWare虚拟机软件的Windows平台上,如下图:1.Vim和Emacs编辑器在Linux平台下,可用任意一个文本编辑工具编辑源代码。Vim(viimprove)是Linux下功能强大的编辑器,是由UNIX系统下的传统文本编辑器vi发展而来,是vi的一个增强版本,有彩色和高亮等特性,对编程有很大帮助。主菜单-编程-viImproved命令来运行x-windows下的vim。Emacs即EditorMACroS(编辑器宏)的缩写,是一种强大的文本编辑器,在程序员和其他以技术工作为主的计算机用户中广受欢迎。使用vim编辑helloworld程序使用emacs编辑helloworld程序2.GCC编译器GCC是Linux平台下最重要的开发工具,它是GNU的C和C++编译器,其基本用法为:gcc[options][filenames]该命令按编译选项(参数options)指定的操作对给定的文件进行编译处理。编译一输出“HelloWorld”的程序:main(){printf(HelloWorld\n);}2.GCC编译器最简单的编译方法是不指定任何编译选项,它会为目标程序生成默认的文件名a.outgcchelloworld.co选项:编译来为将产生的可执行文件指定一个文件名。例如,将上述名为helloworld.c的C程序编译为名叫helloworld的可执行文件,输入如下命令:gcc-ohelloworldhelloworld.c2.GCC编译器-常用选项c选项:告诉GCC仅把源代码(.c文件)编译为目标代码(.o文件)而跳过汇编和连接的步骤;它能使编译多个C程序时的速度更快且容易管理。例如用户将已编辑好的test.c文件编译成名为test.o的目标文件。可以使用命令gcc-ctest.cs选项:告诉GCC在为C代码产生了汇编语言文件后停止编译。GCC产生的汇编语言文件的缺省扩展名是.s。将生成helloworld.c的汇编代码,使用的是AT&T汇编。用emacs打开汇编代码如下图。用emacs打开的Hello.c的汇编代码2.GCC编译器-常用选项E选项:指示编译器仅对输入文件进行预处理,但不汇编和连接O(-O1)选项:告诉GCC对源代码进行基本优化从而使得程序执行地更快;而-O2选项告诉GCC产生尽可能小和尽可能快的代码。使用-O2选项编译的速度比使用-O时慢,但产生的代码执行速度会更快。Wall选项:显示附加的警告信息。例如在上述程序中去掉return0;语句,之后重新编译gcc–Wall–ohellohello.c将得到的警告信息:hello.c:5:warning:controlreachesendofnon-voidfunction3.GDB调试器GCC用于编译程序,而Linux的另一个GNU工具gdb则用于调试程序。gdb是一个用来调试C和C++程序的强力调试器,通过它进行一系列调试工作。gdb主要提供一下功能:监视程序中变量的值得变化设置断点,使程序在指定的代码上暂停执行,便于观察单步执行代码分析崩溃程序产生的core文件3.GDB调试器★gdb最常用的命令如下file:装入想要调试的可执行文件。kill:终止正在调试的程序。list:列表显示源代码。next:执行一行源代码但不进入函数内部。step:执行一行源代码而且进入函数内部。run:执行当前被调试的程序quit:终止gdbwatch:监视一个变量的值break:在代码里设置断点,程序执行到这里时挂起3.GDB调试器举例说明怎样用GDB调试一个求0+1+2+3+…+99的程序:/*Filename:sum.c*/main(){inti,sum;sum=0;for(i=0;i100;i++){sum+=i;}printf(thesumof1+2+...+is%d,sum);}3.GDB调试器3.GDB调试器执行如下命令编译sum.c(加-g选项产生debug信息):gcc–g–osumsum.c在命令行上键入gdbsum并按回车键就可以开始调试sum了,再运行run命令执行sum,屏幕上将看到如下内容:3.GDB调试器list命令:list命令用于列出源代码,对上述程序运行list,将出现如下画面(源代码被标行号):3.GDB调试器根据列出的源程序,如果将断点设置在第4行,只需在gdb命令行提示符下键入如下命令设置断点:(gdb)break4Breakpoint1at0x8048338:filesum.cline4这时再run,程序会停止在第4行:Startingprogram:/root/sumBreakpoint1,main()atsum.cline44sum=03.GDB调试器设置断点的另一种语法是breakfunction,它在进入指定函数(function)时停住。相反的,clear用于清除所有的已定义的断点clearfunction清除设置在函数上的断点;clearlinenum则清除设置在指定行上的断点。3.GDB调试器watch命令:用于观查变量或表达式的值watch命令观查sum变量只需要运行:watchsumwatch命令观查表达式:watchexpr为表达式(变量)expr设置一个观察点,变量表达式值有变化时,程序会停止执行。要观查当前设置的watch,可以使用infowatchpoints命令。3.GDB调试器next、step命令:next、step用于单步执行,在执行的过程中,被watch变量的变化情况将实时呈现(分别显示Oldvalue和Newvalue),如下图:next、step命令的区别在于step遇到函数调用,会跳转到该函数定义的开始行去执行,而next则不进入到函数内部,它把函数调用语句当作一条普通语句执行。4.Make编译和连接的区别编译器使用源码文件来产生某种形式的目标文件,在编译过程中,外部的符号参考并没有被解释或替换(即外部全局变量和函数并没有被找到)。因此,在编译阶段所报的错误一般都是语法错误。连接器则用于连接目标文件和程序包,生成一个可执行程序。在连接阶段,一个目标文件中对别的文件中的符号的参考被解释,如果有符号不能找到,会报告连接错误。4.Make编译和连接的一般步骤是:第一阶段把源文件一个一个的编译成目标文件,第二阶段把所有的目标文件加上需要的程序包连接成一个可执行文件。这样的过程需要使用大量的gcc命令。而make则使从大量源文件的编译和连接工作中解放出来,综合为一步完成。4.MakeGNUMake的主要工作是读进一个文本文件,称为makefile。makefile文件记录了哪些文件(目的文件,目的文件不一定是最后的可执行程序,它可以是任何一种文件)由哪些文件(依靠文件)产生,用什么命令来产生。Make依靠此makefile中的信息检查磁盘上的文件,如果目的文件的创建或修改时间比它的一个依靠文件旧的话,make就执行相应的命令,以便更新目的文件。4.Makemakefile文件的编写makefile文件是一个文本文件,用于描述整个项目和各个文件之间的依赖关系。它由多个规则组成。makefile文件的规则遵循以下结构#remark注释行target:file1file2[…]二进制文件或者目标文件command1命令command2[…]4.Make例如:下面三个文件,add.h用于声明add函数,add.c提供两个整数相加的函数体,而main.c中调用add函数:/*filename:add.h*/externintadd(inti,intj);/*filename:add.c*/intadd(inti,intj){returni+j;}/*filename:main.c*/#includeadd.hmain(){inta,b;a=2;b=3;printf(thesumofa+bis%d,add(a+b));}怎样为上述三个文件产生makefile呢?4.Make为上述三个文件产生makefile的方法如下:test:main.oadd.ogccmain.oadd.o-otestmain.o:main.cadd.hgcc-cmain.c-omain.oadd.o:add.cadd.hgcc-cadd.c-oadd.o4.Make上述makefile文件的含义利用add.c和add.h文件执行gcc-cadd.c-oadd.o命令产生add.o目标代码。利用main.c和add.h文件执行gcc-cmain.c-omain.o命令产生main.o目标代码。最后利用main.o和add.o文件(两个模块的目标代码)执行gccmain.oadd.o-otest命令产生可执行文件test。可以使用gcc-MMmain.c自动寻找源文件中的头文件,并形成依赖关系。输出为:main.omain.cadd.h4.Make可在makefile中加入变量。另外,环境变量在make过程中也被解释成make的变量。这些变量是大小写敏感的,一般使用大写字母。要定义一个变量,只需要在一行的开始写下这个变量的名字,后面跟一个=号,再跟变量的值。引用变量的方法是写一个$符号,后面跟(变量名)。4.Make把前面的makefile利用变量重写一遍(并假设使用-Wall-O–g编译选项):OBJS=main.oadd.oCC=gccCFLAGS=-Wall-O-gtest:$(OBJS)$(CC)$(OBJS)-otestmain.o:main.cadd.h$(CC)$(CFLAGS)-cmain.c-omain.oadd.o:add.cadd.h$(CC)$(CFLAGS)-cadd.c-oadd.o4.Makemakefile中还可定义清除(clean)目标,可用来清除编译过程中产生的中间文件,例如在上述makefile文件中添加下列代码:clean:rm-f*.o运行makeclean时,将执行rm-f*.o命令,删除所有编译过程中产生的中间文件。4.MakeMake的运行GUNmake默认在当前的目录下一次查找GUNmake文件,Makefile文件和makefile文件,找到后读取文件执行。给make命令指定一个特殊名字的makefile文件make–fhchen.mk4.Make自己动手编写makefile仍然是很复杂和烦琐的,而且很容易出错。因此,GNU也提供了Automake和Autoconf来辅助快速自动产生makefile。4.Make使用autoconf和automake来进行自动化配置和生成Makefile的流程可以概括如下:运行autoscan命令。将configure.scan文件重命名为configure.in,并修改configure.in文件。运行aclocal命令得到aclocal.m4文件。运行autoconf命令得到configure文件。在工程目录下新建Makefile.am文件,如果存在子目录,子目录中也要创建此文件。将/usr/share/automake-1.X/目录下的depcomp和compile文件复制到需要处理目录下。运行automake-a命令得到Makefile.in文件。运行./configure脚本4.Make从例子程序helloworld开始。过程如下:新建三个文件:helloworld.cconfigure.inMakefile.am然后执行aclocal;autoconf;automake--add-missing;./configure;make;./