使用Makefile链接多个文件

时间:2014-03-25 13:33:51

标签: c makefile

我在Makefile业务中迷失了方向,并且我试图接受它。我很乐意,如果有人能够在我目前正在编程的例子中说清楚。

我有这些文件:

my-bit-vector.h -> a header file included in eratost.c, ppm.c
ppm.c -> a .c file which includes my-bit-vector.h and error.h
error.h -> a header file included in eratost.c, ppm.c
error.c -> a .c file which includes error.h and defines the functions in it
erato.c -> a .c file which includes my-bit-vector.h and error.h

我需要将这些链接到一个可执行文件中。我将如何通过Makefile进行此操作?我希望我没有忘记一些事情。你能帮忙吗?

2 个答案:

答案 0 :(得分:3)

program: ppm.o error.o erato.o
    gcc ppm.o error.o erato.o -o program
ppm.o: ppm.c
    gcc -c ppm.c -o ppm.o
error.o: error.c
    gcc -c error.c -o error.o
erato.o: erato.c
    gcc -c erato.c -o erato.o
"之前的东西:"是目标。 "之后的东西:"是此目标的必需目标。 所以,如果你"制作节目" make正在寻找名为" all"的目标。目标都需要ppm.o,它也被定义为makefile中的目标。所以它首先执行这个目标。目标ppm.o需要ppm.c,它没有在makefile中定义的目标,所以它可能是一个文件。我希望这能为您解释基本功能。

http://mrbook.org/tutorials/make/ 对于初学者来说这是一个非常好的教程,有一些基本的makefile示例。

答案 1 :(得分:3)

Makefile的内容,简单来说,就是一个或多个目标(你想要构建的东西)。每个目标都有依赖关系(如果尚未存在任何依赖关系,则必须构建它们,如果它们确实存在,但它们比目标更新,则必须重建目标)和规则(命令到构建目标,可能来自依赖项。)

在您的情况下,假设您的最终输出是名为program的程序。您已经确定了构建它的来源,但是您不能直接从源构建可执行文件,而是从目标文件中创建。您可以像这样启动您的makefile:

program: ppm.o error.o erato.o
        cc -o program ppm.o error.o erato.o

警告规则行上的间距(上面显示的cc命令行)需要一个TAB,而不仅仅是空格!

这足以开始但不足以做对。你会注意到没有目标:.o的依赖/规则,但它仍然有效,因为Make有一些内置规则。

使用此makefile,如果键入" make"两次,第一次你看到所有东西都建成了,第二次它就没有了 - 没有任何改变,所以不需要重建。不幸的是,如果您现在编辑.h,那么.c仍然无法重建,所以请修复:

program: ppm.o error.o erato.o
        cc -o program ppm.o error.o erato.o

ppm.o: ppm.c my-bit-vector.h error.h

error.o: error.c error.h

erato.o: erato.c my-bit-vector.h error.h 

现在,您已将依赖项设置为使make重建源头,这些源必须在标头更改时重建。这些源构建没有规则,因为这里的内置规则(通常)足够了。当然,如果需要,您可以覆盖内置。

在这里,当您键入" make"时,该工具将找到第一个目标(程序)并检查其依赖项。然后,只要有需要考虑构建的目标,它就会确保每个依赖项都是最新的(基于它们的目标:依赖项/规则定义)。最后,它将应用此目标的规则来完成其构建。

使用makefile可以完成很多,这只是一个简短的介绍。