Linux基本知识总结、常用命令教程、shell脚本开发、编辑器及调试器的使用教程

文章目录

  • 前言
  • 一、特点
  • 第一章开发工具的概述、目录
    • 1.1文件类型
  • 第三章 Vi命令
    • 3.1 vi 与 vim 的简介
    • 3.2 vim的安装与配置
    • 3.3vim模式介绍
  • 第四章 Shell脚本定义与执行
    • 4.1概述
    • 4.2定义执行及变量
    • 4.3自定义变量
    • 4.4 预定义变量
    • 4.5脚本变量的特殊用法: ""“'\( {}
    • 4.6结构控制语句和函数
      • 4.6.1 文件测试
      • 4.6.2 条件测试语句
      • 4.6.3 命令执行控制:
      • 4.6.4 if语句
      • 4.6.5 case语句
      • 4.6.6 for语句
      • 4.6.7 declare语句
      • 4.6.8 for 语句
      • 4.6.9 while 语句
      • 4.6.10 until 语句
      • 4.6.11 break 语句
      • 4.6.12 continue语句
    • 4.7 关于函数
      • 4.7.1 函数概述
      • 4.7.2 函数调用
  • 第五章 Linux下的编译器
    • 5.1GCC概述
    • 5.2GCC的组成
    • 5.3gcc识别的文件扩展名
    • 5.4 gcc使用格式
    • 5.5 gcc、g+ +编译选项
    • 5.6 gcc和g+ +编译器的编译过程:
    • 5.7gcc常用编译应用实例:
    • 5.8动态库与静态库
  • 第六章 Linux下的调试器gdb
    • 6.1 gdb的概述
    • 6.2例子及操作
  • 未完待续,关注另一篇文章

文章目录


前言

*[Linux采用树状结构管理磁盘]:

linux系统构建一个叫做根文件系统的东西(其实就是一堆文件夹、文件的集合),里面存放着linux启动必需的一些配置文件、库文件、应用程序

根文件系统按照一定格式存放在硬盘、FLASH中的某一个分区, linux内核启动起来后首先会启动它

其他分区、U盘、SD卡、光盘等"挂载"在根文件系统的某一目录下,我们通过此目录访问此此磁盘

一、特点

1、Linux系统的稳定性
Linux采取了许多安全技术措施,其中有对读、写进行权限控制、审计跟踪、核心授权等技术,这些都为
安全提供了保障。Linux由于 需要应用到网络服务器,这对稳定性也有比较高的要求,实际上Linux在这方面也
十分出色;
2、Linux系统的安全性
Linux系统在设计的时候就是针对多用户环境的,所以对系统文件,户文件都做了明确的区分,每个文
件都有不同的用户属性,作为一个普通用户,通常只能读写自己的文件,而对一般的系统文件只能读取不能改
动,-些敏感的系统文件甚至连读取都是被禁止的,这种设计从根本上保证了系统的安全性,即使一个户文
件出现了问题,也不会殃及整个系统;
3、Linux软件安装的便利性
在Windows平台下,通常只要一直用鼠标单击下一 步按钮;
4、Linux软件资源消耗可以完成安装
由于内核小,因此他可以支持多种电子产品,如: Android手机,PDA等,资源消耗。

第一章开发工具的概述、目录

1.1文件类型

1、大树底下好乘凉

对磁盘分区的管理(树状)

2、一切皆文件

对数据、设备的管理都是通过文件去实现的

普通文件(数据文件)
普通文件是用于存放数据、程序等信息的文件, -般都长期地存放在外存储器(磁盘)
中。普通文件又分为文本文件和二=进制文件。
文本文件:文本文件中保存的是字符的编码,用户可以直接读懂其中的数据,如数字、字母
等。
二进制文件(binary file) :内存中的数据原封不动地保存至文件中,这样的文件称为二进制
文件。

