一、入门
1.1 Shell基本操作
Shell 就是“敲命令”,Shell 命令的格式 如下:
command -options [argument]
command: Shell 命令名称。
options:选项,同一种命令可能有不同的选项,不同的选项其实现的功能不同。 argument:Shell 命令是可以带参数的,也可以不带参数运行。
同样以命令“ls”为例,下面“ls”命令的三种不同格式其结果也不同: ls ls –l ls /usr
“ls”命令用来打印出当前目录下的所有文件和文件夹,而“ls -l”同样是 打印出当前目录下的所有文件和文件夹,但是此命令会列出所有文件和文件夹的详细信息,比 如文件大小、拥有者、创建日期等等。最有一个“ls /usr”是用来打印出目录“/usr”下的所有 文件和文件夹。
Shell 命令是支持自动补全功能的,使用自动补全功能以后我们只需要输入命令的前面一部分字 母,然后按下 TAB 键,如果只有一个命令匹配的话就会自动补全这个命令剩下的字母。如果有 多个命令匹配的话系统就会发出报警声音,此时在按下一次 TAB 键就会列出所有匹配的命令,
Shell 下常用的命 令:
1、目录信息查看命令 ls
文件浏览是最基本的操作了,Shell 下文件浏览命令为 ls,格式如下:
ls [选项] [路径]
ls 命令主要用于显示指定目录下的内容,列出指定目录下包含的所有的文件以及子目录, 它的主要参数有:
-a :显示所有的文件以及子目录,包括以“.”开头的隐藏文件。
-l :显示文件的详细信息,比如文件的形态、权限、所有者、大小等信息。
-t :将文件按照创建时间排序列出。
-A :和-a 一样,但是不列出“.”(当前目录)和“..”(父目录)。
-R :递归列出所有文件,包括子目录中的文件。
Shell 命令里面的参数是可以组合在一起用的,比如组合“-al”就是显示所有文件的详细信 息,包括以“.”开头的隐藏文件。
2、目录切换命令
cd 要想在 Shell 中切换到其它的目录,使用的命令是 cd,命令格式如下:
cd [路径]
路径就是我们要进入的目录路径,比如下面所示操作:
cd / //进入到根目录“/”下,Linux 系统的根目录为“/”,
cd /usr //进入到目录“/usr”里面。
cd .. //进入到上一级目录。
cd ~ //切换到当前用户主目录
3、当前路径显示命令 pwd
4、系统信息查看命令
uname 要查看当前系统信息,可以使用命令 uname,命令格式如下:
uname [选项]
可选的选项参数如下:
-r :列出当前系统的具体内核版本号。
-s :列出系统内核名称。
-o :列出系统信息。
5、清屏命令 clear
clear 命令用于清除终端上的所有内容,只留下一行提示符。
6、切换用户执行身份命令 sudo
Ubuntu(Linux)是一个允许多用户的操作系统,其中权限最大的就是超级用户 root,有时候 我们执行一些操作的时候是需要用 root 用户身份才能执行,比如安装软件。通过 sudo 命令可以 使我们暂时将身份切换到 root 用户。当使用 sudo 命令的时候是需要输入密码的,这里要注意输入密码的时候是没有任何提示的!命令格式如下:
sudo [选项] [命令]
选项主要参数如下:
-h :显示帮助信息。
-l :列出当前用户可执行与不可执行的命令
-p :改变询问密码的提示符。
8、删除用户命令 deluser
前面讲了添加用户的命令,那肯定也有删除用户的命令,删除用户使用命令“deluser”,命 令参数如下:
deluser [参数] [用户名]
主要参数有:
-system :当用户是一个系统用户的时候才能删除。
-remove-home :删除用户的主目录
-remove-all-files :删除与用户有关的所有文件。
-backup :备份用户信息
添加用户命令“deluser”要使用“sudo”来以 root 用户运行;
命令“deluser”要使用“sudo”来以 root 用户运行。
9、切换用户命令 su
前面在讲解命令“sudo”的时候说过,“sudo”是以 root 用户身份执行一个命令,并没有更改当前的用户身份,所有需要 root 身份执行的命令都必须在前面加上“sudo”。命令“su”可以 直接将当前用户切换为 root 用户,切换到 root 用户以后就可以尽情的进行任何操作了!因为你 已经获得了系统最高权限,在 root 用户下,所有的命令都可以无障碍执行,不需要在前面加上 “sudo”,“su”命令格式如下:
su [选项] [用户名]
常用选项参数如下:
-c –command :执行指定的命令,执行完毕以后恢复原用户身份。
-login :改变用户身份,同时改变工作目录和 PATH 环境变量。
-m :改变用户身份的时候不改变环境变量
-h :显示帮助信息
注意!!由于 root 用户权限太大,稍微不注意就可能删除掉系统文件,导致系统奔溃,因此强烈建议大家,不要以 root 用户运行 Ubuntu。当要用到 root 身份执行某些命令的时候使用“sudo” 命令即可。
10、显示文件内容命令 cat
查看文件内容是最常见的操作了,在 windows 下可以直接使用记事本查看一个文本文件内 容,linux下也有类似记事本的软件,叫做 gedit,找到一个文本文件,双击打开,默认使用的就是 gedit。
读取文件的内容:
cat [选项] [文件]
选项主要参数如下:
-n :由 1 开始对所有输出的行进行编号。
-b :和-n 类似,但是不对空白行编号。
-s :当遇到连续两个行以上空白行的话就合并为一个行空白行。
11、显示和配置网络属性命令 ifconfig
ubuntu 默认没有 ifconfig 命令,需要自己手动安装,在终端输入如下命令:
sudo apt-get install net-tools
ifconfig 是一个跟网络属性配置和显示密切相关的命令,通过此命令我们可以查看当前网络 属性,也可以通过此命令配置网络属性,比如设置网络 IP 地址等等,此命令格式如下: ifconfig interface options | address
主要参数如下:
interface :网络接口名称,比如 eth0 等。
up :开启网络设备。 down :关闭网络设备。
add :IP 地址,设置网络 IP 地址。
netmask add 子网掩码。
12、系统帮组命令man
Ubuntu 提供了一个命令来帮助用户了解命令的详细信息,那就是“man”命令,通过“man”命令可以查看其它命令的语法格式、主要功能、主要参数说明等, “man”命令格式如下:
man [命令名]
13、系统重启命令reboot
通过点击 Ubuntu 主界面右上角的齿轮按钮来选择关机或者重启系统,同样的我们也可以 使用 Shell 命令“reboot”来重启系统,直接输入命令“reboot”然后点击回车键接口。
14、系统关闭命令poweroff
使用命令“reboot”可以重启系统,使用命令“poweroff”就可以关闭系统,在终端中输入 命令“poweroff”然后按下回车键即可关闭 Ubuntu 系统。
15、软件安装命令install
Ubuntu 下很多软件是需要先自行下载源码,下载源码以后自行编译,编译完成以后使用命令“intsall”来安装。当然 Ubuntu 下也有其它的软件安 装方法,但是用的最多的就是自行编译源码然后安装,尤其是嵌入式 Linux 开发。命令“install”格式如下:
install [选项]... [-T] 源文件 目标文件
或:install [选项]... 源文件... 目录
或:install [选项]... -t 目录 源文件...
或:install [选项]... -d 目录...
“install”命令是将文件(通常是编译后的文件)复制到目的位置,在前三种形式中,将源文 件复制到目标文件或将多个源文件复制到一个已存在的目录中同时设置其所有权和权限模式。 在第四种形式会创建指定的目录。命令“install”通常和命令“apt-get”组合在一起使用的,关 于“apt-get”命令我们稍后会讲解。
1.2 APT下载工具
1、更新本地数据库
sudo apt-get update
2、检查依赖关系
sudo apt-get check
3、软件安装
sudo apt-get install package-name
4、软件更新
sudo apt-get upgrade package-name
5、卸载软件
sudo apt-get remove package-name
1.3 VI/VIM编辑器
先安装 VIM 编辑器,命令如下: sudo apt-get install vim
VIM 默认是以只读模式打开的文档,因此我们要切换到输入模式,切换到输入模式的命令如下:
i :在当前光标所在字符的前面,转为输入模式。
I :在当前光标所在行的行首转换为输入模式。
a :在当前光标所在字符的后面,转为输入模式。
A :在光标所在行的行尾,转换为输入模式。
o :在当前光标所在行的下方,新建一行,并转为输入模式。
O :在当前光标所在行的上方,新建一行,并转为输入模式。
s :删除光标所在字符。
r :替换光标处字符。
Esc可以退出a的输入
1、移动光标指令:
h(或左方向键) :光标左移一个字符。
l(或右方向键) :光标右移一个字符。
j(或下方向键) :光标下移一行。
k(或上方向键) :光标上移一行。
nG :光标移动到第 n 行首。
n+ :光标下移 n 行。
n- :光标上移 n 行。
2、屏幕翻滚指令
Ctrl+f :屏幕向下翻一页,相当于下一页。
Ctrl+b :屏幕向上翻一页,相当于上一页。
3、复制、删除和粘贴指令
cc :删除整行,并且修改整行内容。
dd :删除该行,不提供修改功能。
ndd :删除当前行向下 n 行。
x :删除光标所在的字符。
X :删除光标前面的一个字符。
nyy :复制当前行及其下面 n 行。
p :粘贴最近复制的内容。
在指令模式输入“:”会进入底行模式,可以在其后面输入命令,常用命令如下:
x :保存当前文档并且退出。
q :退出。
w :保存文档。
q! :退出 VI/VIM,不保存文档。
如果我们要退出并保存文本的话需要在“:”底行模式下输入“wq”。
输入“/”进入底行模式可以在文本搜索指定的内容,在“/”后面输入要搜索的内容,然后按下回车键就会在文本中找到匹配的部分。
1.4 文件操作命令
1、创建新文件命令—touch
touch 不仅仅可以用用来创建文本文档,其它类型的文档也可以创建,命令格式如下:
touch [参数] [文件名]
使用 touch 创建文件的时候,如果[文件名]的文件不存在,那就直接创建一个以[文件名]命 名的文件,如果[文件名]文件存在的话就仅仅修改一下此文件的最后修改日期,常用的命令参数如下:
-a :只更改存取时间。
-c :不建立任何文件。
-d<日期> :使用指定的日期,而并非现在日期。
-t<时间> :使用指定的时间,而并非现在时间。
2、文件夹创建命令—mkdir
既然可以创建文件,那么肯定也可以创建文件夹,创建文件夹使用命令“mkdir”,命令格式如下:
mkdir [参数] [文件夹名目录名]
主要参数如下:
-p :如所要创建的目录其上层目录目前还未创建,那么会一起创建上层目录。
3、文件及目录删除命令—rm
此命令格式如下:
rm [参数] [目的文件或文件夹目录名]
命令主要参数如下:
-d :直接把要删除的目录的硬连接数据删成 0,删除该目录。
-f :强制删除文件和文件夹(目录)。
-i :删除文件或者文件夹(目录)之前先询问用户。
-r :递归删除,指定文件夹(目录)下的所有文件和子文件夹全部删除掉。
-v :显示删除过程。
4、文件夹(目录)删除命令—rmdir
“rm”删除文件夹需要加上参数“-rf”,而有可以直接删除文件夹(目录)的命令—rmdir。
命令格式如下:
rmdir [参数] [文件夹(目录)]
命令主要参数如下:
-p 删除指定的文件夹(目录)以后,若上层文件夹(目录)为空文件夹(目录)的话就将其一起删除。
5、文件复制命令—cp
命令描述如下:
cp [参数] [源地址] [目的地址]
主要参数描述如下:
-a :此参数和同时指定“-dpR”参数相同
-d :在复制有符号连接的文件时,保留原始的连接。
-f :强行复制文件,不管要复制的文件是否已经存在于目标目录。
-I :覆盖现有文件之前询问用户。
-p :保留源文件或者目录的属性。
-r 或-R :递归处理,将指定目录下的文件及子目录一并处理
“../”表示上级目录
6、文件移动命令—mv
mv [参数] [源地址] [目的地址]
主要参数描述如下:
-b :如果要覆盖文件的话覆盖前先进行备份。
-f :若目标文件或目录与现在的文件重复,直接覆盖目的文件或目录。
-I :在覆盖之前询问用户。
1.5 命令行进行文件的压缩和解压缩
1.5.1、命令zip
zip 命令看名字就知道是针对.zip 文件的,用于将一个或者多个文件压缩成一个.zip 结尾的文件,命令格式如下:
zip [参数] [压缩文件名.zip] [被压缩的文件]
主要参数函数如下:
-b<工作目录> 指定暂时存放文件的目录。
-d :从 zip 文件中删除一个文件。
-F :尝试修复已经损毁的压缩文件。
-g :将文件压缩入现有的压缩文件中,不需要新建压缩文件。
-h :帮助。
-j :只保存文件的名,不保存目录。
-m :压缩完成以后删除源文件。
-n<字尾符号> :不压缩特定扩展名的文件。
-q :不显示压缩命令执行过程。
-r :递归压缩,将指定目录下的所有文件和子目录一起压缩。
-v :显示指令执行过程。
-num :压缩率,为 1~9 的数值。
1.5.2、命令unzip
unzip 命令用于对.zip 格式的压缩包进行解压,命令格式如下:
unzip [参数] [压缩文件名.zip]
主要参数如下:
-l :显示压缩文件内所包含的文件。
-t :检查压缩文件是否损坏,但不解压。
-v :显示命令显示的执行过程。
-Z :只显示压缩文件的注解。
-C :压缩文件中的文件名称区分大小写。
-j :不处理压缩文件中的原有目录路径。
-L :将压缩文件中的全部文件名改为小写。
-n :解压缩时不要覆盖原有文件。
-P<密码> :解压密码。
-q :静默执行,不显示任何信息。
-x <文件列表>:指定不要处理.zip 中的哪些文件。
-d<目录> :把压缩文件解到指定目录下。
1.5.3、命令tar
前面讲的 zip 和 unzip 这两个是命令只适用于.zip 格式的压缩和解压,其它压缩格式就用不了了,比如 Linux 下最常用的.bz2 和.gz 这两种压缩格式。其它格式的压缩和解压使用命令 tar,tar 将压缩和解压缩集合在一起,使用不同的参数即可,命令格式如下:
tar [参数] [压缩文件名] [被压缩文件名]
常用参数如下:
-c :创建新的压缩文件。
-C<目的目录> :切换到指定的目录。
-f <备份文件>:指定压缩文件。
-j :用 tar 生成压缩文件,然后用 bzip2 进行压缩。
-k :解开备份文件时,不覆盖已有的文件。
-m :还原文件时,不变更文件的更改时间。
-r :新增文件到已存在的备份文件的结尾部分。
-t :列出备份文件内容。
-v :显示指令执行过程。
-w :遭遇问题时先询问用户。
-x :从备份文件中释放文件,也就是解压缩文件。
-z :用 tar 生成压缩文件,用 gzip 压缩。
-Z :用 tar 生成压缩文件,用 compress 压缩。
1.6 文件查询和搜索
1.6.1、命令find
find 命令用于在目录结构中查找文件,其命令格式如下:
find [路径] [参数] [关键字]
路径是要查找的目录路径,如果不写的话表示在当前目录下查找,关键字是文件名的一部 分,主要参数如下:
-name<filename>:按照文件名称查找,查找与 filename 匹配的文件,可使用通配符。
-depth :从指定目录下的最深层的子目录开始查找。
-gid<群组识别码>:查找符合指定的群组识别码的文件或目录。
-group<群组名称>:查找符合指定的群组名称的文件或目录。
-size<文件大小> :查找符合指定文件大小的文件。
-type<文件类型> :查找符合指定文件类型的文件。
-user<拥有者名称> :查找符合指定的拥有者名称的文件或目录。
1.6.2、命令grep
find 命令用于在目录中搜索文件,我们有时候需要在文件中搜索一串关键字,grep 就是完成这个功能的,grep 命令用于查找包含指定关键字的文件,如果发现某个文件的内容包含所指 定的关键字,grep 命令就会把包含指定关键字的这一行标记出来,grep 命令格式如下: grep [参数] 关键字 文件列表
grep 命令一次只能查一个关键字,主要参数如下:
-b :在显示符合关键字的那一列前,标记处该列第 1 个字符的位编号。
-c :计算符合关键字的列数。
-d<进行动作> :当指定要查找的是目录而非文件时,必须使用此参数!否则 grep 指令将回报信息并停止搜索。
-i :忽略字符大小写。
-v :反转查找,只显示不匹配的行。
-r :在指定目录中递归查找。
1.7 文件类型
每个文件的详细信息占一行,每行最前面都是一个符号就标记了当前文件类型。
- :普通文件,一些应用程序创建的,比如文档、图片、音乐等等。
d :目录文件。
c :字符设备文件,Linux 驱动里面的字符设备驱动,比如串口设备,音频设备等。
b :块设备文件,存储设备驱动,比如硬盘,U 盘等。
l :符号连接文件,相当于 Windwos 下的快捷方式。
s :套接字文件。
p :管道文件,主要指 FIFO 文件。
1.8 Linux用户权限管理
1.8.1、权限管理
文件权限数字表示方法
字母 | 二进制 | 八进制 |
r | 100 | 4 |
w | 010 | 2 |
x | 001 | 1 |
权限修改字母表示方法
字母 | 意义 |
r | 可读权限 |
w | 可写权限 |
x | 可执行权限 |
a | 所有用户 |
u | 归属用户 |
g | 归属组 |
o | 其它用户 |
= | 具备权限 |
+ | 添加某权限 |
- | 去除某权限 |
1.8.2、权限管理命令
1、权限修改命令 chmod
命令“chmod”用于修改文件或者文件夹的权限,权限可以使用前面讲的数字表示也可以使用字母表示,命令格式如下:
chmod [参数] [文件名/目录名]
主要参数如下:
-c :效果类似“-v”参数,但仅回显更改的部分。
-f :不显示错误信息。
-R :递归处理,指定目录下的所有文件及其子文件目录一起处理。
-v :显示指令的执行过程。
2、文件归属者修改命令 chown
命令 chown 用来修改某个文件或者目录的归属者用户或者用户组,命令格式如下:
chown [参数] [用户名.<组名>] [文件名/目录]
其中[用户名.<组名>]表示要将文件或者目录改为哪一个用户或者用户组,用户名和组名用 “.”隔开,其中用户名和组名中的任何一个都可以省略,命令主要参数如下:
-c :效果同-v 类似,但仅回报更改的部分。
-f :不显示错误信息。
-h :只对符号连接的文件做修改,不改动其它任何相关的文件。
-R :递归处理,将指定的目录下的所有文件和子目录一起处理。
-v :显示处理过程。
1.9 磁盘管理命令
1、磁盘分区命令 fdisk
如果要对某个磁盘进行分区,可以使用命令 fdisk,命令格如下:
fdisk [参数]
主要参数如下:
-b<区分大小> :指定每个分区的大小。
-l :列出指定设备的分区表。
-s <分区编号>:将指定的分区大小输出到标准的输出上,单位为块。
-u :搭配“-l”参数,会用分区数目取代柱面数目,来表示每个分区的起始地址。
2、格式化命令 mkfs
使用命令 fdisk 创建好一个分区以后,我们需要对其格式化,也就是在这个分区上创建一个 文件系统,Linux 下的格式化命令为 mkfs,命令格式如下:
mkfs [参数] [-t 文件系统类型] [分区名称]
主要参数如下:
fs :指定建立文件系统时的参数
-V :显示版本信息和简要的使用方法。
-v :显示版本信息和详细的使用方法。
3、挂载分区命令 mount
我们创建好分区并且格式化以后肯定是要使用硬盘或者 U 盘的,那么如何访问磁盘呢?比如我的 U 盘就一个分区,为/dev/sdb1,如果直接打开文件/dev/sdb1 会发现根本就不是我们要的结果。我们需要将/dev/sdb1 这个分区挂载到一个文件夹中,然后通过这个文件访问 U盘,磁盘挂载命令为 mount,命令格式如下:
mount [参数] -t [类型] [设备名称] [目的文件夹]
命令主要参数有:
-V :显示程序版本。
-h :显示辅助信息。
-v :显示执行过程详细信息。
-o ro :只读模式挂载。
-o rw :读写模式挂载。
-s-r :等于-o ro。
-w :等于-o rw。
4、卸载命令 umount
当我们不在需要访问已经挂载的 U 盘,可以通过 umount 将其从卸载点卸除,命令格式如 下:
umount [参数] -t [文件系统类型] [设备名称]
-a :卸载/etc/mtab 中的所有文件系统。
-h :显示帮助。
-n :卸载时不要将信息存入到/etc/mtab 文件中
-r :如果无法成功卸载,则尝试以只读的方式重新挂载。
-t<文件系统类型> :仅卸载选项中指定的文件系统。
-v :显示执行过程。
二、Linux C编程入门
2.1 GCC编译器
先安装 build-essential 软件包,build-essential 提供了编译程序所需的所有软件包,输入如下命令:
sudo apt-get install build-essential
等待安装完成,然后输入如下命令查看 GCC 编译器的版本号:
gcc -v
如何使用 GCC 编译器来编译 main.c 文件呢?GCC 编译器是命令模式的,因此需要输入命令来使用 gcc 编译器来编译文件,输入如下命令:
gcc main.c
上述命令的功能就是使用 gcc 编译器来编译 main.c 这个 c 文件。
执行此文件 : “./+可执行文件”。
在使用 gcc 命令的时候加上-o 来指定生成的可执行文件名字,比如编译 main.c 以后生成名为“main”的可执行文件用“gcc main.c –o main”即可。
gcc命令
gcc 命令格式如下:
gcc [选项] [文件名字]
主要选项如下:
-c:只编译不链接为可执行文件,编译器将输入的.c 文件编译为.o 的目标文件。
-o:用来指定编译结束以后的输出文件名,如果使用这个选项的话 GCC 默 认编译出来的可执行文件名字为 a.out。
-g:添加调试信息,如果要使用调试工具(如 GDB)的话就必须加入此选项,此选项指示编 译的时候生成调试所需的符号信息。
-O:对程序进行优化编译,如果使用此选项的话整个源代码在编译、链接的的时候都会进 行优化,这样产生的可执行文件执行效率就高。
-O2:比-O 更幅度更大的优化,生成的可执行效率更高,但是整个编译过程会很慢。
2.2 Makefile基础
解决大工程编译的工具:make,描述哪些文件需要编译、哪些需要重新编译的文件就叫做 Makefile。
Makefile 里面是由一系列的规则组成的,这些规则格式如下:
目标…... : 依赖文件集合……
命令 1
命令 2
……
clean:
命令列表中的每条命令必须以 TAB 键开始,不能使用空格!
make 命令会为 Makefile 中的每个以 TAB 开始的命令创建一个 Shell 进程去执行。
最后一个规则目标是 clean,它没有依赖文件, 因此会默认为依赖文件都是最新的,所以其对应的命令不会执行,当我们想要执行 clean 的话 可以直接使用命令“make clean”,执行以后就会删除当前目录下所有的.o 文件以及 main,因此 clean 的功能就是完成工程的清理
Makefile 变量:Makefile 中变量的引用方法是“$(变量名)”。
1、赋值符“=”
#示例代码 赋值符"="使用
name = zzk
curname = $(name)
name = zuozhongkai
print:
@echo curname: $(curname)
在 Makefile 要输出一串字符的话使用“echo”,就和 C 语言中的“printf”一样。
Make 在执行的过程中会自动输出命令执行过程,在命令前面加上“@”就不会输出命令执行过程。
变量的真实值取决于它所引用的变量的最后一次有效值。
2、赋值符“:=”
#示例代码 ":="的使用
name = zzk
curname := $(name)
name = zuozhongkai
print:
@echo curname: $(curname)
赋值符“:=” 不会使用后面定义的变量,只能使用前面已经定义好的,这就是“=”和“:=”两个的区别
3、赋值符“?=”
“?=”是一个很有用的赋值符,
比如下面这行代码:
curname ?= sky
上述代码的意思就是,如果变量 curname 前面没有被赋值,那么此变量就是“sky”, 如果前面已经赋过值了,那么就使用前面赋的值。
4、变量追加“+=”
Makefile 中的变量是字符串,有时候我们需要给前面已经定义好的变量添加一些字符串进 去,此时就要使用到符号“+=”。
Makefile 模式规则:
%.o : %.c
命令(用自动化变量)
模式规则中,至少在规则的目标定定义中要包涵“%”,否则就是一般规则,目标中的“%” 表示对文件名的匹配,“%”表示长度任意的非空字符串,比如“%.c”就是所有的以.c 结尾的文件,类似与通配符,a.%.c 就表示以 a.开头,以.c 结束的所有文件。
常用的自动化变量
自动化变量 | 描述 |
$@ | 规则中的目标集合,在模式规则中,如果有多个目标的话,“$@”表示匹配模 式中定义的目标集合。 |
$% | 当目标是函数库的时候表示规则中的目标成员名,如果目标不是函数库文件, 那么其值为空。 |
$< | 依赖文件集合中的第一个文件,如果依赖文件是以模式(即“%”)定义的,那么 “$<”就是符合模式的一系列的文件集合。 |
$? | 所有比目标新的依赖目标集合,以空格分开。 |
$^ | 所有依赖文件的集合,使用空格分开,如果在依赖文件中有多个重复的文件, “$^”会去除重复的依赖文件,值保留一份。 |
$+ | 和“$^”类似,但是当依赖文件存在重复的话不会去除重复的依赖文件。 |
$* | 这个变量表示目标模式中"%"及其之前的部分,如果目标是 test/a.test.c,目标模 式为 a.%.c,那么“$*”就是 test/a.test。 |
Makefile 伪目标:Makefile 有一种特殊的目标——伪目标,一般的目标名都是要生成的文件,而伪目标不代 表真正的目标名,在执行 make 命令的时候通过指定这个伪目标来执行其所在规则的定义的命 令。
声明方式如下:
.PHONY : clean(其它同比)
声明 clean 为伪目标以后不管当前目录下是否存在名 为“clean”的文件,输入“make clean”的话规则后面的 rm 命令都会执行。
Makefile 条件判断:
语法有两种如下:
<条件关键字>
<条件为真时执行的语句>
endif
以及:
<条件关键字>
<条件为真时执行的语句>
else
<条件为假时执行的语句>
endif
其中条件关键字有 4 个:ifeq、ifneq、ifdef 和 ifndef,这四个关键字其实分为两对、ifeq 与 ifneq、ifdef 与 ifndef,先来看一下 ifeq 和 ifneq,ifeq 用来判断是否相等,ifneq 就是判断是否不 相等,ifeq 用法如下:
ifeq(<参数1>,<参数0>)
ifeq'<参数1>','<参数2>'
ifeq"<参数1>","<参数2>"
ifeq"<参数1>",'<参数2>'
ifeq'<参数1>',"<参数2>"
上述用法中都是用来比较“参数 1”和“参数 2”是否相同,如果相同则为真,“参数 1”和 “参数 2”可以为函数返回值。ifneq 的用法类似,只不过 ifneq 是用来了比较“参数 1”和“参 数 2”是否不相等,如果不相等的话就为真。
ifdef 和 ifndef 的用法如下:
ifdef<变量名>
如果“变量名”的值非空,那么表示表达式为真,否则表达式为假。“变量名”同样可以是 一个函数的返回值。ifndef 用法类似,但是含义用户 ifdef 相反。
Makefile 函数使用:
Makefile 中的函数是已经定义好的,我们直接使用, 不支持我们自定义函数。
函数的用法如下:
$(函数名 参数集合)
或者
${函数名 参数集合}
函数名和参数之间以“空格”分隔开
1、函数 subst
函数 subst 用来完成字符串替换,调用形式如下:
$(subst<from>,<to>,<text>)
此函数的功能是将字符串中的内容替换为,函数返回被替换以后的字符串。
2、函数 patsubst
函数 patsubst 用来完成模式字符串替换,使用方法如下:
$(patsubst<pattern>,<replacement>,<text>)
此函数查找字符串中的单词是否符合模式,如果匹配就用来 替换掉,可以使用包括通配符“%”,表示任意长度的字符串,函数返回值就是替换后 的字符串。如果中也包涵“%”,那么中的“%”将是中的 那个“%”所代表的字符串。
3、函数 dir
函数 dir 用来获取目录,使用方法如下:
$(dir<names…>)
此函数用来从文件名序列中提取出目录部分,返回值是文件名序列的目录部分。
4、函数 notdir
函数 notdir 看名字就是知道去除文件中的目录部分,也就是提取文件名,用法如下: $(notdir<names...>)
此函数用与从文件名序列中提取出文件名非目录部分。
5、函数 foreach
foreach 函数用来完成循环,用法如下:
$(foreach<var>,<list>,<text>)
此函数的意思就是把参数中的单词逐一取出来放到参数中,然后再执行所 包含的表达式。每次都会返回一个字符串,循环的过程中,中所包含的每个字符串 会以空格隔开,最后当整个循环结束时,所返回的每个字符串所组成的整个字符串将会是 函数 foreach 函数的返回值。
6、函数 wildcard
通配符“%”只能用在规则中,只有在规则中它才会展开,如果在变量定义和函数使用时, 通配符不会自动展开,这个时候就要用到函数 wildcard,使用方法如下:
$(wildcard PATTERN…)
比如:
$(wildcard *.c)
上面的代码是用来获取当前目录下所有的.c 文件,类似“%”。