版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Linux 下C 编程基础,1.1 源代码编辑器VI 的使用,原则上任何文本编辑器均可以编写C 语言源代码,但在Linux 下我还是推荐 使用Vi 进行源代码的编写。虽然对于初学者可能稍微有些困难,但是熟练掌握 Vi 的使用对于Linux 用户来讲非常重要。 任何一台安装了Linux 的计算机都会提供Vi 软件,Vi 有三种操作状态:命令模式、插入模式和末行命令模式,它们间的切换方式如图:,快速入门,下面首先通过一个非常简单的例子让大家对Vi 的使用有个大体的认识。本例子是编写一个C 语言源文件HelloWorld.c。 1:在提示符启动Vi,编辑HelloWorld.c 文件:Vi Hell
2、oWorld.c 2:接着进入Vi 命令模式的主界面,此时按A 键进入插入模式,注意界面最左下面一行的提示信息变成了插入 3:接下来输入我们的源代码,方法和任何文本编辑器一样, 编辑好的HelloWorld.c,可以发现Vi 自动将一些关键字涂上了不同的颜色。 4:编辑好源文件后,就需要保存它。首先按Esc 键,从插入模式退回命令模式, 接着按 :键进入末行模式,此时输入wq 并按回车,则存盘并保存。,Vi 的常用命令(命令模式),插入模式的常用命令,末行命令模式的常用命令,C 语言编译器gcc 的使用,Linux 系统上运行的GNU C 编译器(GCC)是一个全功能的ANSI C 兼容编译器
3、,虽然GCC 没有集成的开发环境,但堪称是目前效率很高的C/C+编译器 使用 gcc 通常后跟一些选项和文件名来使用 GCC 编译器. gcc 命令的基本用法如下: gcc options filenames 命令行选项指定的操作将在命令行上每个给出的文件上执行,下面举个简单的例子,编译我们上一节编写的HelloWorld.c 源文件: intmain(intargc,char*argv)printf(HelloLinuxn); gcc o HelloWorld HelloWorld.c 此时会在原目录下看到生成了可执行文件HelloWorld,要看到程序输出结果,则只要输入./HelloWo
4、rld 即可。,头文件和系统求助,有时候我们只知道一个函数的大概形式,不记得确切的表达式,或者是不记得着函数在那个头文件进行了说明.这个时候我们可以求助系统.比如说我们想知道fread这个函数的确切形式,我们只要执行manfread系统就会输出着函数的详细解释的.和这个函数所在的头文件说明了.如果我们要write这个函数的说明,当我们执行manwrite时,输出的结果却不是我们所需要的.因为我们要的是write这个函数的说明,可是出来的却是write这个命令的说明.为了得到write的函数说明我们要用man2write.2表示我们用的write这个函数是系统调用函数,还有一个我们常用的是3表示
5、函数是C的库函数.记住不管什么时候,man都是我们的最好助手.,gcc 选项,当你不用任何选项编译一个程序时, GCC 将会建立(假定编译成功)一个名为 a.out 的可执行文件. 例如, 下面的命令将在当前目录下产生一个叫 a.out的文件: gcc test.c 你能用 -o 编译选项来为将产生的可执行文件指定一个文件名来代替a.out. 例如, 将一个叫 count.c 的 C 程序编译为名叫 count 的可执行文件, 你将输入下面的命令: gcc -o count count.c/其中count为文件count.c编译成功后可执行文件的名字,常用选项含义,-c GCC 仅把源文件编译
6、为目标代码。 -static 链接静态库,即执行静态链接。 -O GCC 对源代码进行基本优化。这些优化在大多数情况下都会使程序执行得更快。 -On 指定代码优化的级别为n,n 为0,1,2,3中的一个。如-O2 选项告诉GCC 产生尽可能小和尽可能快的代码。 -g 在可执行程序中包含标准调试信息。 -pedantic 允许发出ANSI/ISO C 标准所列出的所有警告。 -wall 允许发出GCC 所提供的所有有用的警告。 -MM 输出一个make 兼容的相关列表。 -v 显示编译过程中的每一步用到的命令。 -L 指定所用函数库的路径。如果我们所用到的函数库是系统默认的函数库, 则不需要指定
7、路径系统的默认的三个函数库是/lib ; /usr/lib ; /usr/local/lib。如果我们使用的函数不在这默认库中,就要用到-L 选项了。 例如: #gcc o mytest mytest.c L /home/zsb/lib,makefile 文件的编写,为什么要编写makefile 文件 make 是所有想在Linux 系统上编程的用户必须掌握的工具。如果你写的程序中没有用到make ,则说明你写的程序只是个人的练习程序,不具有任何实用的价值”。 make 实在是应该用在任何稍具规模的程序中的。下面就举个简单的例子来说明原因。 假设我们有下面这样的一个程序,源代码如下,/*mai
8、n.c*/ #include mytool1.h #include mytool2.h void main() mytool1_print(hello); mytool2_print(hello); /* mytool1.h */ #ifndef _MYTOOL_1_H #define _MYTOOL_1_H void mytool1_print(char *print_str); #endif,/*mytool1.c*/ #include mytool1.h void mytool1_print(char *print_str) printf(This is mytool1 print %s
9、n,print_str); /* mytool2.h */ #ifndef _MYTOOL_2_H #define _MYTOOL_2_H void mytool2_print(char *print_str); #endif /*mytool2.c*/ #include mytool2.h void mytool2_print(char *print_str) printf(This is mytool2 print %sn,print_str); ,当然由于这个程序是很短的我们可以这样来编译 gcc -c main.c gcc -c mytool1.c gcc -c mytool2.c g
10、cc -o main main.o mytool1.o mytool2.o,这样的话我们也可以产生main 程序,而且也不是很麻烦.但是如果我们考虑一下如果有一天我们修改了其中的一个文件(比如说mytool1.c)那么我们难道还要重新输入上面的命令?也许你会说,这个很容易解决啊,我写一个SHELL 脚本,让她帮我去完成不就可以了.是的对于这个程序来说,是可以起到作用的.但是当我们把事情想的更复杂一点,如果我们的程序有几百个源程序的时候,难道 也要编译器重新一个一个的去编译?,为此,聪明的程序员们想出了一个很好的工具来做这件事情,这就是make. 我们只要执行一下make,就可以把上面的问题解决
11、掉.在我们执行make 之前,我们要先编写一个非常重要的文件.-Makefile.对于上面的那个程序来说,可能的一个Makefile 的文件是:,# 这是上面那个程序的Makefile 文件 main:main.o mytool1.o mytool2.o gcc -o main main.o mytool1.o mytool2.o main.o:main.c mytool1.h mytool2.h gcc -c main.c mytool1.o:mytool1.c mytool1.h gcc -c mytool1.c mytool2.o:mytool2.c mytool2.h gcc -c m
12、ytool2.c,有了这个Makefile 文件,不过我们什么时候修改了源程序当中的什么文件,我们只要执行make 命令,我们的编译器都只会去编译和我们修改的文件有关的文件,其它的文件她连理都不想去理的。,makefile 的基本规则,既然makefile 文件这么重要,那么就让我们一步步来学习makefile 的一些知识首先我们看一下makefile 文件的结构。 makefile 文件里主要是有关哪些文件(target目的文件)是从哪些别的 文件(dependencies依靠文件)中产生的,用什么命令来进行这个产生过程。 有了这些信息,make 会检查硬盘上的文件,如果目的文件的时间戳(该
13、文件生成或被改动时的时间)比至少它的一 个依靠文件旧的话, make 就执行相应的命令,以便更新目的文件。(目的文件不一定是最后的可执行档,它可以是任何一个文件),makefile 一般被叫做“makefile”或“Makefile”。当然你可以在 make的命令行指定别的文件名。如果你不特别指定,它会寻找makefile”或“Makefile”,因此使用这两个名字是最简单的。 在Makefile 中也#开始的行都是注释行。Makefile 中最重要的是描述文件的依赖关系的说明。一般的格式是: target: components TAB rule,第一行表示的是依赖关系。 第二行是规则.比如
14、说我们上面的那个Makefile文件的第二行 main:main.o mytool1.o mytool2.o 表示我们的目标(target)main的依赖对象(components)是main.o mytool1.o mytool2.o 当倚赖的对象在目标修改后修改的话,就要去执行规则一行所 指定的命令.就象我们的上面那个Makefile 第三行所说的一样要执行 gcc -o main main.o mytool1.o mytool2.o 注意规则一行中的TAB 表示那里是一个TAB 键,若缺少系统则会提示错误“*missing separator.stop”,这是许多初学者容易忽略的地方,要
15、注意!,makefile 变量,上面提到 makefiles 里主要包含一些规则。它们包含的其它的东 西是变量定义。 makefile 里的变量就像一个环境变量(environment variable)。 事实上,环境变量在 make 过程中被解释成 make 的变量。这些 变量是大小写敏感的,一般使用大写字母。它们可以从几乎任何 地方被引用,也可以被用来做很多事情,比如:,1.贮存一个文件名列表。在上面的例子里,生成可执行文件的 规则包含一些目标文件名做为依靠。在这个规则的命令行 里同样的那些文件被输送给 gcc做为命令参数。如果在这 里使用一个变数来贮存所有的目标文件名,加入新的目标 文
16、件会变的简单而且较不易出错 2.贮存可执行文件名。如果你的项目被用在一个非 gcc 的系统里,或者如果你想使用一个不同的编译器,你必须将所有使用编译器的地方改成用新的编译器名。但是如果使用一个变量来代替编译器名,那么你只需要改变一个地方,其它所有地方的命令名就都改变了。 3.贮存编译器旗标。假设你想给你所有的编译命令传递一组相同的选项(例如 -Wall -O -g);如果你把这组选项存 入一个变量,那么你可以把这个变量放在所有呼叫编译器 的地方。而当你要改变选项的时候,你只需在一个地方改变这个变量的内容。,要设定一个变量,你只要在一行的开始写下这个变量的名字,后 面跟一个 =号,后面跟你要设定的这个变量的值。以后你要引用这个变量,写一个 $ 符号,后面是围在括号里的变量名。下面举一个简单的例子,其作用和 gcc Wall O g test test.c 是一样的: CFLAGS = -Wall -O g gcc $(CFLAGS) test test.c ,Makefile 有三个非常有用的变量.分别是$,$,$
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 和泰人寿保险产品设计与市场推广计划
- 人工智能领域求职者的自我准备策略
- 农业种植基地田间管理主任的种植计划
- 汽车制造企业安全风险控制经理工作计划
- 多级库存管理与运输协调方案
- 市场调研技能培训教程与资源
- 汽车行业投行项目经理面试要点
- 客户经理绩效管理体系设计
- 三年(2023-2025)湖南中考语文真题分类汇编:专题08 名著阅读(原卷版)
- 酒店业管理人员能力要求手册
- 生命与安全六下课件
- 2025年特种设备检验人员资格考试(电梯检验师DTS)综合试题及答案
- DB34∕T 3680-2020 地理标志产品 龙池香尖(龙池尖茶)
- 湖南省长沙市长沙县2025-2026学年七年级上学期期中英语试卷(含答案)
- DB52∕T 1848-2024 鲜食玉米两季连作技术规程
- 设备安装调试操作安全规范手册
- 《新能源汽车构造与故障检修》实训工单
- 【低空经济】低空经济职业学院建设方案
- T-CFIA 003-2021 T-CISA 113-2021 铁合金、电解金属锰企业规范条件
- (正式版)DB54∕T 0275-2023 《民用建筑节能技术标准》
- 门诊诊疗规范
评论
0/150
提交评论