目录文件:
目录文件是由文件系统中-一个目录所包含的目录项所组成的文件,用户进程可以
读取目录文件,但不能对它们进行修改,只有系统(内核)才可以修改目录文件。
设备文件:设备文件是用于为操作系统与设备提供连接的一种文件。在Linux系统中将设备作
为文件来处理,操作设备就像是操作普通文件一样。设备文件 又分为字符设备文件和块设备
文件。每一个设备对应一个设备文件,存放在/dev目录中。
.

设备文件
字符设备(Character device)这是一 个顺序的数据流设备, 对这种设备的读是
按字符进行的,而且这些字符连续地形成了一个数据流。字符设备不具备缓冲区,
所以这种设备的读写是实时的,如串口设备。
块设备(Block Device)这是一-种随机存取设备, 对这种设备的读写是按块进行的,
它使用缓冲区来存放暂时的数据,待条件成熟后,把缓存中的数据一次性写入设备
或从设备中一次性读出数据放入到缓冲区,如磁盘。

链接文件
链接提供了共享文件的一种方法,链接又可以分为软链接(符号链接)和硬链接。
软链接类似于快捷方式,软链接文件可以在不同的文件系统之间建立一种链接关系,
删除软链接的源文件,文件就不存在了。
硬链接文件是已存在文件的另一个名字,删除硬链接的源文件,文件依然存在。

管道文件
管道文件主要用于在进程间传递数据,它是Linux进程间的一种通信机制。管
道是进程间传递数据的“媒介"
套接口文件:套接口(Socket) 文件(也称套接字)主要用于不同计算机间的进程间通信。
套接口有3种类型:流式套接口、数据报套接口、和原始套接口。

 
目录结构:

>(根目录)在Linux下只有一个根目录所有的东西都是从这开始的

>home每个用户都有自己的用户目录: /home/用户名用来存放用户的数据、设置文件等。/root这是系统管理员(root user)的目录。 

>etc这里存放了系统、软件的配置文件。如用户的账号与密码、系统的主要设定、所要开启的服务项目。例:你安装了samba这个套件,当你想要修改samba配置文件的时候,你会发现samba配置文件就在/etc/samba目录下。

>boot放置linux系统启动时相关的文件。如: linux的内核文件: /boot/vmlinuz系统引导管理器:/boot/grub/var系统执行过程中经常变化的文件/var/log:随时更改的日志文件/var/log/message:所有的登录文件存放目录

>tmp存放用户或程序的临时文件,通常为空,任何人都可以访问,重要数据不可放置在此目录下
 
# 第二章   Linux常用命令
Linux中有这样一句话不会命令行,就算你不会linux。

 Linux命令结构:命令 选项 传给命令的参数


