2010-09-02 47 views
3

我正在开发一个跨越多个C文件的第一个项目。对于我的第一对夫妇的练习程序,我只是在main.c中编写了我的代码,并使用gcc main.c -o main进行编译。当我学习时,这对我有用。什么是有效的C工作流程? - Makefile + bash脚本

现在,我正在自己的一个更大的项目上工作。我想继续自己编译(或者至少手动设置),这样我就可以理解这个过程。读了一下之后,我决定做一个Makefile。

注意:我也使用GTK +,所以我不得不查找如何将它添加到编译命令中。

这是它看起来像一些研究后:

main: 
    gcc -Wall -g main.c -o main `pkg-config --cflags --libs gtk+-2.0` 

起初,我只是跑“做”。然后我有一些问题,即使我已经更改了文件,但得到了“主要是最新的”错误。

所以我写了一个脚本:

#!/bin/bash 
rm main 
make 
./main 

所以我做出改变,然后我运行此脚本。

这是一个很好/正常的系统?我想要有可扩展的系统,因为我的项目会增长。我假设我可以保留这个脚本,只需要添加依赖关系到makefile中,并在makefile中更改主编译命令。我对么?

在此先感谢。

编辑:

感谢有关如何解决我的Makefile中的反馈。

那么是典型的编译过程1)类型make然后2)./main无论项目是如何设置或其大小(假设你已经写了一个合适的makefile)?

+1

是的,你说得对。你先做一个'make'然后做一个'./main' – codaddict 2010-09-02 06:20:49

+0

太好了,谢谢!到目前为止似乎相当容易学习。 – mouche 2010-09-02 06:29:04

回答

10

您需要告诉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,即使依赖关系尚未更新,也可以使用make-B选项,如Sjoerd在其他答案中所建议的那样。

+4

在“clean”目标之上添加一行'.PHONY:clean'是非常有用的,以防万一名为'clean'的文件(例如shell脚本)在目录中结束。如果发生这种情况,make会看到文件并且不运行干净的目标。 “PHONY”告诉它甚至看不到。 – aaronasterling 2010-09-02 06:23:14

+0

非常有用的评论,@aaron。谢谢。 – mouche 2010-09-02 06:30:12

3
  • 使用make -Bmake --always-make编译即使目标是到冒号后
  • 追加文件名日期,检查是否这些被更新。

例子:

a: a.c 
     gcc -o a a.c 

a如果a.ca更新将只建造。

+0

对于一个更大的项目,'make -B'可能不是人们想要使用的。 – 2010-09-02 06:44:55

+0

对。如果某些文件的修改时间不正确,-B会很有用。例如,当您通过输出文件复制某些内容时会发生这种情况。 – Sjoerd 2010-09-02 07:12:43

3

我发现命令行make足够满足我的需求,但手动编写Makefiles变得相当麻烦。随着项目日益复杂化,您会发现手工管理依赖关系变得越来越烦人。我建议你做的是学会如何做以下的至少一个:

  • 写依赖跟踪致电例如,gcc -MMakefile
  • 学习使用Makefile生成器,例如automakeCMake。我个人比较喜欢automake,因为它比较成熟(并且不会像尝试在命令行中放置以分号分隔的列表那样的愚蠢的东西)。
+0

+1提到可用的Makefile生成器。我会检查他们。 – mouche 2010-09-02 17:09:30