linux基础学习总结

前言

这是我每天学习Linux的笔记总结,主要是对当天学到的知识进行整理,以便将来能用到能够快速回忆。如有志同道合的小伙伴可以一起交流探讨,我也是一个刚学习Linux系统不久的菜鸟,还望来此观摩的大神予以指导,有个别错误还望予以指出.

1、终端命令快捷键

以下命令主要是方便在终端输入命令时的操作

清屏:clearctrl + l
查看最近使用命令的历史纪录:history

建议使用ctrl + xxx 代替 上下左右箭头 操作

向前翻阅一个历史命令:ctrl + p上箭头
向后翻阅一个历史命令:ctrl + n下箭头

向左移动光标: ctrl + b左箭头
向右移动光标: ctrl + b右箭头

移动到行首: ctrl + a
移动到行尾: ctrl + e

删除光标所在处字符:ctrl + d
删除光标前一个字符:ctrl + h
删除光标所在处到末尾的所有字符:ctrl + k
删除光标前面的所有字符:ctrl + u

像以上这些快捷键还有很多,这里只是总结一些常用的。

2、Linux系统目录结构

介绍下一些比较常用的目录的作用

/bin : 这里存放的是我们经常用到的一些shell命令,如cat、ls、cp、rm、mv等等。

/root :超级管理员(root)的家目录

/usr :用户软件资源目录,存放的是用户的一些应用程序文件

/opt :一般用来存放第三方的软件安装包。

/home :存放所有普通用户的家目录,如普通用户为jake,那么其家目录为/home/jake

/sbin : 存放的是系统管理员使用的系统管理程序

/etc : 存放一些系统或应用程序的配置文件

/dev : 存放的是一些外设(如u盘、光驱、磁盘)的设备文件

/media : 和/mnt 一样存放的是外设文件,但是这是系统自动识别外设并挂载的设备文件。

/mnt : 存放手动挂载的文件系统,如可以将u盘或者光驱手动挂载在该目录下

/boot :存放的是Linux启动时所需要的系统核心文件,包括一些链接文件以及镜像文件,不要轻易修改或删除这里面的文件

/tmp : 存放的是一些临时文件

/var : 经常要进行修改变动的文件可以放到该目录下。如各种日志文件

/lib : 存放的是系统最基本的动态链接库(共享库),类似windows系统下的DLL文件。

3、Linux常用命令

  1. 操作目录或文件
  • 显示目录详细信息

显示当前目录下的子目录或者文件:ls 或者 tree
tree命令需要安装,tree 会将当前目录下所有文件以树的形式进行展示

显示所有(包括隐藏文件):ls -a
显示详细信息:ls -l

  • 创建

创建目录:mkdir 目录名 例如:mkdir aa: 创建一个aa目录
创建多层目录:mkdir 目录1/目录2/目录3 -p 例如:mkdir aa/bb/cc -p
创建文件:touch 文件名

例如:touch aa,如果文件名aa不存在,则创建文件aa
如果文件名存在,则将修改文件的时间,但是不会更改文件内容
如果跟某目录名重名,会修改已存在目录的时间,并不会创建文件

  • 删除

删除空目录: rm 目录名
删除非空目录: rm -r 目录名
删除非空目录带提示: rm -ri 目录名

删除文件: rm 文件名
删除文件带提示: rm 文件名

  • 复制

cp 文件1 文件2 : 如 cp aa bb

bb不存在时, 会创建一个名为bb的文件并且将文件aa的内容复制
bb存在时, bb文件的内容会被清除并且将文件aa的内容复制过来

cp 目录1 目录2 -r : 如 cp cc dd -r

如果目录dd存在时,会将目录cc 复制到 目录dd 下,也就是说dd下会存在一个目录cc
如果目录dd不存在时,会创建一个dd目录,并且将aa目录下的所有内容拷贝到dd目录下

  • 移动

mv 文件1 文件2 : 如 mv a1 a2

