Linux下c语言开发环境
一、编辑器vi
Vi是Linux系统中一种文本编辑器,它的使用方法和界面与Unix平台十分相似。掌握了vi的命令,你可以感觉到它强大的功能与高效
vi相对来说比较小,无论你使用任何Linux系统,你总是可以使用vi的。在很多系统中,可能只有vi供你选择
vim 是vi的高级版本,兼容vi,功能更强大
如下为vi的标准编程,输出结果为1-10.
#include <stdio.h>
#define MAX 10
int main()
{
int i;
for(i = 0; i < MAX;i++)
printf("%d ",i);
printf("");
return 0;
}
编辑器vi有三种模式:命令行模式、底行模式、插入模式。
命令行模式是进入时默认的模式,能 控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入输入模式。
以下为命令行模式的命令:
1、开始编辑命令
i 在光标前输入文本
I 在当前行开始输入文本
a 在光标后输入文本
A 在当前行末尾输入文本
o 在当前行后输入新一行
O 在当前行前输入新一行
2、光标移动命令
b 移动到当前单词的开始
e 移动到当前单词的结尾
w 向后移动一个单词
h 向前移动一个字符 ←
j 向下移动一行 ↓
k 向上移动一行 ↑
l 向后移动一个字符 →
3、删除命令
x 删除光标所在的字符
dw 删除光标所在的单词
d$ 删除光标至行尾所有字符
D 同 <d$>
dd 删除当前行
ndd 删除当前行以后的n行
4、改变与替换操作命令
r 替换光标所在的字符
R 替换字符序列
cw 替换一个单词
ce 同cw
c$ 替换自光标位置至行尾的所有字符
C 同c$
cc 替换当前行
5、拷贝与粘贴命令
yw 将光标所在单词复制到粘贴板
y$ 将光标至行尾的字符复制到粘贴板
Y 同y$
yy 将当前行复制到粘贴板
nyy 将当前行后的n行复制到粘贴板
P 将粘贴板中的内容粘贴在光标前
p 将粘贴板中的内容粘贴在光标后
6、其他有用的命令
nG 跳到第n行
u 撤销
. 重做
配对括号的查找:
用法:将光标移动到一个括号上,按下%,光标跳转到其配对的括号上
{}、()
页面操作:
ctrl + b #向前移动一页
ctrl + f #向后移动一页
zz #将当前行置于屏幕中央
gg #移动到第一行行首
G #移动到最后一行行首
数字 + 命令:
nG #跳到第n行
nx #删除n个字符
ndd #删除当前行以后的n行
nyy #将当前行后的n行复制到粘贴板
n+ #向后跳转n行
n- #向前跳转n行
n↑↓←→ #向上下左右跳转n次
二、编译器gcc
gcc(GNU CCompiler)是GNU推出的功能强大、性能优越的多平台编译器,gcc编译器能将c、c++语言源程序编译、链接成可执行文件。
gcc定义:gcc(GNU CCompiler)是GNU才推出的功能强大、性能优越的多平台编译器,gcc编译器能将c、c++语言源程序编译、链接成可执行文件,以下是gcc支持编译的一些源文件的后缀及其解释
.c为后缀的文件,c语言源代码文件;
.h为后缀的文件,是程序包含的头文件;
.i为后缀的文件,是已经预处理过的c源代码文件;
.s为后缀的文件,是汇编语言源代码文件
.o为后缀的文件,是编译后的目标二进制文件;
gcc的编译过程有预处理,编译,汇编,链接组成。
预处理将根据以字符#开头的命令,修改原始c程序,生成.i的文件
过程为gcc -E 1.c -o 1.i
编译器(ccl)将文本文件 hello.i 翻译成文本文件 hello.s ,它包含一个汇编语言程序。
过程为gcc -S 1.i -o 1.s
汇编器(as)将hello.s翻译成机器语言指令,把这些指令打包成为一种叫做可重定位目标程序的格式,并将结果保存在目标文件hello.o中。
过程为gcc -c 1.s -o 1.o
链接器(ld)就负责这种并入,结果就得到hello文件,它是一个可执行目标文件(或者简称为可执行文件)。可执行文件加载到存储器后,由系统负责执行。
过程为gcc 1.o -o 1
其他注意事项
(1)gcc example.c -o example #直接生成可执行文件
(2)./example #运行可执行文件
(3)若不使用 -o 则生成可执行文件 a.out
(4)Linux头文件默认放在/usr/include中
三、调试器
GDB(GNU Debugger)是由GNU计划完成的、受通用公共许可证(GPL)保护的自由软件。它主要工作在字符模式下,是一个功能强大的交互式程序调试工具。GDB不仅可以用来调试C/C++语言编写的程序,还可以用来调试Pascal、Objective-C以及Fortran等语言编写的程序。
假设程序为输出1-100之间的素数。
func.c
#include <stdio.h>
int func(int n)
{
int i;
int flag = 0;
for(i = 2;i < n;i++)
{
if(0 == n % i)
flag++;
}
if(0 == flag)
return 1;
return 0;
}
int main()
{
int i;
for(i = 1;i <= 100;i++)
{
if(func(i) == 1)
printf("%d ",i);
}
printf("");
return 0;
}
在保存退出后首先使用 Gcc 对 test.c 进行编译,注意一定要加上选项“-g” ,这样编译出的可执行代码中才包含调试信息,否则之后 Gdb 无法载入该可执行文件。
调试过程为gcc -g func.c -o test
虽然这段程序没有错误,但调试完全正确的程序可以更加了解 Gdb 的使用流程。接下来就启动 Gdb 进行调试。注意,Gdb 进行调试的是可执行文件,而不是如“.c”的源代码,因此,需要先通过 Gcc 编译生成可执行文件才能用 Gdb 进行调试。
gdb常用命令如下:
1、 l(list) #一次列出10行代码(list n,m #列出n~m行)
2、 r(run) #执行程序(未设置断点,将程序执行完毕)
3、 b(break) #b+行号,在该行设置断点
4、 c(continue) #当程序运行时,继续运行程序,直到遇到断点
5、 i b(info break) #查看断点信息
6、 d+编号 #(delete)删除该断点(d删除所有断点)
7、 clear+行号 #删除指定行断点(不加行报错)
8、 p(print) #p+变量名,显示变量的值
9、 s(step) #单步执行(进入调用函数)
10、 n(next) #不进入调用的函数,只在主函数中运行
11、 return/finish #退出step进入的调用函数
12、 q(quit) #退出gdb调试
四、makefile
// operator.c
所谓工程管理器,顾名思义,是指管理较多的文件的。试想一下,有一个上百个文件的代码构成的项目,如果其中只有一个或少数几个文件进行了修改,按照之前所学的Gcc 编译工具,就(第一个缺点)不得不把这所有的文件重新编译一遍,因为编译器并不知道哪些文件是最近更新的,而只知道需要包含这些文件才能把源代码编译成可执行文件,于是,(第二个缺点)程序员就不能不再重新输入数目如此庞大的文件名以完成最后的编译工作。
但是,请仔细回想一下程序编译过程,编译过程是分为编译、汇编、链接不同阶段的,其中编译阶段仅检查语法错误以及函数与变量的声明是否正确声明了,在链接阶段则主要完成是函数和全局变量的链接。因此,那些没有改动的源代码根本不需要重新编译,而只要把它们重新链接进去就可以了。所以,人们就希望有一个工程管理器能够自动识别更新了的文件代码,同时又不需要重复输入冗长的命令行,这样,Make工程管理器也就应运而生了。
实际上,Make 工程管理器也就是个“自动编译管理器” ,这里的“自动”是指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入 Makefile 文件的内容来执行大量的编译工作。用户只需编写一次简单的编译语句就可以了。
makefile的使用方法
makefile 是 make 读入的唯一配置文件,因此本节的内容实际就是讲述 Makefile 的编写规则。
1、makefile的基本格式:target:dependency
(Tab字符)command
注:若dependencyt比target日期新或target不存在,则make会执行command
2、makefile中变量的使用
OBJECTS = sum.o sub.o operator.o #定义变量
$(OBJECTS) #使用变量
3、makefile的自动推导(隐晦规则)
GNU的make很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必要去在每一个[.o]文件后都写上类似的命令,因为,我们的make会自动识别,并自己推导命令。只要make看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中。如:如果make找到一个main.o,那么main.c就会是main.o的依赖文件。并且gcc -c main.c -o main.o也会被推导出来。