Linux下C语言开发环境

1.编辑器Vi

 1.1什么是Vi

(1)Vi是Linux系统中一种文本编辑器,它的使用方法和界面与Unix平台十分相似。

(2)Vi相对来说比较小,无论你使用任何Linux系统,你总是可以使用Vi的。在很多系统中,可能只有Vi供你选择。

(3)Vim是Vi的高级版本,兼容Vi,功能更强大。

1.2基本操作

 (1)、进入vim:
在系统提示字符下键入: vim <文件名称>
vim可以自动帮你载入所要编辑的文件或是开启一个新文件。进入vim后屏幕左方会出现波浪符号,凡是列首有该符号就代表此列目前是空的。
 
(2)、离开vim:
可以在指令模式下键入
:q   退出vim
:q!  不保存强制退出vim
 :wq 保存后再离开
:x   保存后再离开
(3)、在插入模式和底行模式下用[Esc]键切换到命令行模式。

1.3Vi的三种模式

  1.3.1命令行模式

  • 开始编辑命令

i           在光标前输入文本
I           在当前行开始输入文本
a          在光标后输入文本
A          在当前行末尾输入文本
o          在当前行后输入新一行
O          在当前行前输入新一行

  • 光标移动命令

b      移动到当前单词的开始  
e      移动到当前单词的结尾 
w     向后移动一个单词
h      向前移动一个字符 ←
j         向下移动一行 ↓
k      向上移动一行 ↑
l       向后移动一个字符 →

  • 删除命令

x      删除光标所在的字符
dw    删除光标所在的单词
d$     删除光标至行尾所有字符
D      同 <d$>
dd     删除当前行
ndd   删除当前行以后的n行

  • 改变与替换操作命令

r      替换光标所在的字符
R      替换字符序列
cw    替换一个单词
ce    同cw
c$    替换自光标位置至行尾的所有字符
C      同c$
cc     替换当前行

  • 拷贝与粘贴命令

yw     将光标所在单词复制到粘贴板   
y$     将光标至行尾的字符复制到粘贴板
Y       同y$
yy      将当前行复制到粘贴板
nyy    将当前行后的n行复制到粘贴板
P       将粘贴板中的内容粘贴在光标前
p       将粘贴板中的内容粘贴在光标后

  • 其它有用的命令

nG                跳到第n行  
u                  撤销
.                重做
 
配对括号的查找:
用法:将光标移动到一个括号上,按下%,光标跳转到其配对的括号上
{}、()
 
页面操作:
ctrl + b              #向前移动一页 
ctrl + f               #向后移动一页
zz                     #将当前行置于屏幕中央
gg                     #移动到第一行行首
G                      #移动到最后一行行首
数字 + 命令:
nG                     #跳到第n行
nx                     #删除n个字符
ndd                   #删除当前行以后的n行
nyy                   #将当前行后的n行复制到粘贴板
n+                    #向后跳转n行
n-                     #向前跳转n行
n↑↓←→         #向上下左右跳转n次
 

1.3.2底行模式

  • 设置Vi

全局的配置文件位于/etc/vim/vimrc(或者/etc/vimrc)也可以拥有自己独立的配置文件,配置文件位“~/.vimrc”,如果没有该文件,也可以直接用如下命令创建并编辑
 
:set number等于:set nu      显示行号
: set nonumber等于:set nonu  隐藏行号
:set autoindent             智能缩进
:set mouse=a                开启鼠标

  • 文件保存及退出命令

:q                     不保存退出
:q!                    不保存强制性退出
:w                     保存编辑  
:w filename        另存为文件 filename
:wq                   保存退出
:x                      同 :wq
ZZ                     同 :wq

  • 查询命令

/abc    向后查询abc
?abc    向前查询abc
n         向后继续查询
N         向前继续查询

  • 替换与查找

:s/old/new                  替换该行第一个old为new
:s/old/new/g               可以替换全行中所有的old为new
:#,#s/old/new/g          替换两行之间出现的old为new,#,#为两行的行号
:%s/old/new/g             替换全文的old为new
:%s/old/new/gc           全文替换前需确认

1.3.3插入模式

编辑模式或输入模式:
只有在输入模式下,才可以输入文字。在命令模式下输入(i,a,A等),可进入输入模式,输入模式下按ESC,可返回命令模式。

2.编译器gcc

2.1什么是gcc

gcc(GNU CCompiler)是GNU才推出的功能强大、性能优越的多平台编译器,gcc编译器能将c、c++语言源程序编译、链接成可执行文件,以下是gcc支持编译的一些源文件的后缀及其解释
.c为后缀的文件,c语言源代码文件;
.h为后缀的文件,是程序包含的头文件;
.i为后缀的文件,是已经预处理过的c源代码文件;
.s为后缀的文件,是汇编语言源代码文件
.o为后缀的文件,是编译后的目标二进制文件;

