文章目录
- 前言
- 一、特点
- 第一章开发工具概述、目录
-
- 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个操作模式:
- vi插入模式 vi创建一 一个不存在文件时, 默认进入插入模式 vi将输入的字符作为正文内容放在正在编辑的文件中
- vi编辑模式 vi打开-一个已经存在文件时,默认进入编辑模式 在此模式下可进入插入模式、控制屏幕光标的移动、进行文本的选择、复制、粘贴、剪切、 删除、查找等工作
- 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
