




已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Linux下C编程基础 1 1源代码编辑器VI的使用 原则上任何文本编辑器均可以编写C语言源代码 但在Linux下我还是推荐使用Vi进行源代码的编写 虽然对于初学者可能稍微有些困难 但是熟练掌握Vi的使用对于Linux用户来讲非常重要 任何一台安装了Linux的计算机都会提供Vi软件 Vi有三种操作状态 命令模式 插入模式和末行命令模式 它们间的切换方式如图 快速入门 下面首先通过一个非常简单的例子让大家对Vi的使用有个大体的认识 本例子是编写一个C语言源文件HelloWorld c 1 在提示符启动Vi 编辑HelloWorld c文件 ViHelloWorld c2 接着进入Vi命令模式的主界面 此时按A键进入插入模式 注意界面最左下面一行的提示信息变成了 插入 3 接下来输入我们的源代码 方法和任何文本编辑器一样 编辑好的HelloWorld c 可以发现Vi自动将一些关键字涂上了不同的颜色 4 编辑好源文件后 就需要保存它 首先按Esc键 从插入模式退回命令模式 接着按 键进入末行模式 此时输入wq并按回车 则存盘并保存 Vi的常用命令 命令模式 插入模式的常用命令 末行命令模式的常用命令 C语言编译器gcc的使用 Linux系统上运行的GNUC编译器 GCC 是一个全功能的ANSIC兼容编译器 虽然GCC没有集成的开发环境 但堪称是目前效率很高的C C 编译器使用gcc通常后跟一些选项和文件名来使用GCC编译器 gcc命令的基本用法如下 gcc options filenames 命令行选项指定的操作将在命令行上每个给出的文件上执行 下面举个简单的例子 编译我们上一节编写的HelloWorld c源文件 intmain intargc char argv printf HelloLinux n gcc oHelloWorldHelloWorld c此时会在原目录下看到生成了可执行文件HelloWorld 要看到程序输出结果 则只要输入 HelloWorld即可 头文件和系统求助 有时候我们只知道一个函数的大概形式 不记得确切的表达式 或者是不记得着函数在那个头文件进行了说明 这个时候我们可以求助系统 比如说我们想知道fread这个函数的确切形式 我们只要执行manfread系统就会输出着函数的详细解释的 和这个函数所在的头文件说明了 如果我们要write这个函数的说明 当我们执行manwrite时 输出的结果却不是我们所需要的 因为我们要的是write这个函数的说明 可是出来的却是write这个命令的说明 为了得到write的函数说明我们要用man2write 2表示我们用的write这个函数是系统调用函数 还有一个我们常用的是3表示函数是C的库函数 记住不管什么时候 man都是我们的最好助手 gcc选项 当你不用任何选项编译一个程序时 GCC将会建立 假定编译成功 一个名为a out的可执行文件 例如 下面的命令将在当前目录下产生一个叫a out的文件 gcctest c你能用 o编译选项来为将产生的可执行文件指定一个文件名来代替a out 例如 将一个叫count c的C程序编译为名叫count的可执行文件 你将输入下面的命令 gcc ocountcount c 常用选项含义 cGCC仅把源文件编译为目标代码 static链接静态库 即执行静态链接 OGCC对源代码进行基本优化 这些优化在大多数情况下都会使程序执行得更快 On指定代码优化的级别为n n为 0 1 2 3 中的一个 如 O2选项告诉GCC产生尽可能小和尽可能快的代码 g在可执行程序中包含标准调试信息 pedantic允许发出ANSI ISOC标准所列出的所有警告 wall允许发出GCC所提供的所有有用的警告 MM输出一个make兼容的相关列表 v显示编译过程中的每一步用到的命令 L指定所用函数库的路径 如果我们所用到的函数库是系统默认的函数库 则不需要指定路径系统的默认的三个函数库是 lib usr lib usr local lib 如果我们使用的函数不在这默认库中 就要用到 L选项了 例如 gcc omytestmytest c L home zsb lib makefile文件的编写 为什么要编写makefile文件make是所有想在Linux系统上编程的用户必须掌握的工具 如果你写的程序中没有用到make 则说明你写的程序只是个人的练习程序 不具有任何实用的价值 make实在是应该用在任何稍具规模的程序中的 下面就举个简单的例子来说明原因 假设我们有下面这样的一个程序 源代码如下 main c include mytool1 h include mytool2 h voidmain mytool1 print hello mytool2 print hello mytool1 h ifndef MYTOOL 1 H define MYTOOL 1 Hvoidmytool1 print char print str endif mytool1 c include mytool1 h voidmytool1 print char print str printf Thisismytool1print s n print str mytool2 h ifndef MYTOOL 2 H define MYTOOL 2 Hvoidmytool2 print char print str endif mytool2 c include mytool2 h voidmytool2 print char print str printf Thisismytool2print s n print str 当然由于这个程序是很短的我们可以这样来编译gcc cmain cgcc cmytool1 cgcc cmytool2 cgcc omainmain omytool1 omytool2 o 这样的话我们也可以产生main程序 而且也不是很麻烦 但是如果我们考虑一下如果有一天我们修改了其中的一个文件 比如说mytool1 c 那么我们难道还要重新输入上面的命令 也许你会说 这个很容易解决啊 我写一个SHELL脚本 让她帮我去完成不就可以了 是的对于这个程序来说 是可以起到作用的 但是当我们把事情想的更复杂一点 如果我们的程序有几百个源程序的时候 难道也要编译器重新一个一个的去编译 为此 聪明的程序员们想出了一个很好的工具来做这件事情 这就是make 我们只要执行一下make 就可以把上面的问题解决掉 在我们执行make之前 我们要先编写一个非常重要的文件 Makefile 对于上面的那个程序来说 可能的一个Makefile的文件是 这是上面那个程序的Makefile文件main main omytool1 omytool2 ogcc omainmain omytool1 omytool2 omain o main cmytool1 hmytool2 hgcc cmain cmytool1 o mytool1 cmytool1 hgcc cmytool1 cmytool2 o mytool2 cmytool2 hgcc cmytool2 c 有了这个Makefile文件 不过我们什么时候修改了源程序当中的什么文件 我们只要执行make命令 我们的编译器都只会去编译和我们修改的文件有关的文件 其它的文件她连理都不想去理的 makefile的基本规则 既然makefile文件这么重要 那么就让我们一步步来学习makefile的一些知识首先我们看一下makefile文件的结构 makefile文件里主要是有关哪些文件 target 目的文件 是从哪些别的文件 dependencies 依靠文件 中产生的 用什么命令来进行这个产生过程 有了这些信息 make会检查硬盘上的文件 如果目的文件的时间戳 该文件生成或被改动时的时间 比至少它的一个依靠文件旧的话 make就执行相应的命令 以便更新目的文件 目的文件不一定是最后的可执行档 它可以是任何一个文件 makefile一般被叫做 makefile 或 Makefile 当然你可以在make的命令行指定别的文件名 如果你不特别指定 它会寻找makefile 或 Makefile 因此使用这两个名字是最简单的 在Makefile中也 开始的行都是注释行 Makefile中最重要的是描述文件的依赖关系的说明 一般的格式是 target componentsTABrule 第一行表示的是依赖关系 第二行是规则 比如说我们上面的那个Makefile文件的第二行main main omytool1 omytool2 o表示我们的目标 target main的依赖对象 components 是main omytool1 omytool2 o当倚赖的对象在目标修改后修改的话 就要去执行规则一行所指定的命令 就象我们的上面那个Makefile第三行所说的一样要执行gcc omainmain omytool1 omytool2 o注意规则一行中的TAB表示那里是一个TAB键 若缺少系统则会提示错误 missingseparator stop 这是许多初学者容易忽略的地方 要注意 makefile变量 上面提到makefiles里主要包含一些规则 它们包含的其它的东西是变量定义 makefile里的变量就像一个环境变量 environmentvariable 事实上 环境变量在make过程中被解释成make的变量 这些变量是大小写敏感的 一般使用大写字母 它们可以从几乎任何地方被引用 也可以被用来做很多事情 比如 1 贮存一个文件名列表 在上面的例子里 生成可执行文件的规则包含一些目标文件名做为依靠 在这个规则的命令行里同样的那些文件被输送给gcc做为命令参数 如果在这里使用一个变数来贮存所有的目标文件名 加入新的目标文件会变的简单而且较不易出错2 贮存可执行文件名 如果你的项目被用在一个非gcc的系统里 或者如果你想使用一个不同的编译器 你必须将所有使用编译器的地方改成用新的编译器名 但是如果使用一个变量来代替编译器名 那么你只需要改变一个地方 其它所有地方的命令名就都改变了 3 贮存编译器旗标 假设你想给你所有的编译命令传递一组相同的选项 例如 Wall O g 如果你把这组选项存入一个变量 那么你可以把这个变量放在所有呼叫编译器的地方 而当你要改变选项的时候 你只需在一个地方改变这个变量的内容 要设定一个变量 你只要在一行的开始写下这个变量的名字 后面跟一个 号 后面跟你要设定的这个变量的值 以后你要引用这个变量 写一个 符号 后面是围在括号里的变量名 下面举一个简单的例子 其作用和gcc Wall O gtesttest c是一样的 CFLAGS Wall O g gcc CFLAGS testtest c Make
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论