2.2编译过程

2.2.1预处理

预处理器(cpp)根据以字符#开头的命令,修改原始c程序。比如hello.c中的第一行的#include <stdio.h>指令告诉预处理器读取系统文件stdio.h的内容。并把它直接插入到程序文本中去。结果就得到了另一个C程序,通常是以 “.i”作为文件扩展名。
 
gcc -E hello.c -o hello.i

2.2.2编译

编译器(ccl)将文本文件 hello.i 翻译成文本文件 hello.s ,它包含一个汇编语言程序。汇编语言程序中的每条语句都以一种标准的文本格式确切地描述了一条低级机器语言指令。汇编语言是非常有用的,因为它为不同高级语言的不同编译器提供了通用输出语言。例如:c语言编译器和Fortran编译器产生的输出文件用的都是一样的汇编语言。
 
 
gcc -S hello.i -o hello.s

2.2.3汇编

接下来,汇编器(as)将hello.s翻译成机器语言指令,把这些指令打包成为一种叫做可重定位目标程序的格式,并将结果保存在目标文件hello.o中。hello.o文件是一个二进制文件,它的字节编码是机器语言指令而不是字符,如果我们在文本编辑器中打开hello.o文件,呈现的将是一堆乱码。
 
gcc -c hello.s -o hello.o

2.2.4链接

请注意,我们的hello程序调用了printf函数,它是标准c库中的一个函数,每个C编译器都提供,printf函数存在与一个名为printf.o的单独的预编译目标文件中,而这个文件必须以某种方式并入到我们的hello.o程序中。链接器(ld)就负责这种并入,结果就得到hello文件,它是一个可执行目标文件(或者简称为可执行文件)。可执行文件加载到存储器后,由系统负责执行。
 
gcc hello.o -o hello 

2.3其他注意事项

(1)gcc example.c -o example      #直接生成可执行文件
(2)./example                             #运行可执行文件
(3)若不使用 -o 则生成可执行文件 a.out
(4)Linux头文件默认放在/usr/include中

2.4查看gcc版本号 gcc --version

3.调试器Gdb

GDB(GNU Debugger)是由GNU计划完成的、受通用公共许可证(GPL)保护的自由软件。它主要工作在字符模式下,是一个功能强大的交互式程序调试工具。GDB不仅可以用来调试C/C++语言编写的程序,还可以用来调试Pascal、Objective-C以及Fortran等语言编写的程序。

3.1使用流程

例: 输出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("\n");

    return 0;
}      
在保存退出后首先使用 Gcc 对 test.c 进行编译,注意一定要加上选项“-g” ,这样编译出的可执行代码中才包含调试信息,否则之后 Gdb 无法载入该可执行文件。
gcc -g func.c -o test
 
虽然这段程序没有错误,但调试完全正确的程序可以更加了解 Gdb 的使用流程。接下来就启动 Gdb 进行调试。注意,Gdb 进行调试的是可执行文件,而不是如“.c”的源代码,因此,需要先通过 Gcc 编译生成可执行文件才能用 Gdb 进行调试。

3.2常用命令

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调试

4.makefile

4.1为什么使用make

//  operator.c 
      所谓工程管理器,顾名思义,是指管理较多的文件的。试想一下,有一个上百个文件的代码构成的项目,如果其中只有一个或少数几个文件进行了修改,按照之前所学的Gcc 编译工具,就(第一个缺点)不得不把这所有的文件重新编译一遍,因为编译器并不知道哪些文件是最近更新的,而只知道需要包含这些文件才能把源代码编译成可执行文件,于是,(第二个缺点)程序员就不能不再重新输入数目如此庞大的文件名以完成最后的编译工作。
       但是,请仔细回想一下程序编译过程,编译过程是分为编译、汇编、链接不同阶段的,其中编译阶段仅检查语法错误以及函数与变量的声明是否正确声明了,在链接阶段则主要完成是函数和全局变量的链接。因此,那些没有改动的源代码根本不需要重新编译,而只要把它们重新链接进去就可以了。所以,人们就希望有一个工程管理器能够自动识别更新了的文件代码,同时又不需要重复输入冗长的命令行,这样,Make工程管理器也就应运而生了。
       实际上,Make 工程管理器也就是个“自动编译管理器” ,这里的“自动”是指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入 Makefile 文件的内容来执行大量的编译工作。用户只需编写一次简单的编译语句就可以了。它大大提高了实际项目的工作效率,而且几乎所有 Linux 下的项目编程均会涉及它,希望认真学习本节内容。

