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.cpp 比 main.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 都比较常用
目前入门阶段,先掌握最朴素的写法即可,不急着学更复杂的模式规则。