什么是C的高效工作流程? – Makefile + bash脚本
我正在开发一个跨越多个C文件的项目。 对于我的第一对练习程序,我只是在main.c
编写了代码并使用gcc main.c -o main
编译。 在我学习的过程中,这对我有用。
现在,我正在研究一个更大的项目。 我想继续自己编译(或者至少手动设置),这样我就可以理解这个过程了。 读了一下后,我决定制作一个Makefile。
注意:我也在使用GTK +,因此我必须查找如何将其添加到compile命令中。
这是经过一些研究后的样子:
main: gcc -Wall -g main.c -o main `pkg-config --cflags --libs gtk+-2.0`
起初,我只是在运行“make”。 然后我遇到一些问题,即使我更改了文件,也会出现错误“main is latest”。
所以我写了一个脚本:
#!/bin/bash rm main make ./main
所以我做了更改,然后运行这个脚本。
这是一个好的/正常的系统吗? 我希望拥有可扩展的系统,因为我的项目将会增长。 我假设我可以保留该脚本,只需将依赖项添加到makefile并更改makefile中的主编译命令。 我对么?
提前致谢。
编辑:
感谢您提供有关如何修复Makefile的反馈。
那么典型的编译过程1)类型make
然后2) ./main
无论项目如何设置或其大小(假设你已经编写了正确的makefile)?
你需要告诉make main
取决于main.c
这样每次你对main.c
进行更改然后运行make
,都会重新生成main
。 要删除main
您可以将名为clean
的假目标视为:
main:main.c gcc -Wall -g main.c -o main `pkg-config --cflags --libs gtk+-2.0` .PHONY: clean clean: rm -f main
现在删除main
你可以做: make clean
如果你得到make: main is up to date.
这意味着你没有修改main.c
,因此不需要重新生成main
。 但是如果你必须强制重新生成main
即使尚未更新依赖项,你也可以使用Sjoerd在其他答案中建议的make
的-B
选项。
- 即使目标是最新的,也
make --always-make
使用make -B
或make --always-make
进行编译 - 在冒号后附加文件名以检查是否更新了这些文件名。
例:
a: ac gcc -oa ac
只有当ac
比a
更新时才会构建a
。
我发现命令行make
足以满足我的需求,但是手工编写Makefiles
变得非常繁琐。 随着项目复杂性的增加,您会发现手动管理依赖项会变得越来越烦人。 我建议你做的是学习如何做至少下列之一:
- 通过调用例如
gcc -M
编写依赖关系跟踪Makefile
。 - 学习使用
Makefile
生成器,例如automake
或CMake
。 我个人更喜欢automake
因为它更成熟(并且不会做愚蠢的事情,比如尝试在命令行上放置以分号分隔的列表)。