资讯详情

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.大树下乘凉

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

一切都是文件

通过文件实现数据和设备的管理

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

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

设备文件 字符设备(Character device)这是一 个顺序的数据流设备, 读这种设备 根据字符,这些字符连续形成数据流。字符设备没有缓冲区, 因此,该设备的读写是实时的,如串口设备。 块设备(Block Device)这是一种随机存取设备, 读写这种设备是按块进行的, 它利用缓冲区存储临时数据。条件成熟后,将缓存中的数据一次性写入设备 或将数据从设备中一次性读取到缓冲区,如磁盘。

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

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

  目录结构:  >(根目录)在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 >/span> 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"//输出:aabbismeecho‘name 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 ◆第二次循环时, var的内容为con1◆第二次循环时,var的内容为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例子及操作

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

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

标签: zz连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

 锐单商城 - 一站式电子元器件采购平台  

 深圳锐单电子有限公司