如果文件a2不存在时, 则相当于把文件a1改名为文件a2
如果文件a2存在时, 会将文件a1删除,并且a1的内容会覆盖到文件a2中去

mv 目录1 目录2: 如mv aa bb

如果目录bb不存在时, 则相当于把目录aa改名为目录bb
如果目录bb存在时, 会将目录aa 移动到 目录bb下(注意: 如果目录bb下原本存在目录aa,则会报错)

  • 查看文件
    这里主要区分三种查看方式cat more less

cat 文件名 : 主要打开内容比较少的文件,内容多的文件显示不完整
more 文件名 : 查看内容时不能往前翻, 按space换页,按Enter换行
less 文件名 : 在more的基础上增加了能往回看的功能

补充两个
head 文件名
tail 文件名

  • 查看文件属性的命令

查看文件属性:wc - [c|w|l|m] 文件名
l:行数;c:字节数;m:字符数;w:单词数

应用:查看当前目录下有多少个文件和子目录:ls | wc -l

查看二进制文件:od -t [c/d/f/u/o/x] 二进制文件名

c :以ASCII码显示 ;d:十进制数;f:浮点数;u:无符号十进制数;o:八进制数;x:十六进制数

查看目录大小:du -h
查看磁盘使用率:df -h

  1. 软硬链接的创建
  • 为文件创建软链接:ln -s 文件的绝对路径 软链接名

软链接名一般以soft为后缀
如:ln -s /home/jake/aa /home/jake/bin/aa.soft

  • 为文件创建硬链接:ln 文件的绝对路径 硬链接名

硬链接名一般以hard为后缀
如:ln /home/jake/aa /home/jake/bin/aa.hard

  1. 其他常用命令
  • 显示当前用户: whoami
  • 借用root权限: sudo
  • 查看shell命令在哪个路径下: which 命令 如: which cp
  • 切换到当前用户家目录: 如当前用户为jake

cd
cd ~
cd /home/jake

  • 切换到前一个路径 cd -(这个命令可以在相邻的两个路径来回切换)

4、Linux文件权限

先说明一下
[root@localhost ~]#

root表示当前用户
localhost表示主机名
~ 表示当前所在目录(此时是root的家目录)
# 表示的是超级管理员;如果是$表示普通用户

使用ls -l查看文件或目录详细信息如下图,详细解释下各个信息

修改文件目录权限
chmod [u|g|o|a][+|-|=][r|w|x] 文件或目录名

u :所有者 ,g :所属组 ,o :其他人 ,a :all的简写,三者都改
+ :增加权限,- : 减少权限,= :重新赋予权限
r :读 ,w :写,x :执行
如:
chmod a+x aa 将aa的所有者、所属组、其他人都增加执行权限
chmod ug=rw aa 将aa的所有者、所属组都更改为可读可写权限

chmod [+|-|=] 三位数 文件名

+ : 增加权限, - : 减少权限, = : 重新赋予权限 ,一般可省略
三位数每一位分别代表所有者、所属组、其他人
读的权值为4,写的权值为2,执行的权值为1
如:
chmod 664 aa 等同于chmod =664 aa aa的所有者、所属组具有可读可写权限,其他人只具有读权限
chmod -112 aa aa的所有者、所属组取消可执行权限,其他人取消写权限

更改文件或目录的所有者和所属组
sudo chown 所有者:所属组 -R 文件或目录名

更改文件或目录的所属组
sudo chgrp 所属组 文件或目录名

温馨提示:目录必须具有执行权限才可进入

5、Linux文件或目录颜色区分

白色:普通文件
蓝色:目录
青色:链接
黄色:设备文件
绿色:可执行文件
红色:压缩文件
灰色:其他

6、Linux文件检索和内容查找

  1. 文件查找 find
  • 按文件名查找: find 查找路径 -name "文件名"
  • 按文件类型查找: find 查找路径 -type 文件类型参数[f/d/b/c/l/s/p]

文件类型参数 f 代表普通文件,其他类型参数的都是前面提过的

  • 按文件大小查找: find 查找路径 -size +/- [k/M/G]

