makefile入门与一些简易windows命令

今日学习内容:Makefile 入门、变量、重定向与 PowerShell 简单快捷键

一、Makefile 是什么

Makefile 用来自动管理编译过程。

原来我需要手动输入:

g++ -c info.cpp -o info.o
g++ -c util.cpp -o util.o
g++ -c main.cpp -o main.o
g++ info.o util.o main.o -o test.exe

使用 Makefile 后,在我的 Windows + MinGW 环境里,需要执行:

mingw32-make

它会根据 Makefile 里的规则自动编译。

注意:有些教程里写的是:

make

但在 Windows 的 MinGW 环境下,经常不是 make,而是:

mingw32-make

这是工具名字不同,不是 Makefile 写法不同。


二、Makefile 的基本格式

Makefile 的基本格式是:

目标文件: 依赖文件执行命令

例如:

main.o: main.cppg++ -c main.cpp -o main.o

含义是:

main.o 由 main.cpp 生成

如果 main.cpp 被修改过,mingw32-make 会重新执行下面的编译命令。

注意:执行命令前面必须是 Tab,不能是普通空格。


三、Makefile 的时间戳判断

Makefile 会比较文件修改时间。

规则大概是:

如果目标文件不存在,就执行命令
如果依赖文件比目标文件新,就执行命令
否则不执行

比如:

main.o: main.cppg++ -c main.cpp -o main.o

如果 main.cppmain.o 新,说明源码被改过,于是重新编译。

如果 main.o 已经比 main.cpp 新,说明不需要重复编译。


四、先生成 .o,再生成 .exe

C++ 工程里常见流程是:

.cpp -> .o -> .exe

例如:

g++ -c main.cpp -o main.o
g++ main.o -o test.exe

第一条命令:

g++ -c main.cpp -o main.o

意思是只编译,不链接,生成 main.o

第二条命令:

g++ main.o -o test.exe

意思是把 .o 文件链接成最终的 .exe 程序。

多文件项目里这样做的好处是:哪个 .cpp 改了,就只重新编译哪个 .cpp,不用每次全部重新编译。


五、Makefile 变量

Makefile 里可以定义变量:

project := test.exe
link := info.o util.o main.o

使用变量时,用:

$(变量名)

例如:

$(project): $(link)g++ $(link) -o $(project)

等价于:

test.exe: info.o util.o main.og++ info.o util.o main.o -o test.exe

这里的 $ 可以理解为:取出变量里的内容。

比如:

$(project)

就是取出:

test.exe
$(link)

就是取出:

info.o util.o main.o

六、一个简单 Makefile

project := test.exe
link := info.o util.o main.o$(project): $(link)g++ $(link) -o $(project)info.o: info.cppg++ -c info.cpp -o info.outil.o: util.cppg++ -c util.cpp -o util.omain.o: main.cppg++ -c main.cpp -o main.oclean:del *.o

执行:

mingw32-make

会编译生成 test.exe

执行:

mingw32-make clean

会执行:

del *.o

删除所有 .o 文件。

这里的:

*.o

表示所有以 .o 结尾的文件,比如:

main.o
info.o
util.o

七、Windows 里的重定向 >

> 是输出重定向。

它的作用是:把程序原本输出到终端的内容,写入文件。

例如:

.\test.exe > log.txt

意思是:

运行 test.exe
把输出写入 log.txt

如果 log.txt 已经存在,会覆盖原来的内容。

如果想追加内容,用:

.\test.exe >> log.txt

区别是:

>   覆盖写入
>>  追加写入

例如:

echo hello > a.txt
echo world >> a.txt

最后 a.txt 里面是:

hello
world

八、错误输出重定向

程序有两种常见输出:

stdout:正常输出
stderr:错误输出

把错误输出写入文件:

.\test.exe 2> error.txt

把正常输出和错误输出都写入同一个文件:

.\test.exe > log.txt 2>&1

简单理解:

> log.txt   把正常输出写入 log.txt
2>&1        把错误输出也合并进去

九、PowerShell 简单快捷键

上一条命令:

下一条命令:

自动补全:

Tab

比如输入:

cd Des

Tab,可能自动补全成:

cd .\Desktop\

按前缀搜索历史命令:

F8

比如输入:

g++

然后按 F8,它会找以前输入过的 g++ 开头的命令。

行首:

Home

行尾:

End

清屏:

cls

或者:

Ctrl + L

中断当前命令:

Ctrl + C

十、今日总结

今天主要学了:

1. Makefile 可以自动管理编译命令
2. Windows + MinGW 环境下,我需要用 mingw32-make,而不是 make
3. Makefile 会根据文件时间戳判断是否需要重新编译
4. C++ 工程常见流程是 .cpp -> .o -> .exe
5. Makefile 变量用 $(变量名) 取值
6. * 是通配符,比如 *.o 表示所有 .o 文件
7. > 可以把程序输出写入文件
8. >> 可以追加输出
9. PowerShell 里 Tab、F8、Home、End 都比较常用

目前入门阶段,先掌握最朴素的写法即可,不急着学更复杂的模式规则。