什么是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 -Bmake --always-make进行编译
  • 在冒号后附加文件名以检查是否更新了这些文件名。

例:

 a: ac gcc -oa ac 

只有当aca更新时才会构建a

我发现命令行make足以满足我的需求,但是手工编写Makefiles变得非常繁琐。 随着项目复杂性的增加,您会发现手动管理依赖项会变得越来越烦人。 我建议你做的是学习如何做至少下列之一:

  • 通过调用例如gcc -M编写依赖关系跟踪Makefile
  • 学习使用Makefile生成器,例如automakeCMake 。 我个人更喜欢automake因为它更成熟(并且不会做愚蠢的事情,比如尝试在命令行上放置以分号分隔的列表)。