+ : 大于, - : 小于 ;
k、M、G都是文件大小单位(k是小写的)
如:find ./ -size +5k -size -1M 在当前路径下查找大于5k小于1M的文件

  1. 文件内容 grep
    grep -r "文件内容" 搜索目录
    如: grep -r "abjsl" ./ 在当前路径下递归查找有没有存在内容中有“abjsl”的文件

7、u盘的手动挂载与卸载


自动挂载 : 一般在/media/下
手动挂载 : 一般指定在/mnt/ 下

  • umount卸载: umount 要卸载的设备(其实就是一个目录,linux一切皆文件)

  • 查看设备信息(查找要挂载的设备的路径):
    sudo fdisk -l

  • mount 挂载:mount 挂载设备路径 /mnt

注意:这里手动挂载一般选择在/mnt下,当然也可以挂载到其他目录,但是要保证其他目录内的内容和设备中的内容没有重名的,不然设备中的文件会覆盖原来目录的文件,这里的覆盖并不是说原来目录的文件就被删除了,只是说暂时不存在而已当你卸载设备后,原来目录的文件又会还原
所以在不能确定的情况下最好保证要手动挂载的指定目录是一个空目录(建议/mnt)

8、压缩与解压缩

  • gzip gunzip

    1. gzip *.txt (不会保留源文件,并且会一一压缩每个txt文件,注意:这里不会合并为一个文件)

    2. gunzip *.gz(不会保留源文件,并且会一一解压每个gz文件)

  • bzip2 bunzip2 --需要安装

    1. bzip2 *.txt (不会保留源文件,并且会一一压缩每个txt文件,跟gzip *.txt 一样的效果)

    2. bzip2 -k * .txt(会保留源文件,并且会一一压缩每个txt文件

    3. bunzip2 *.bz2 (不会保留源文件,并且会一一解压每个bz2文件)

注意事项:gzip 和 bzip2 不能压缩目录

  • tar

    1. -参数
      c : 压缩
      v : 显示提示信息 – 可以省略
      f : 指定压缩文件的名字
      x : 解压
      j : – 使用bzip2的方式压缩文件 – .bz2
      z :-- 使用gzip的方式压缩文件 – .gz

    2. 压缩:
      tar -zcvf 生成的压缩名(xxx.tar.gz) 要压缩的文件或目录
      tar -jcvf 生成的压缩名(xxx.tar.bz2) 要压缩的文件或目录

    3. 在当前目录下解压:tar -jxvf 压缩包

    4. 解压到指定目录下:tar -zxvf 压缩包 -C 指定解压的目录

    5. 压缩:rar a 生成的压缩包名字 要压缩的文件

    6. 解压:rar x 压缩包 指定解压到哪个目录

  • rar --需要安装

    1. 压缩:rar a 生成的压缩包名字 要压缩的文件

    2. 解压:rar x 压缩包 指定解压到哪个目录

  • zip unzip --需要安装 --可压缩目录

    1. zip 生成的压缩包名字 要压缩的文件

    2. zip -r 生成的压缩包名字 要压缩的目录

    3. unzip 压缩包名字 -d 指定解压到哪个目录

9、常用网络与查看进程相关命令

  • 查看进程

    1. 查看所有进程:ps a

    2. 能查看到进程正在被使用的所属用户: ps au

    3. 查看包括没有终端的所有进程:ps aux

    4. 使用管道 | ,格式 : 指令1 | 指令2 (指令1的输出作为指令2的输入,最后结果为指令2的输出)
      例如: 查看所有内容中有bash的进程: ps aux | grep bash

    注意在使用 ps aux | grep bash这条命令时,它也是一个进程

  • 终止进程: kill -9 进程pid
    9代表信号SIGKILL
    可以通过 kill -l 命令查看所有信号

  • 查看当前进程的环境变量 : env
    例子:查看当前进程环境变量中有PATH的
    env | grep PATH

linux下的环境变量的格式 key-value
key=value:value:value:value(当有多个环境变量时,用 : 分隔)

  • top : 类似windows中的任务管理器(只读,不能操作)

  • ifconfig 查看ip相关信息
    ping www.baidu.com
    nslookup www.baidu.com 查看服务器域名对应的ip地址

10、用户管理

  • 添加用户 : adduser 用户名
  • 为用户设置密码: passwd 用户名 然后输入两次密码
  • 删除用户: userdel -r 用户名

11、常用服务器搭建与配置

ftp服务器搭建
  • 作用:文件的上传和下载 (不能是目录,要传目录的话直接可以将其打包)

  • 服务器端:
    安装 :sudo yum install vsftpd

    修改配置文件:/etc/vsftpd.conf

    重启服务器: sudo service vsftpd restart

  • 客户端:

    实名用户登录: (可以随意地切换目录,对于服务器来说不安全)
    ftp serverip ===> 输入用户名和密码
    put filename 上传文件
    get filename 下载文件

    匿名用户登录:(只能在服务器指定的目录下操作,服务器须在配置文件中添加指定匿名用户访问的目录,或者用默认的目录 /srv/ftp)
    ftp serverip ===> 用户名:anonymous 密码:不需要写
    退出: exit 或者 quit 或者 bye

  • lftp :针对ftp客户端的软件(这个可以上传目录,还可以一次性上传多个文件)
    实名登录:lftp username@serverip ===> 输入密码
    匿名登录:lftp serverip ===> 输入login
    操作:
    上传单个文件:put fileName
    上传多个文件:mput fileName1 fileName2
    下载单个文件:get fileName
    下载多个文件:mget fileName1 fileName2
    下载整个目录以及子目录:mirror dirName
    上传整个目录以及子目录:mirror -R dirName

nfs服务器搭建
  • 作用:开发项目组中共享文件夹

  • 服务器:
    安装: sudo yum install nfs-kernel-server

    创建一个欲共享出去的目录:mkdir -p /home/jerry/share

    打开配置文件: sudo vi /etc/exports

    添加共享目录的绝对路径 :/home/jerry/share *(rw,sync) rw 可读可写 ro 只读

    重启服务:sudo service nfs-kernel-server restart

  • 客服端:
    通过挂载该目录来获取共享目录中的资源

    mount serverIp:共享目录绝对路径 挂载目录位置
    如:mount serverIp:/home/jerry/share /mnt

ssh服务器搭建
  • ssh服务器
    ====>安装ssh: sudo yum install openssh-server
    ====>查看是否安装 sudo aptitude show openssh-server
  • 客户端:
    ====>远程登录:ssh serverip@username ===> 密码
    ====>退出:logout
  • scp命令 (super copy)
    scp -r 目标用户名@目标主机ip:目标文件的绝对路径 保存到主机的相对/绝对路径

拷贝目录需要加参数(-r)

12、查看man帮助文档

使用man man查看

中文翻译

安装c库函数帮助文档

CentOS系统可能没有自带c库函数 --需要自己安装
安装:yum install man-pages.noarch

安装中文版man
  1. 获取安装包
# wget https://src.fedoraproject.org/repo/pkgs/man-pages-zh-CN/manpages-zh-1.5.2.tar.bz2/cab232c7bb49b214c2f7ee44f7f35900/manpages-zh-1.5.2.tar.bz2
  1. 解压安装包到当前目录并进入解压包
# tar jxvf manpages-zh-1.5.2.tar.bz2
# cd manpages-zh-1.5.2
  1. 安装(使用者最好是root,由于权限问题)
# ./configure --disable-zhwt
# make && make install
  1. 修改配置文件
    为了不覆盖man命令,我们用cman命令来查看中文版的帮助文档,在.bash_profile中追加以下内容(这个文件在用户的家目录中)
    打开.bash_profile文件
# vi /home/你自己的用户名/.bash_profile

追加内容:alias cman='man -M /usr/local/share/man/zh_CN'
更新.bash_profile文件:

# source /home/你自己的用户名/.bash_profile
  1. 拓展
    第4步也可以在用户家目录下的.bashrc文件中追加alias cman='man -M /usr/local/share/man/zh_CN',然后再更新.bashrc文件

~/.bash_profile: 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.
~/.bashrc: 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该文件被读取.

13、vim 编辑器的使用

三种模式
  • 命令模式:可以在此模式下进行光标移动,以及删除、复制操作等操作,低行模式和插入模式的中间层
  • 插入模式:在此模式下可以向文本添加信息文字
  • 低行模式:在此模式可以保存、退出文本,查找、替换字符以及显示行号等操作
命令模式下的操作
移动
行首行尾
hjkl0$

移动到文件开始位置:g+g
移动到文件末尾: G
跳转到第9行:9 + G

删除
  • 删除单个字符:
    • 删除光标位置的字符:x
    • 删除光标前的字符:X
  • 删除多个字符:
    • 删除单词:光标移动到某个单词的首个字符:按d + w
    • 删除光标之前所有的字符:d + 0
    • 删除光标之前所有的字符:d + $或者 D
    • 删除光标所在行: d + d
    • 删除光标所在行之后n - 1行(包括光标所在行): 行号(n) + d + d
复制
  • 跟删除差不多的操作
  • 复制光标所在的前n个单词:nyb
  • 复制光标所在的后n个单词:nyw
  • 复制光标之前所有的字符:y + 0
  • 复制光标之前所有的字符:y + $
  • 复制光标所在行:y + y
  • 复制光标所在行之后n - 1行(包括光标所在行): 行号(n) + y + y
粘贴
  • 在光标所在行的下一行粘贴内容:p
  • 在光标所在行的上一行粘贴内容:Shift+p
剪切
  • 删除 == 剪切 (前面的删除操作其实真正意义上就是剪切)
撤销操作
  • 按键:u
  • 回撤销:Ctrl+r
通过可视模式选中内容
  • 当你想要选中文本中任意一段内容进行操作:
    1.移动光标到指定内容开头,然后按v进入可视模式,
    2.再用hjkl方向键移动来选择要操作的内容
    3.操作按y即复制,按d即删除
  • 注意:在可视模式复制的情况下粘贴和非可视模式复制的情况有所不同
    • p 会在光标所在位置的后边粘贴内容
    • P 会在光标所在位置的前边粘贴内容
查找
  • 输入 / + 查找内容 从光标位置向下查找
  • 输入 ? + 查找内容 从光标位置向上查找
  • 向上向下切换按键:n依次向下 N依次向上
  • 或者直接查找单词:
    • 把光标放到要查找的单词上,然后按 # 就会选中所有跟这个其他相同的单词,可以通过nN切换
替换
  • 替换单个字符:移动光标到某个字符上,按 r + 要替换的内容
缩进
  • 按键 >+><+<
在文件中查看某个系统函数的帮助文档
  • 查看在当前文件中出现某些系统函数如printf可以通过以下操作
  • [章号]+Shift+k 查看帮助文档(man文档)
命令行模式切换到插入模式
光标后插入光标所在行尾插入
aA
光标前插入光标所在行首插入
iI
光标所在行的下一行插入光标所在行的上一行插入
oO
先删除光标位置的字符,再插入到光标位置先删除光标所在行的内容,再插入到行首
sS
底行模式

a、在命令模式下切换到末行模式用:

b、跳转到某行:直接输入行号

c、如:替换某行的某段内容如替换光标所在行中的wo为women
先将光标移动到指定行,再切换到末行模式
s/wo/women(这只替换这行中第一个wo,需要替换这行中所有的wo则要加上/g)

d、如:替换指定所有行的指定内容如单词
切换到末行模式 输入%s/wo/women/g

如要指定20-24行中的wo替换为women:切换到末行模式 输入20,24s/wo/women/g

总结:% 表示全部 .表示当前行 $表示最末行

e、在末行模式可以输入bash命令,格式:! + bash命令(如!pwd 或者 !ls -l等等)

f、按两次Esc即可切换到命令模式

g、保存 : w 保存退出: wq或者zz或者x 退出不保存: q!

h、在底行模式下也可以复制 :

  • :10,20y 表示复制第10行到20行的内容
  • :.,$-5y 表示复制当前行到倒数第五行的内容
分屏操作

首先必须在末行模式下:

1、sp (当前文件进行分屏)分为上下两个屏

2、vsp + 文件(指定文件进行分屏)分为左右两个屏

3、使用Ctrl+w+w 两个屏中来回切换

4、保存并退出所有文件: wqall

vim自定义配置

vim可以通过修改.vimrc配置文件来改造成一款属于自己的IDE

修改系统级的vim配置文件(/etc/vimrc):所有用户都会应用
修改用户级的vim配置文件(用户的宿主目录下的.vimrc): 只有当前用户应用

我的配置如下

14、gcc编译原理

  1. gcc 编译c文件会经过以下4个步骤:===> 以hello.c 生成hello可执行文件为例
  • 预处理:gcc -E hell0.c -o hello.i
  • 编译:gcc -S hello.i -o hello.s
  • 汇编:gcc -c hello.s -o hello.o
  • 链接:gcc hello.o -o hello

前面这4条命令可以合并成一条:gcc hello.c -o hello
注意:虽然是一条命令,但编译器处理的时候仍然是按照4步处理的
默认生成目标文件为a.out

  1. gcc编译器的一些常用参数-E -S -c -o -g -I -O -Wall -D
    -O : 优化代码(优化级别为0 1 2 3,0表示不优化,数字越大级别越大)
    -D : DEBUG(加宏值)
    -Wall :提示警告信息
    -g :GDB调试时需要加的参数
    -I :提供头文件的路径

15、静态库与动态库

静态库
  • 命名规则:lib + 库名字 + .a

  • 制作步骤:
    (1)需要的文件 :二进制文件(.o)gcc -c *.c将c文件生成二进制文件
    (2)ar rcs + 自定义静态库名字 + 所有的二进制文件(*.o) ==== 需要安装ar

  • 静态库的使用:
    使用方需要 头文件(include目录)+静态库 (通常放在lib目录下)
    两种方法:
    1)直接指定静态库位置
    执行命令:gcc nihao.c -I include lib/libMyTest.a -o app
    2)用参数-L -l指定静态库
    执行命令:gcc main.c -I include -L lib -l MyTest -o app