4.2make使用方法

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也会被推导出来。 

5.shell

Linux系统中的Shell种类众多,常见的有bash、csh以及ksh等。不同的Shell语法有所不同,不能互换使用,但每种Shell都有其特色之处。这里我们选择bash来讲述Shell脚本编程的基础知识。Shell命令可以事先写在一个文件中,使用时Shell读取文件中的命令逐条解释,这种文件被称为脚本。

5.1创建shell脚本

编写一个简单的Shell脚本,输出字符串Hello Word。
hello.sh注意:echo命令的功能是在屏幕上显示一段文字,后面的字符串可以加引号,也可以不加引号。如果加引号,将字符串原样输出;如果不加引号,将字符串中的各个单词用一个空格来分割。
脚本文件编辑完成之后,将其保存为test.sh。在执行脚本之前,需要将其属性改为可执行的,如下所示:
chmod +x test.sh
执行脚本的方法为:./test.sh
 
Shell脚本就是将一系列的Linux命令放在一个文件中执行的实用程序。Shell脚本可以利用vim等文本编辑器来编写。Shell脚本的格式是固定的,如下所示:
#!/bin/bash
# 注释
命令…
第一行中的符号“#!”用来指定解释执行该脚本文件的Shell程序。如果脚本文件中缺少该行,在执行过程中,会报出错误信息。除了第一行外,所有以“#”字符开头的行都是注释行,如果一行未完成,可以在行尾加上“\”字符,表示与下一行合并为一行。

5.2特殊字符

引号分为双引号、单引号和反引号。
1、由双引括起来的字符,除$、`(反引号)和\保留其特殊功能外,其余全为普通字符号
例如:
(1)$用于变量的引用;
变量的定义引用和清除:
                      STR=“Hello world”         #对变量STR进行赋值
                      echo $STR或echo ${STR}  #用$对其进行引用
                      unset STR                        #清除STR变量 
(2)echo“现在的地址是`pwd`”,输出结果为:现在的地址是/root(`pwd`被解释为命令);
(3)\为转义字符,使用-e进行解析,如:echo -e "a\nd"       //  \n自动换行
另外,在某个字符前面利用反斜杠(\)能够阻止shell把后面的字符解释为特殊字符。
2、单引号内部不能使用$、`(反引号)和\,都作为普通字符对待。

5.3常用脚本命令

echo ${#STR}                                    #计算长度(字母个数) 
echo ${STR:1:3}                                 #显示第2,3,4个字符
echo “`expr index “$STR” 23`”       #在变量STR中23 谁先出现 显示谁位置
 
数组:
array1=(0 1 2 3 4)                                     #3种定义赋值数组(圆括号)
echo ${array1[0]}                                     #显示数组值
echo ${#array1[@]}或echo ${#array1[*]} #计算数组长度
 
算数运算:
c=`expr $a + $b`                           #.sh中的加减乘除
c=`expr $a \* $b`                          #.sh中的乘法

5.4数值测试

数值测试可用的操作符包括:
-eq:两个数相等;(=)
-ne:两个数不相等;(!=)
-gt:第一个数大于第二个数;(>)
-lt:第一个数小于第二个数;(<)
-le:第一个数小于等于第二个数;(<=)
-ge:第一个数大于等于第二个数。(>=)

5.5字符串测试

字符串测试的主要操作符包括:
==:两个字符串相等;
!=:两个字符串不等;
-z:字符串为空;
-n:字符串不为空。

5.6结构控制语句

5.6.1if语句

if语句用来实现条件分支结构,它的一般格式为:
     if 条件1
     then  
            命令1
     elif条件2
     then  
            命令2
     else  
            命令3
     fi
 
注意:if语句以它的反写fi结尾。如果条件1成立,则执行then后面的命令1;如果条件1不成立,但条件2成立,则执行命令2;如果两个条件都不成立,则执行命令3。如图所示。

5.6.2for语句

for循环的一般格式为:
     for变量名in [列表]
          do
              命令1  命令2  …
     done
 
     在for循环中,使用变量名来遍历列表中所有取值,当变量值在列表中时,即执行一次所有命令。for循环的程序流程如图所示。

5.6.3while语句

while循环的一般格式为:
     while 条件
          do  
              命令1  命令2  ...
     done
 
     当条件成立时,do和done之间的命令才会被执行,执行完成后重新测试条件,如果不成立则终止循环。while循环的程序流程如图所示。

猜你喜欢

转载自blog.csdn.net/smellydog1996/article/details/81121517