```javascript
1.help  //linux自带帮助信息    ls --help
2.man //有问题找男人大部分函数使用说明    例:man ls
> man是linux提供的一个手册,包含了绝大部分的命令、函数使用说明
> >该手册分成很多章节(section),使用man时可以指定不同的章节来浏览。
> > 中文在线手册:http://os.51cto.com/linuxman/: man Is; man 2 mkdir 

列举几个命令使用方法:

3.TAB//自动补全命令,在输入命令或者文件名时可用
4.history//历史命令   
当系统执行过一些命令后,可按上下键翻看以前的命令
history将执行过的命令显示出来
5.>   //重定向
//本应该显示在终端上的内容保存到执行文件中
  //例ls > test.txt
6. |   //管道   一个程序输出作为另一个程序输入
   //例:ls | less 
7.ls    //显示目录内容
		-l   列表显示//例 ls -l
		-a显示隐藏文件//例 ls -a
8.tree     //以树状形式显示目录结构
         //执行不了,需要安装tree文件
         //命令:sudo apt install tree
9.clear    //清楚终端上的显示
10.cd    //   cd /home/ 进入home  指定的目录
11.d ..   //回到根目录
12.cd ~     //进入用户的 家目录(常用)
13.pwd      //显示当前工作目录的绝对路径
14.mkdir     //创建目录文件
15.touch     //创建文件   touch test.c
16.rm     //删除文件、目录  
-r  删除文件夹时必须加此参数
-f   强制删除文件
   // rm file1  -rf
17.cp    //复制文件  
 -R拷贝文件夹 
 -i有重复文件时 提醒是否覆盖
  -v显示拷贝进度

此处跟一个操作图
在这里插入图片描述

18.mv     // 移动文件  更改文件名
       //mv file1 file2 改名 
       // mv file1 /home移动
19.cat    //显示文本文件内容  
   //  cat  test 显示test 文件内容
20.file    //查看文件类型

21.which     //查看命令所在的目录
22.find     //指定路径下查找文件   
       //find /home 文件名   (/home在家目录下 就是~/
23.grep    //在指定文件中查找指定内容     
    //命令格式: grep  查找信息  文件名 参数-n 显示行号
   //例:grep aaa test.c -n//在当前文件夹test.c中查找aaa并显示行号
24.df      //检查磁盘空间占用情况 加上-h 显示人性化
25.du     //显示目录、文件占用磁盘空间大小 加上 -h
26.mount  挂载    umount卸载  //此处两个命令不常用
27.tar    //压缩与解压
  压缩解压有两种不同的格式,后缀名也不同
1:压缩:tar cvzf 压缩包包名 文件1  文件2 ···
  :解压:tar xvzf 压缩名 -C ./(~/)

2.:压缩:tar jcvf 压缩包包名 文件1 文件2
  :解压:tar jxvf 压缩包包名 -C~/

以下指令不常用
adduser: adduser test 增一个叫test的用户
deluser: deluser testw除-个叫test的用户
passwd: passwd用户名 passwd修改指定用户的密码,若不写用户名,则修改当前用户密码
su: su用户名su可让用户暂时变更登入的身份。

变更时须输入所要变更的用户帐号与密码
日历指令
cal:显示日历命令格式:

Scal [选项[月份] [年]选项:

-y显示整年日历cal 9 2012date:

shutdown:关机
shutdown -h now //立刻关机,其中now相当于时间为0的状态
shutdown -h 20:25 //系统在今天的20:25分会关机
shutdown -h +10//系统再过十分钟后自动关机
reboot:重启电脑

在UNIX系统家族里,文件或目录权限的控制分别以读取、写入、执行3种权限文件所有者、同一个组人、其他人3种身份来区分文件权限
-rwxr-xr-x 1 dengwei teacher 1879 7A 27 17:19_vimrc

第1个字母代表文件的类型:d代表文件夹、-代表普通文件、c代表硬件字符设备、b代表硬件块设备、1代表软链接文件

后9个字母分别代表:文件所有者、同组者、其他人拥有的权限分别表达为:rwx(读、写、执行)

-rwxr-xr-x        三位为一   分别代表 所属人 所属组 其他人

各字母的含义

u      //所有者
g      //群组
o      //其他用户
a      //全部用户

有关权限代码:

r      //:读取权限,数字代号为"4"
w      //:写入权限,数字代号为"2"
x      //:执行或切换权限,数字代号为"1"
-      //:不具任何权限,数字代号为"0"
chmod     //改变文件权限    有两种格式 字母法  数字法
      //格式 :chmod 用户操作权限 文件名

1.字母法
chmod o+w filename 给文件file的其它用户增加写权限
chmod u-r filename 给文件file的拥有者减去读的权限
chmod g=x filename设置文件file的同组用户的权限为可执行,同时去除读、写权限

2.数字法
chmod 751 file
给文件所有者:读、写执行权限
同组用户:读、执行的权限
其它用户:执行的权限
chmod 777 file
对所有用户拥有读、写、执行权限-R递归所有目录加上相同权限
chmod 777 test -R
递归test目录下所有文件加777权限

chown:改变文件所属人
chown teacher test/
//将test文件夹的所属 人改为teacher
//teacher必须为linux中已存在用户

chgrp:改变文件所属组
chgrp teacher test/
//将test文件夹的所属组改为teacher
//teacher必须为linux中已存在用户组

ifconfig: 查看或配置网卡信息

ifconfig eth0: 查看网卡信息

ifconfig eth0 192.168.220.xx :设置ip

ifconfig eth0 hw ether 12:34:56:78:23:56
//设置mac地址,多用于开发板

ping: 测试网络连通性
ping 192.168.1.123 -C 5
-C 代表发送包的次数

who:查看当前系统磴录用户的信息
第一列显示登陆用户名
第二列显示终端名
第三列显示登陆时间

exit:
如果是图形界面:退出当前终端.
如果是使用ssh远程登录:退出登陆账户

shutdown: 关机
shutdown -h now /应刻关机,其中now相当于时间为0的状态
shutdown -h 20:25 //系统在今天的20:25分会关机
shutdown -h + 10 //系统再过十分钟后自动关机

reboot: 关电脑

第三章 Vi命令

3.1 vi 与 vim 的简介

vi在linux界有编辑器之神的美誉
◆vi编辑器是Linux系统中最常用的文本编辑器,几乎所有的Linux发行版中都包含vi程序;
◆vi工作在字符模式下,不需要图形界面,非常适合远程及嵌入式工作,是效率很高的文本.编辑器;
◆尽管在Linux.上也有很多图形界面的编辑器可用,但vi的功能是那些图形编辑器所无法比拟的。

使用vi打开文件
vi filename:打开或新建文件,并将光标置于第一行行首
vi +n filename: 打开文件,并将光标置于第n行行首

vim是vi的升级版,它不仅兼容vi的所有指令,而且还有一些新的特性,例如vim可以撤消无限
次、支持关键词自动完成、可以用不同的颜色来高亮你的代码。
➢官网: http://www.xim.org/download.php

3.2 vim的安装与配置

1.安装vim

sudo apt-get install vim

2.安装ctags

sudo apt-get install ctags

3.配置vim
step1:
①将vim. configure拷入当前用户的目录下
②进入vim_ configure
③写权限: sudo chmod 777 copy_ con.sh
step2:
打开终端,执行以下以下命令:
cd vim_ configure
sudo ./copy_ con.sh
拷贝成功后,出现copy successful

3.3vim模式介绍

vim编辑器有3个操作模式:

  1. vi插入模式
    vi创建一 一个不存在文件时, 默认进入插入模式
    vi将输入的字符作为正文内容放在正在编辑的文件中
  2. vi编辑模式
    vi打开-一个已经存在文件时,默认进入编辑模式
    在此模式下可进入插入模式、控制屏幕光标的移动、进行文本的选择、复制、粘贴、剪切、
    删除、查找等工作
  3. vi最后一-行模式(命令模式)
    在编辑模式下,按shift+: 进入
    跟编辑模式类似,完成存盘、另存、查找等任务Vim安装

由编辑模式切换到插入模式

i从光标当前位置开始插入
a从光标当前位置的下一个字符开始插入
0在光标位置的下行插入一个空行,再进行插入
1从光标所在行的开头开始插入文
A从光标所在行的末尾开始插入正文
0在光标位置的上一行插入一个空行,再进行插入
由编辑模式切换到命令模式shift + :
由插入模式、命令模式切换到编辑模式:ESC (命令模式到编辑模式两次ESC)
编辑模式与插入模式不能直接转换

编辑模式下删除和修改文本

1.[u]撤消前面多次修改
2. [n]x删除光标后n个字符
3. [n]X删除光标前n个字符
4. [n]dd删除从当前行开始的n行
5. [n]yy复制从当前行开始的n行
6. p把粘贴板上的内容插入到当前行
7.执行上一-次操作
8. shift +zz(按住shift按两下z键)保存退出当前文

常用最后一行模式命令

文件存储类:
:w保存当前文件
:w file 另存当前文件为file
:q退出vi :wq保存当前文件,退出
:x同上
:q! 不保存文件并退出

配合搜索命令使用:
:nohls 取消高亮
:set hls设置高亮
:set ignorecase让VIM忽略大小写
:set noignorecase不让VIM忽略大小写

第四章 Shell脚本定义与执行

4.1概述

shell的两层含义:既是一-种应用程序,又是一种程序设计语言。

作为应用程序:
交互式地解释、执行用户输入的命令,将用户的操作翻译成机器可以识别的语言,完成相应功能。

作为程序设计语言:
它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支完成类似于windows’下批处理操作,简化我们对系统的管理与应用程序的部署。shell是用户和Linux内核之间的接C门程序用户在提示符下输入的命令都由shell先解释然后传给Linux核心; .它调用了系统核心的大部分功能来执行程序、并以并行的方式协调各个程序的运行。

Linux系统中提供了好几种不同的shell命令解释器,如sh、ash、 bash等;一般默认使用bash作为默认的解释器;

我们后面编写的shel脚本,都是由.上述shell命令解释器解释执行的。作为程序设计语言称之 为shell脚本我们学过的c/C+ +等语言,属于编译性语言(编写完成后需要使用编译器完成编译、汇编、链接等过程变为二进制代码方可执行) ;

shell脚本是一 -种脚本语言,我们只需使用任意文本编辑器,按照语法编写相应程序,增加可执行权限,即可在安装shell命令解释器的环境下执行。shelI脚本主要用于:帮助开发人员或系统管理员将复杂而又反复的操作放在一个文件中, 通过简单的一步执行操作完成相应任务,从而解放他们的负担。

4.2定义执行及变量

1.用vi或者vim进入后要先定义

#!/bin/sh   //输入一系列此操作

2.然后 shift+; 进入命令行 输入wq 保存退出

3.然后给.sh文件增加权限

chmod +x test.sh

4.执行(有三种执行方式)

chmod +x test.sh;./test.sh  // 增加权限和执行  
Bash test.Txt
./ test.txt

4.3自定义变量

在Shell脚本文件下
定义变量 变量名=变量值如: num=10
引用变量 变 量 名 如 : i = 变量名如: i= :i=num 把变量num的值付给变量i
显示变量 使用echo命令可以显示单 个变量取值echo $num
清除变量 使用unset命令清除变量unset varname

变量的其它用法:

read string   //从键盘输入- 一个字符串付给变量string,若string没有
                    // 定义则先定义在使用

readonly var= 100  //定义一个只读变量,只能在定义时初始化,
                      //以后不能改变不能被清除
export var= 300   //使用export说明的变量,会被导出为环境变量,
                 //其它shell均可使用
          //注意:此时必须使用source 2 _var.sh才可以生效

注意事项:
1.变量名只能英文字母数字下划线,不能以数字开头1. num=10错误num 1=20正确
2.等号两边不能直接接空格符,若变量中本身就包含了空格,则整个字符串都要用双引号、或单
引号括起来;双引号内的特殊字符可以保有变量特性,但是单引号内的特殊字符则仅为一般字符。
name=aa bb //错误
name=“aa bb” //正确
echo " n a m e i s m e " / / 输 出 : a a b b i s m e e c h o ‘ name is me" //输出: aa bb is me echo ‘ nameisme"//:aabbismeechoname is me’ //输出: $name is me

4.4 预定义变量

$#: 传给shell脚本参数的数量
$*: 传给shell脚本参数的内容$1、$2、$3、… $9: 运行脚本时传递给其的参数,用空格隔开
? : 命 令 执 行 后 返 回 的 状 态 " ?: 命令执行后返回的状态" ?:"?"用于检查上一个命令执行是否正确(在Linux中,命令退出状态
为0表示该命令正确执行,任何非0值表示命令出错)。
$0: 当前执行的进程名
$ $ :当前进程的进程号“$$"变量最常见的用途是用作临时文件的名字以保证临时文件不会重复

4.5脚本变量的特殊用法: “”“’( {}

""     //(双引号) :包含的变量会被解释
"     //(单引号) :包含的变量会当做字符串解释
//(数字键1佐面的反引号):反引号中的内容作为系统命令,
          //并执行其内容,可以替换输出为
反括号 ``   //一个变量 $ echo "today is "date' “today is 2012年07月29日星期日12:55:21 CST

\转义字符:同c语言 \n \t \r \等echo命令瓢-e转义
(命令序列):由子shell来完成,不影响当前shell中的变量
{命令例}:在当前shell中执行, 会影响当前变量

4.6结构控制语句和函数

4.6.1 文件测试

:测试文件状态的条件表达式
-e是否存在
-d目录
-f文件
-r可读
-W可写
-x可执行
-L符号连接
-c是否字符设备-b是否块设备
-s文件非空

4.6.2 条件测试语句

-eq数值相等
-ne
数值不相等
-gt数1大于数2
-ge数1大于等于数2
-le数1小于等于数2
-|t数1小于数2

4.6.3 命令执行控制:

&&:
command1 && command2
➢&&左边命令 (command1) 执行成功(即返回0) shell才 执行&&右边的命令(command2)
|| :
command1 || command2
➢|左边的命令 (command1) 未执行成功(即返回非0) shell才 执行|右边的命令(command2)
例:
test -e /home && test -d /home && echo “true”
test2 -|t3 && test 5 -gt 3 && echo “equal”
test “aaa”=“aaa” |[ “$yn” = “y” ]&& echo “equal”

4.6.4 if语句

if [条件1]; then
执行第一段程序
else
执行第二段程序
fi

if [条件1]; then
执行第一段程序
elif [条件2]; then
执行第二段程序
else
执行第三段程序
Fi

4.6.5 case语句

case
$变量名称in
"第一个变量内容”)
程序段一
"第二个变量内容”)
程序段二
*)
其它程序段
exit 1
esac

4.6.6 for语句

for ((初始值;限制值;执行步阶))
do
程序段
done
初始值:变量在循环中的起始值

限制值:当变量值在这个限制范围内时,就继续进行循环
执行步阶:每作- -次循环时, 变量的变化量

4.6.7 declare语句

declare是bash的一个内建命令,可以用来声明shel变量、设置变量的属性。declare也可以写
作typeset。
declare -i s代表强制把s变量当做int型参数运算。

4.6.8 for 语句

for var in
con1 con2 con3…
do
程序段
done
◆第一次循环时, v a r 的 内 容 为 c o n 1 ◆ 第 二 次 循 环 时 , var的内容为con1 ◆第二次循环时, varcon1var的内容为con2
◆第三次循环时, $var的内容为con3

4.6.9 while 语句

while [ condition ]
do
程序段
done
◆当condition成立的时候进 入while循环,直到condition不成立时才 退出循环。

4.6.10 until 语句

until [ condition ]
do
程序段
done
◆这种方式 与while恰恰相反,当condition 成立的时候退出循环,否则继续循环。

4.6.11 break 语句

break
break命令允许跳出循环。
break 通常在进行一-些处理后退出循环或case语句

4.6.12 continue语句

continue
continue 命令类似于break命令
➢只有一点重要差别,它不会跳出循环,只是跳过这个循环步
有些脚本段间互相重复,如果能只写一-次代码块而 在任何地方都能弓|用那就提高了代码的可
重用性。

4.7 关于函数

4.7.1 函数概述

shell允许将一组命令集或语句形成- 个可用块,这些块称为shell函数。
定义函数的两种格式: .

函数名() {
命令..}
function函数名() { 命令.}

函数可以放在同一个文件中作为一-段代码,也可以放在只包含函数的单独文件中;
所有函数在使用前必须定义,必须将函数放在脚本开始部分,直至shell解释器首次发 现它时,
才可以使用。

4.7.2 函数调用

调用函数的格式为:函数名param1 param…
使用参数同在一般脚本中使用特殊变量
➢$1, $2…$9一样
函数可以使用return提前结束并带回返回值
➢return 从函数中返回,用最后状态命令决定返回值。
➢l
return 0无错误返回

return 1有错误返回

第五章 Linux下的编译器

5.1GCC概述

编译器是将易于编写、阅读和维护的高级计算机语言翻译为计算机能解读、运行的低级机器
语言的程序。
GUN项目中的一个子项目GCC (GNU Compiler Collection, GNU编译器套装)是一个编译器
套装,是GNU计划的关键部分,也是GUN最优秀的软件之一。
GCC最初用于编译C语言,随着项目的发展GCC已经成为了能够编译C、C++、 Java、 Ada、
fortran、Object C、Object C++、Go语言的编译器大家族。

5.2GCC的组成

GCC由cpp(预处理器)、gcc(C编译器)、 g+ +(C+ +编译器)、binutils (Binary Utilities
二进制工具)等工具组成。
binutils是辅助GCC的主要软件,常用的工具有: as (汇编器)、Id (链接器)、ar
(ar工具)等等。
gcc仅仅作为真实的编译器和链接器的入口。
◆它会在需要的时候调用其它组件(预处理器、汇编器、连接器),并且会传一-些额外的参数
给编译器和连接器。
◆输入文件的类型和传给gcc的参数决定了gcc调用哪些组件。

5.3gcc识别的文件扩展名

如下:
◆.c C语言文件
◆.i 预处理后的C语言文件
. ◆.C、.CC、 .cp、 .cpp、 .C++、 .cXx C++语言文件
◆.ii 预处理后的C+ +语言文件
◆.S汇编文件
◆.Ss 预处理后的汇编文件
◆.o 编译后的目标文件
◆.a目标文件的静态链接库(链接时使用)
◆.so 目标文件的动态链接库(链接、运行时使用)

5.4 gcc使用格式

◆编译命令格式
gcc [-option1] …
g++ [-option1] …
1.命令、选项和源文件之间使用空格分隔
2. - -行命令中可以有零个、-个或多个选项
3.文件名可以包含文件的绝对路径,也可以使用相对路径。
4.如果命令中不包含输出可执行文件的文件名,可执行文件的文件名默认为a.out。

5.5 gcc、g+ +编译选项

◆-o file指定生成的输出文件名为file
◆-E 只进行预处理
◆-S只进行预处理和编译
◆-C只进行预处理、编译和汇编
◆-Wall生成所有级别的警告信息
. -W关闭所有警告,建议不使用此选项

◆[0-3]编译器优化级别数值越大级别越高,0表示不优化
◆-include file 插入-个文件等同于源代码中的#include
◆ -Dmacro[=def]将名为marco的宏定义为def等同于#define macro [def]若[def]忽略不写,
则macro等于1.
◆-Umacro取消宏的定义等同于源代码中的#undef macro
◆-v显示制作GCCI具时的配置命令显示预处理器、编译器的版本号
◆-ldir将dir目录加入头文件搜索目录列表优先在dir目录中查找包含的头文件
-Ldir将dir目录加入库文件目录列表优先在dir目录中查找库文件
-Iname链接库为name的库
-static链接时使用静态库
-shared编译动态库
◆-g在可执行文件中加入标准调试信息

5.6 gcc和g+ +编译器的编译过程:

1.预处理
2.编译
3.汇编
4.链接

5.7gcc常用编译应用实例:

1:
➢gcc -E hello.c -o hello.i
➢gcc -S hello.i -o hello.s
➢gcc -C hello.s -o hello.o
➢gcc hello.o -o hello_ elf
◆例2:
➢
gcc hello.c -o hello_ _elf

5.8动态库与静态库

链接过程生成可执行代码
链接分为两种:静态链接、动态链接
静态链接的含义: 由链接器在链接时将库的内容加入到可执行程序中
静态链接的特点是:
➢优点: 对运行环境的依赖性较小,具有较好的兼容性
➢缺点:生成的程序比较大,需要更多的系统资源,在装入内存时会消耗更多的时间库函数有
了更新,必须重新编译应用程序
动态链接的含义:连接器在链接时仅仅建立与所需库函数的之间的链接关系,在程序运行
时才将所需资源调入可执行程序
动态链接的特点:
➢优点:在需要的时候才会调入对应的资源函数简化程序的升级;有着较小的程序体积实现进程
之间的资源共享(避免重复拷贝)
➢缺点:依赖动态库,不能独立运行动态库依赖版本问题严重

前面我们编写的应用程序大量用到了标准库函数
使用gcc hello.c -o hello时,系统默认采用动态链接的方式进行编译程序,若想采用静态编
译,加入-static参数
以下是分别采用动态编译、 静态编译时文件对比:

gcc hello.c -o hello_ share
gcc hello.c -static -o hello_ _static
//代码
1 #include <stdio. h>
3 int main(int argc, char *argv[])
printf("hello world\n");
6
return 0
7}

-rwxrwxr-x 1 edu edu 7. 0K 11月27 11: 50 hello_ share
-rwxrwxr-x 1 edu edu 726K 11月27 11: 50 hello_static

◆制作静态链接库:静态链链接库在linux中后缀为.a, 以lib开头如: libtestlib.a
1.制作:

#gcc -C mylib.c -o mylib.o //编译目标文件
#ar rc libtestlib.a mylib.o //制作静态库

2.静态库使用:
库函数、头文件均在当前目录下

#gcc -0 my. test mytest.c libtestlib.a

➢库函数、头文件假设在/opt目录

#gcc -0 mytest mytest.c -L/opt -ltestlib -I/opt

3.编译程序时

编译程序时,编译器默认会到/ib/. /usr/lib 下查找库函数,到/usr/include 下查找头文件
◆将libmylib.a移到/ib或/usr/lib下
#mv libtestlib.a /lib
◆将mylib.h移到/usr/include下
#mv mylib.h /usr/include
◆编译: #gcc mytest.c -0 mytest -Itestlib
//编译器会自动到/lib下查找库文件到/usr/include下查找头文件

◆制作动态链接库:

#gcc -shared mylib.c -0 libtestlib.so //使用gcc编译、制作动态链接库

动态链接库的使用1:
1)库函数、头文件均在当前目录下

#gcc -0 my_ test mytest.c libtestlib.so

2)库函数、头文件假设在/opt目录

#gcc -0 mytest mytest.c -L/opt -ltestib -I/opt

◆编译通过,运行时出错,编译时找到了库函数,但链接时找不到库,执行以下操作,把当前
目录加入搜索路径
#export LD_ LIBRARY PATH=./:/opt:$LD LIBRARY_ PATH
#./mytest可找到动态链接库
◆动态链接库的使用2:
◆1.库函数、头文件均在系统路径下

#cp libtestlib.so /lib
#gcc mytest.c -0 mytest -ltestlib

#./mytest编译运行都不会出错
◆问题:有个问题出现了?我们前面的静态库也是放在/lib下,那么连接的到底是动态库还是静态
库呢?
当静态库与动态库重名时,系统会优先连接动态库,或者我们可以加入-static指 定使用静态库。

第六章 Linux下的调试器gdb

6.1 gdb的概述

GNU工具集中的调试器是gdb,该程序是一- 个交互式工具,工作在字符模式。
除gdb外, linux 下比较有名的调试器还有xxgdb, ddd, kgdb, ups。

gdb是功能强大的调试器,可完成如下调试任务:
1.设置断点
2.监视程序变量的值
3.程序的单步执行
4.显示/修改变量的值
5.显示/修改寄存器
6.查看程序的堆栈情况
7.远程调试

6.2例子及操作

Linux基本知识总结、常用命令教程、shell脚本开发、编辑器及调试器的使用教程_第1张图片

Linux基本知识总结、常用命令教程、shell脚本开发、编辑器及调试器的使用教程_第2张图片

1.|(list)列出程序清单
2.「(run)运行程序
3. b(breakpoint) 设置断点,格式: b [行 号/函数名]
4. info b查看断点信息
5. clear[行号],清除断点
6. C (continue) 继续运行程序
s (step) 单步运行,
step into
8. n (next) 单步运行,step over
9. finish跳出函数,step out
10. print 变量/表达式,显示变量或表达式的值
11.display变量/表达式,每次程序停止运行是都显示变量或表达式的值
undisplay

未完待续,关注另一篇文章

你可能感兴趣的:(Linux,linux,编辑器,服务器)