动态库
  • 命名规则:lib + 库名字 + .so

  • 制作步骤:
    1)c文件 ===> 二进制文件(.o) : gcc -fpic -c *.c
    2)gcc -shared -o + 动态库名字 + 所有的二进制文件(*.o) -I头文件路径

  • 动态库的使用:
    两种使用方法:
    1)直接指定动态库位置:gcc main.c -I include lib/libMytest.so -o app
    2)用参数-L -l指定动态库
    ldd + 可执行程序名称 可以查看当前程序需要的动态库的加载情况
    gcc main.c -I include -L lib -l MyTest -o app

    这时候你会发现动态库链接失败

    四种加载动态库的方法:
    1)把动态库放到/lib目录下(不推荐)
    2)export LDD_LIBRARY_PATH=动态库的绝对路径(临时的,重启终端后又会造成链接动态库失败)
    3)在当前用户家目录下的.bashrc文件中添加export LDD_LIBRARY_PATH=动态库的绝对路径(相对来说永久的,在每次终端启动的时候会执行.bashrc配置文件中的命令)
    4)这种方法最常用
    找到etc/ld.so.conf 配置文件在末尾加上 动态库绝对路径,更新配置文件 sudo ldconfig -v

静态库和动态库的优缺点
  • 优点

    • 静态库:1.发布程序时,不需要提供对应的静态库。2.加载库的速度快
    • 动态库:1.应用程序体积小。2.当库更新时,应用程序不需要重新编译
  • 缺点

    • 静态库:1.库被打包到应用程序中,造成应用程序过于臃肿。2.当库更新时,应用程序需要重新编译
    • 动态库:1.发布程序时需要提供库。2.加载库的速度相对较慢

