基于Linux编写C语言基础命令
目录
一、常用的Linux命令
1、改变及显示目录命令:cd、pwd、ls。
1.1、cd(Change Directory)
1.2、pwd(Print Working Directory)
1.3、ls(List)
2、文件及目录的创建、复制、删除和移动命令:touch、cp、mv、rm、mkdir、rmdir。
2.1、touch
2.2、cp
2.3、mv
2.4、rm
2.5、mkdir
2.6、rmdir
3、显示文件内容命令:cat、more、less、head、tail。
3.1、cat
3.2、more
3.3、less
3.4、head
3.5、tail
4、文件查找命令:find、whereis、grep。
4.1、find
4.2、whereis
4.3、grep
5、文件和目录权限改变命令:chmod。
5.1、权限表示方法
5.2、常用选项
5.3、用法示例
6、备份和压缩命令:tar、gzip、bzip2。
6.1、tar
6.2、gzip
6.3、bzip2
二、GCC(GNU Compile Collection)编译器
1、使用GCC编译程序的4个阶段
1.1、预处理阶段
1.2、编译阶段
1.3、汇编阶段
1.4、链接阶段
2、GCC命令常用选项
2.1、基本格式
2.2、总体选项
2.3、语言选项
2.4、警告选项
2.5、调试选项
2.6、优化选项
2.7、连接器选项
2.8、目录选项
三、Make工程管理器
1、基本概念
2、Makefile 文件结构
3、工作原理
4、常用命令
优点
局限性
一、常用的Linux命令
1、改变及显示目录命令:cd、pwd、ls。
1.1、cd(Change Directory)
- 基本功能:用于切换当前工作目录。
- 语法格式:
cd [目录路径]
- 常用用法
- 切换到指定目录:直接输入绝对路径或相对路径,如
cd /home/user/Documents
会将当前工作目录切换到/home/user/Documents
;cd../..
则会从当前目录向上两级切换。 - 切换到家目录:使用
cd
或cd ~
都可以切换到当前用户的家目录。 - 切换到上一次工作目录:使用
cd -
可以快速切换到上一次所在的工作目录,方便在两个目录之间来回切换。
- 切换到指定目录:直接输入绝对路径或相对路径,如
1.2、pwd(Print Working Directory)
- 基本功能:用于显示当前工作目录的绝对路径。
- 语法格式:
pwd
- 常用用法
- 查看当前所在路径:在命令行中直接输入
pwd
,会输出当前工作目录的完整路径,例如/home/user/Downloads
。 - 在脚本中获取当前路径:在编写 Shell 脚本时,常使用
pwd
命令来获取当前脚本所在的目录路径,以便后续操作中引用该路径。
- 查看当前所在路径:在命令行中直接输入
1.3、ls(List)
- 基本功能:用于列出指定目录中的文件和子目录信息。
- 语法格式:
ls [选项] [目录或文件]
- 常用选项及用法
- 列出当前目录内容:直接输入
ls
,会以默认方式列出当前工作目录下的所有非隐藏文件和子目录,每行显示一个文件或目录,按字母顺序排列。 - 列出指定目录内容:输入
ls /home/user/Pictures
可列出指定目录/home/user/Pictures
中的内容。 - 以长格式列出详细信息:使用
-l
选项,如ls -l
,会以长格式列出文件和目录的详细信息,包括文件类型、权限、硬链接数、所有者、所属组、大小、修改时间和文件名等。 - 列出隐藏文件:使用
-a
选项,如ls -a
,会列出当前目录下的所有文件和目录,包括以.
开头的隐藏文件和隐藏目录。 - 按时间排序列出:使用
-t
选项,如ls -t
,会按照文件的修改时间进行排序,最新修改的文件排在前面。 - 递归列出子目录内容:使用
-R
选项,如ls -R
,会递归地列出当前目录及其所有子目录中的文件和目录。
- 列出当前目录内容:直接输入
2、文件及目录的创建、复制、删除和移动命令:touch、cp、mv、rm、mkdir、rmdir。
2.1、touch
- 基本功能:用于创建空文件或更新文件的时间戳。
- 语法格式:
touch [选项]... 文件...
- 常用用法
- 创建空文件:直接指定文件名,如
touch test.txt
,若文件不存在则创建一个空的test.txt
文件,若文件已存在则更新其访问时间和修改时间为当前时间。 - 同时创建多个文件:可以一次指定多个文件名来创建多个空文件,如
touch file1.txt file2.txt file3.txt
。 - 指定时间戳:使用
-t
选项可以指定特定的时间戳,格式为[[CC]YY]MMDDhhmm[.ss]
,如touch -t 202412171030.00 test.txt
将test.txt
的时间戳设置为 2024 年 12 月 17 日 10 时 30 分 0 秒。
- 创建空文件:直接指定文件名,如
2.2、cp
- 基本功能:用于复制文件或目录。
- 语法格式:
cp [选项] 源文件 目标文件
或cp [选项] 源目录 目标目录
- 常用用法
- 复制文件到指定目录:如
cp file.txt /home/user/Documents/
,将当前目录下的file.txt
复制到/home/user/Documents/
目录下。 - 复制文件并改名:如
cp file.txt newfile.txt
,在当前目录下将file.txt
复制为newfile.txt
。 - 复制目录:使用
-r
或-R
选项可以递归复制目录及其内容,如cp -r dir1 dir2
,将dir1
目录及其所有子目录和文件复制到dir2
目录下。
- 复制文件到指定目录:如
2.3、mv
- 基本功能:用于移动或重命名文件和目录。
- 语法格式:
mv [选项] 源文件 目标文件
或mv [选项] 源目录 目标目录
- 常用用法
- 移动文件到指定目录:如
mv file.txt /home/user/Downloads/
,将当前目录下的file.txt
移动到/home/user/Downloads/
目录下。 - 重命名文件:如
mv oldfile.txt newfile.txt
,将当前目录下的oldfile.txt
重命名为newfile.txt
。 - 移动目录:如
mv dir1 dir2
,将dir1
目录移动到dir2
目录下,如果dir2
不存在,则将dir1
重命名为dir2
。
- 移动文件到指定目录:如
2.4、rm
- 基本功能:用于删除文件或目录。
- 语法格式:
rm [选项] 文件或目录...
- 常用用法
- 删除文件:如
rm file.txt
,删除当前目录下的file.txt
文件,删除前会提示确认。 - 强制删除文件:使用
-f
选项可以强制删除文件,不提示确认,如rm -f file.txt
。 - 删除目录:使用
-r
或-R
选项可以递归删除目录及其内容,如rm -r dir1
,删除dir1
目录及其所有子目录和文件,使用时需谨慎。
- 删除文件:如
2.5、mkdir
- 基本功能:用于创建新的目录。
- 语法格式:
mkdir [选项] 目录名...
- 常用用法
- 创建单个目录:如
mkdir mydir
,在当前目录下创建一个名为mydir
的新目录。 - 同时创建多个目录:可以一次指定多个目录名来创建多个目录,如
mkdir dir1 dir2 dir3
。 - 创建多层目录:使用
-p
选项可以创建多层目录,如mkdir -p a/b/c
,如果a
和a/b
目录不存在,则会先创建它们,再创建a/b/c
目录。
- 创建单个目录:如
2.6、rmdir
- 基本功能:用于删除空目录。
- 语法格式:
rmdir [选项] 目录名...
- 常用用法
- 删除空目录:如
rmdir mydir
,删除当前目录下的空目录mydir
,如果目录非空则删除失败。 - 递归删除空目录:使用
-p
选项可以递归删除空目录及其上级空目录,如rmdir -p a/b/c
,如果c
、b
、a
目录均为空,则依次删除它们。
- 删除空目录:如
3、显示文件内容命令:cat、more、less、head、tail。
3.1、cat
- 基本功能:用于连接文件并打印到标准输出,常用来查看文件内容、创建文件、合并文件等。
- 语法格式:
cat [选项] [文件]...
- 常用选项及用法
- 查看单个文件内容:直接在命令后跟上文件名,如
cat file.txt
,将在终端中显示file.txt
文件的全部内容。 - 查看多个文件内容:可以同时查看多个文件,如
cat file1.txt file2.txt
,会按顺序显示这两个文件的内容,中间没有明显分隔。 - 创建文件:使用重定向符
>
,如cat > newfile.txt
,然后输入内容,按Ctrl + D
结束输入,即可创建一个包含输入内容的newfile.txt
文件。 - 合并文件:使用
>>
,如cat file1.txt >> file2.txt
,会将file1.txt
的内容追加到file2.txt
文件末尾。
- 查看单个文件内容:直接在命令后跟上文件名,如
3.2、more
- 基本功能:用于分页查看文件内容,适合查看大文件,查看时按页显示,可逐页查看。
- 语法格式:
more [选项] [文件]...
- 常用用法
- 基本查看:直接输入
more file.txt
,会以分页形式显示file.txt
的内容,每页显示一定行数,按空格键可翻页,按q
键退出查看。 - 显示行号:使用
-n
选项,如more -n file.txt
,会在每行前面显示行号。
- 基本查看:直接输入
3.3、less
- 基本功能:也是用于分页查看文件内容,但功能更强大、更灵活,支持向前和向后翻页等操作。
- 语法格式:
less [选项] [文件]...
- 常用选项及用法
- 基本查看:如
less file.txt
,以分页形式显示文件内容,可使用上下箭头键逐行滚动,Page Up
和Page Down
键翻页,q
键退出。 - 搜索功能:在查看文件时,按
/
键可进入搜索模式,输入要搜索的内容后按回车键进行搜索,n
键可查找下一个匹配项,N
键查找上一个匹配项。 - 显示行号:使用
-N
选项,如less -N file.txt
,会在每行前面显示行号。
- 基本查看:如
3.4、head
- 基本功能:用于查看文件的开头部分内容。
- 语法格式:
head [选项] [文件]...
- 常用选项及用法
- 默认查看:如
head file.txt
,会显示file.txt
文件的前 10 行内容。 - 指定行数查看:使用
-n
选项可指定显示的行数,如head -n 20 file.txt
,将显示该文件的前 20 行内容。
- 默认查看:如
3.5、tail
- 基本功能:用于查看文件的末尾部分内容。
- 语法格式:
tail [选项] [文件]...
- 常用选项及用法
- 默认查看:如
tail file.txt
,会显示file.txt
文件的后 10 行内容。 - 指定行数查看:使用
-n
选项可指定显示的行数,如tail -n 15 file.txt
,将显示该文件的后 15 行内容。 - 实时查看文件末尾:使用
-f
选项,如tail -f file.txt
,会实时跟踪文件的变化,当文件内容有增加时,会自动显示新增的内容,常用于查看日志文件。
- 默认查看:如
4、文件查找命令:find、whereis、grep。
4.1、find
- 基本功能:用于在指定目录及其子目录下查找文件或目录,可根据文件的名称、类型、大小、时间等属性进行查找。
- 语法格式:
find [路径] [表达式]
- 常用选项及用法
- 按名称查找:使用
-name
选项,如find /home -name "*.txt"
,会在/home
目录及其子目录下查找所有以.txt
为后缀的文件。 - 按类型查找:使用
-type
选项,如find / -type d
,会在根目录下查找所有的目录。常见的文件类型有f
(普通文件)、d
(目录)、l
(符号链接)等。 - 按大小查找:使用
-size
选项,如find /var -size +10M
,会在/var
目录及其子目录下查找大小大于 10MB 的文件。 - 按时间查找:使用
-mtime
(修改时间)、-atime
(访问时间)、-ctime
(状态改变时间)等选项,如find /tmp -mtime -7
,会查找/tmp
目录下在过去 7 天内修改过的文件。
- 按名称查找:使用
4.2、whereis
- 基本功能:用于查找指定命令的二进制文件、源文件和帮助文档所在的位置。
- 语法格式:
whereis [选项] [命令名]
- 常用选项及用法
- 基本查找:如
whereis ls
,会显示ls
命令的二进制文件、源文件和帮助文档的位置。如果只找到二进制文件,会显示类似ls: /bin/ls
的结果。 - 只查找二进制文件:使用
-b
选项,如whereis -b gcc
,只显示gcc
命令的二进制文件所在位置。 - 只查找帮助文档:使用
-m
选项,如whereis -m awk
,只显示awk
命令的帮助文档所在位置。
- 基本查找:如
4.3、grep
- 基本功能:用于在文件中搜索指定的字符串或模式,支持正则表达式,常用来查找包含特定内容的行。
- 语法格式:
grep [选项] [模式] [文件]...
- 常用选项及用法
- 基本搜索:如
grep "hello" file.txt
,会在file.txt
文件中查找包含hello
字符串的行,并将这些行显示出来。 - 忽略大小写搜索:使用
-i
选项,如grep -i "world" file.txt
,会忽略大小写在file.txt
中查找包含world
的行。 - 递归搜索多个文件:使用
-r
选项,如grep -r "error" /var/log/
,会在/var/log
目录及其子目录下的所有文件中递归查找包含error
的行。 - 显示行号:使用
-n
选项,如grep -n "warning" file.txt
,会在显示匹配行的同时显示行号。
- 基本搜索:如
5、文件和目录权限改变命令:chmod。
5.1、权限表示方法
- 字符表示法
- 用户类型:
u
表示文件所有者(user);g
表示同组用户(group);o
表示其他用户(others);a
表示所有用户(all),即u
、g
、o
的总和。 - 权限类型:
r
表示读权限(read);w
表示写权限(write);x
表示执行权限(execute);-
表示没有相应权限。
- 用户类型:
- 数字表示法:将
r
、w
、x
分别对应数字 4、2、1,没有权限则为 0。然后将每种用户类型的权限对应的数字相加,得到一个三位数字,分别表示所有者、同组用户、其他用户的权限。例如,755
表示所有者具有读、写、执行权限(4+2+1=7
),同组用户和其他用户具有读和执行权限(4+1=5
)。
5.2、常用选项
- -R:递归地改变指定目录及其子目录下所有文件和目录的权限。如果不加此选项,只改变指定文件或目录的权限,而不影响其子目录和文件。
5.3、用法示例
- 字符表示法
- 给文件
file.txt
的所有者添加执行权限,可使用chmod u+x file.txt
。 - 给文件
file.txt
的同组用户和其他用户添加写权限,可使用chmod g+w,o+w file.txt
。 - 撤销文件
file.txt
所有用户的写权限,可使用chmod a-w file.txt
。
- 给文件
- 数字表示法
- 将文件
file.txt
的权限设置为所有者具有读、写、执行权限,同组用户和其他用户具有读和执行权限,可使用chmod 755 file.txt
。 - 将目录
dir
及其子目录下所有文件的权限设置为所有者具有读、写权限,同组用户和其他用户具有读权限,可使用chmod -R 644 dir
。
- 将文件
6、备份和压缩命令:tar、gzip、bzip2。
6.1、tar
- 基本功能:用于将多个文件或目录打包成一个文件,也可以从打包文件中解包出文件或目录,通常用于文件备份、归档等操作。
- 语法格式:
tar [选项] [文件或目录]
- 常用选项及用法
- 打包文件:使用
-c
选项创建新的打包文件,如tar -cvf archive.tar file1 file2 dir1
,将file1
、file2
和dir1
打包成archive.tar
文件。-v
选项用于显示详细的打包过程。 - 解包文件:使用
-x
选项解包文件,如tar -xvf archive.tar
,将archive.tar
中的文件和目录解包到当前目录下。 - 查看打包文件内容:使用
-t
选项查看打包文件中的文件列表,如tar -tvf archive.tar
,会列出archive.tar
中包含的所有文件和目录及其详细信息。 - 压缩打包文件:可以结合
-z
(使用gzip
压缩)或-j
(使用bzip2
压缩)选项进行压缩打包,如tar -czvf archive.tar.gz file1 file2 dir1
,将file1
、file2
和dir1
打包并使用gzip
压缩成archive.tar.gz
文件。 - 解压压缩包:对于使用
gzip
或bzip2
压缩的tar
包,解压时也需要使用相应的选项,如tar -xzvf archive.tar.gz
或tar -xjvf archive.tar.bz2
。
- 打包文件:使用
6.2、gzip
- 基本功能:用于对文件进行
gzip
压缩和解压缩,通常会将原文件压缩成一个以.gz
为后缀的文件,并删除原文件。 - 语法格式:
gzip [选项] [文件]
- 常用选项及用法
- 压缩文件:直接指定要压缩的文件,如
gzip file.txt
,会将file.txt
压缩成file.txt.gz
,并删除原file.txt
文件。 - 解压缩文件:使用
-d
选项解压缩文件,如gzip -d file.txt.gz
,会将file.txt.gz
解压缩成file.txt
。也可以使用gunzip
命令,它与gzip -d
等价。 - 查看压缩文件内容:使用
-c
选项可以将压缩文件的内容输出到标准输出,而不进行解压缩,如gzip -c file.txt.gz | more
,可以查看file.txt.gz
中的内容。 - 保留原文件压缩:使用
-k
选项可以在压缩文件的同时保留原文件,如gzip -k file.txt
,会生成file.txt.gz
文件,同时保留file.txt
原文件。
- 压缩文件:直接指定要压缩的文件,如
6.3、bzip2
- 基本功能:用于对文件进行
bzip2
压缩和解压缩,与gzip
类似,但通常压缩比更高,生成的文件以.bz2
为后缀。 - 语法格式:
bzip2 [选项] [文件]
- 常用选项及用法
-
压缩文件:如
bzip2 file.txt
,会将file.txt
压缩成file.txt.bz2
,并删除原文件。 -
解压缩文件:使用
-d
选项解压缩文件,如bzip2 -d file.txt.bz2
,会将file.txt.bz2
解压缩成file.txt
。也可以使用bunzip2
命令,它与bzip2 -d
等价。 -
查看压缩文件内容:使用
-c
选项可将压缩文件内容输出到标准输出,如bzip2 -c file.txt.bz2 | less
,可查看file.txt.bz2
中的内容。 -
保留原文件压缩:使用
-k
选项可在压缩文件同时保留原文件,如bzip2 -k file.txt
,会生成file.txt.bz2
文件,同时保留file.txt
原文件。
-
二、GCC(GNU Compile Collection)编译器
1、使用GCC编译程序的4个阶段
1.1、预处理阶段
- 主要任务:处理以
#
开头的预处理指令,如#include
、#define
、#ifdef
等。将源文件中的这些指令进行相应的处理,生成一个经过预处理的中间文件。 - 具体操作
- 头文件展开:对于
#include
指令,将指定的头文件内容复制到源文件中该指令所在的位置。 - 宏替换:对
#define
定义的宏进行替换,将源文件中出现的宏名用其定义的内容替换。 - 条件编译:根据
#ifdef
、#ifndef
、#else
、#endif
等条件编译指令,决定哪些代码需要编译,哪些代码需要忽略。
- 头文件展开:对于
- 生成文件:通常以
.i
为扩展名,例如test.c
经过预处理后生成test.i
文件。
1.2、编译阶段
- 主要任务:将预处理后的文件进行词法分析、语法分析、语义分析和代码生成等操作,将 C 语言代码转换为汇编语言代码。
- 具体操作
- 词法分析:将输入的字符流按照一定的规则分割成一个个单词,如关键字、标识符、常量、运算符等。
- 语法分析:根据 C 语言的语法规则,对单词序列进行分析,构建出对应的语法树。
- 语义分析:对语法树进行语义检查,确保程序的语义正确性,如检查变量是否声明、类型是否匹配等。
- 代码生成:根据语义分析的结果,将 C 语言代码转换为对应的汇编语言代码。
- 生成文件:通常以
.s
为扩展名,例如test.i
经过编译后生成test.s
文件。
1.3、汇编阶段
- 主要任务:将汇编语言代码转换为机器语言指令,生成可重定位的目标文件。
- 具体操作:汇编器将汇编语言代码中的助记符指令转换为对应的二进制机器指令,同时处理符号定义和引用等问题,生成目标文件。
- 生成文件:通常以
.o
为扩展名,例如test.s
经过汇编后生成test.o
文件。
1.4、链接阶段
-
主要任务:将多个目标文件以及可能需要的库文件链接在一起,生成可执行文件。
-
具体操作
- 符号解析:在各个目标文件中,可能存在对外部符号的引用,链接器需要在其他目标文件或库文件中找到这些符号的定义,并将它们正确地链接在一起。
- 重定位:对目标文件中的代码和数据进行重定位,使它们在最终的可执行文件中具有正确的地址。
- 库文件链接:如果程序中使用了库函数,链接器需要将相应的库文件链接到可执行文件中。
-
生成文件:最终生成可执行文件,在 Linux 系统中通常没有固定的扩展名,在 Windows 系统中通常以
.exe
为扩展名,例如test.o
经过链接后生成test
(Linux)或test.exe
(Windows)文件。
2、GCC命令常用选项
2.1、基本格式
gcc [选项] 源文件 [目标文件]
2.2、总体选项
- -c:只进行编译,不进行链接,生成目标文件(.o)。例如:
gcc -c main.c
将生成main.o
文件。 - -E:只对源文件进行预处理,生成(.i)文件。例如:gcc -E test.c -o test.i 将生成test.i文件。
- -S:只对源文件进行编译,生成(.s)文件。例如:gcc -S mian.c -o main.s 将生成main.s文件。
- -o:指定输出文件的名称。例如:
gcc main.c -o myprogram
将编译main.c
并生成名为myprogram
的可执行文件。 - -v:显示详细的编译过程信息,包括调用的编译器程序、编译选项、搜索的头文件路径等。
2.3、语言选项
- -std=:指定使用的 C 或 C++ 语言标准。例如,
-std=c99
用于指定使用 C99 标准编译 C 程序,-std=c++11
用于指定使用 C++11 标准编译 C++ 程序。 - -x:指定输入文件的语言类型。例如,
-x c
表示输入文件是 C 语言源文件,-x c++
表示输入文件是 C++ 语言源文件。
2.4、警告选项
- -Wall:启用所有常见的警告信息,有助于发现程序中的潜在问题,如未使用的变量、类型不匹配等。
- -Werror:将警告视为错误,当出现警告时停止编译,强制要求代码无警告。
- -Wextra:启用额外的警告信息,比
-Wall
更严格,能发现更多潜在问题。
2.5、调试选项
- -g:生成带有调试信息的目标文件,方便使用调试器进行调试。例如,
gcc -g main.c -o main
生成的main
可执行文件可在调试器中查看变量、跟踪程序执行流程等。 - -ggdb:生成适用于 GDB 调试器的更详细的调试信息,提供更多调试功能。
2.6、优化选项
- -O0:不进行优化,编译速度最快,但生成的代码执行效率可能较低。
- -O1:进行基本的优化,如删除无用代码、简化表达式等,在编译时间和代码执行效率之间取得平衡。
- -O2:进行更高级的优化,包括循环展开、函数内联等,能显著提高代码执行效率,但可能会增加编译时间和目标文件大小。
- -O3:进行最高级的优化,除了
-O2
的优化外,还可能进行一些更激进的优化,如指令调度等,可能会进一步提高代码执行效率,但也可能导致一些问题,如代码体积过大或编译时间过长。
2.7、连接器选项
- -l:指定要链接的库。例如,
-lm
表示链接数学库libm.so
或libm.a
,用于使用数学函数时。 - -L:指定库文件的搜索路径。例如,
-L/usr/local/lib
表示在/usr/local/lib
目录下搜索库文件。
2.8、目录选项
-
-I:指定头文件的搜索路径。例如,
-I/usr/include/mysql
表示在/usr/include/mysql
目录下搜索头文件。 -
-B:指定编译器的搜索路径,包括预处理器、编译器和连接器等工具的搜索路径。
三、Make工程管理器
1、基本概念
- 依赖关系:指文件之间的相互依赖,例如一个源文件可能依赖于某个头文件,而可执行文件依赖于多个目标文件等。Make 会根据这些依赖关系来确定哪些文件需要重新构建。
- 规则:用于描述如何从依赖文件生成目标文件,通常包括目标文件、依赖文件列表和生成目标文件的命令。
2、Makefile 文件结构
- 基本格式:Makefile 由一系列规则组成,每条规则的基本格式如下:
makefile:
目标文件: 依赖文件列表
命令
其中,目标文件是需要生成的文件,依赖文件列表是生成目标文件所依赖的文件,命令则是用于生成目标文件的具体操作,命令前必须以制表符(Tab
)开头。
- 变量定义:可以使用变量来简化 Makefile 的编写,变量通常在文件开头定义,使用
$(变量名)
的形式来引用变量。例如:
makefile
CC=gcc
CFLAGS=-Wall -O2
- 注释:以
#
开头的行表示注释,用于对 Makefile 中的规则、变量等进行说明。
3、工作原理
- 读取 Makefile:当执行
make
命令时,Make 工程管理器会首先在当前目录下查找Makefile
或makefile
文件,并读取其中的内容。 - 分析依赖关系:根据 Makefile 中的规则,分析目标文件与依赖文件之间的依赖关系,构建一个依赖关系图。
- 检查文件时间戳:比较目标文件和依赖文件的时间戳,如果依赖文件的时间戳比目标文件新,或者目标文件不存在,则表示目标文件需要重新构建。
- 执行构建命令:对于需要重新构建的目标文件,Make 会按照规则中的命令依次执行,生成目标文件。
4、常用命令
- make:在当前目录下执行
Makefile
中的默认目标,通常是生成可执行文件。 - make clean:用于清除编译过程中生成的中间文件和目标文件,如
.o
文件、可执行文件等,通常在Makefile
中定义一个名为clean
的目标来实现。 - make install:将生成的可执行文件、库文件等安装到指定的目录中,通常在
Makefile
中定义一个名为install
的目标来实现。
优点
- 自动化构建:可以自动检测文件的依赖关系,根据文件的修改情况自动重新构建项目,大大提高了软件开发的效率。
- 跨平台性:Makefile 文件可以在不同的操作系统和编译器环境下使用,只需要根据实际情况修改少量的编译选项和命令即可。
- 易于维护:通过 Makefile 文件可以清晰地描述项目中文件的依赖关系和构建规则,方便项目的维护和管理,当项目规模较大时,优势更加明显。
局限性
-
语法复杂:Makefile 的语法相对复杂,对于初学者来说,可能需要一定的时间来学习和掌握,编写复杂的 Makefile 文件可能会出现错误。
-
依赖关系管理困难:当项目规模较大、依赖关系复杂时,手动维护 Makefile 中的依赖关系可能会变得困难,容易出现遗漏或错误。
-
不适合动态项目:对于动态生成文件或依赖关系经常变化的项目,Make 可能无法很好地适应,需要手动调整 Makefile 或使用其他更灵活的构建工具。