16、 GDB调试

进入调试:gdb 执行程序名 ===> 前提:执行程序必须是加了调试信息的(-g)

常用操作
list(l)        # 查看载入文件的源代码
start          # 开始启动,只会执行一步就会停下
run(r)         # 程序开始执行, 直到遇到第一个断点才停下
next(n)        # 单步执行 (不会进入所调用的子函数内部)
step(s)        # 单步执行 (会进入所调用的子函数内部)
until          # 运行到函数某一行
continue(c)    # 执行到下一个断点或程序结束
set width + 数目 # 设置GDB的行宽

finish         # 退出当前子函数体(注意循环体中必须没有断点)
u              # 退出当前子函数体
设置断点
break(b) + 文件名:行号(函数名) (不加文件名即为当前文件)
info(i) b						# 查看所有的断点信息
del(delete) 断点号				# 删除断点
clear + 要清除的断点所在行号	# 删除指定行的断点
break(b) + 行号 + if + 条件		# 设置带条件的断点
如  b 10 if i==5   # 在循环语句中很实用
查看值
查看变量的值:		p 变量名
查看变量的类型:		ptype 变量名
观察变量:			watch 变量名      设置观察点,当这个变量被读出或写入的时候程序暂停
查看观察点的信息:	info watchpoints

显示表达式的值:		display + 表达式
查看所有要显示的表达式信息: info display
取消显示表达式的值:	undisplay 编号

改变程序中某个变量的值: set var 变量名=变量值

17、make工程管理工具

make 实际上是一个自动编译管理器,能够根据文件时间戳自动发现更新过的文件从而减少编译的工作量。它通过读入makefile文件的内容执行大量的编译工作,提高了项目开放和维护的工作效率。

makefile编写规则
目标体 : 依赖文件
	命令

命令前必须带一个Tab

The simplest example:

hello.o : hello.c hello.h
	gcc hello.c -o hello.o

稍微复杂一点的,存在子规则。有三个c文件,分别为hello.c、sum.c、sub.c

result : hello.o sum.o sub.o
	gcc hello.o sum.o sub.o -o result

hello.o : hello.c
	gcc -c hello.c -o hello.o
sum.o : sum.c
	gcc -c sum.c -o sum.o
sub.o : sub.c
	gcc -c sub.c -o sub.o

当某个c文件更新时,只会执行跟这个文件相关的命令
只有目标文件不存在或者时间戳比依赖文件早,才会重新编译

变量
自定义变量
  • 递归展开式的定义格式:var = 值
  • 简单扩展式的定义格式:var := 值
  • 变量使用格式:$(var)
预定义变量

CC : > 默认值为cc
CFLAGS:
=> c编译器的选项
ASFLAGS:
> 汇编程序的选项
CPPFLAGS:
===> c预编译的选项

自动变量
  $<     # 第一个依赖文件
  $@     # 目标文件的完整名称
  $^     # 所有不重复的依赖文件,以空格分开
  $+     # 所有的依赖文件,可能包含重复的,以空格分开
  $*     # 不包含扩展名的目标文件名称
  $?     # 所有时间戳比目标文件晚的依赖文件,以空格分开

18、模式规则

%.o : %.c (主要是用来定义相同处理规则的多个文件的)
将上面的例子可改写为

CC=gcc
CFLAGS=-Wall -O -g
obj=hello.o sum.o sub.o
target=result
$(target) : $(obj)
	$(CC) $^ -o $@

%.o : %.c
	$(CC) $(CFLAGS) -c $< -o $@
clean :
	rm -r *.o

clean:
ls -l
加标签 (用于打包,删除,复制等善后工作)
加- 跳过错误命令继续执行下条命令
加-g不会比较目标文件与已存在的文件的更新时间

19、makefile中的相关函数

wildcard

作用:获得指定目录下的文件
例子:src=$(wildcard ./*.c) : src就等价于当前目录下所有c文件

patsubst

作用:转换文件后缀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值