如何正确制作makefile,为什么这个makefile不正确

时间:2013-10-25 23:03:25

标签: c linux makefile

我试图了解如何在Linux中制作一个make文件,有人建议我使用它:

target: mytalkc.c mytalkd.c
    gcc mytalkc.c -o mytalkc
    gcc mytalkd.c -o mytalkd

当在终端中使用“make”完全执行上面的代码时,所有内容都运行良好,所有内容都已编译并成功执行。所以我认为这是正确的,我把它用于我的makefile。

在进一步的文档后,我了解到制作makefile的正确方法不是我上面的那个......

我的问题是,为什么“目标:”工作以及为什么make能够完成所有事情而没有错误。另外为什么make文件中使用的“all:”比“target:”?

提前表示感谢,如果看起来很明显,我很抱歉,但我是Linux编程新手。

2 个答案:

答案 0 :(得分:1)

通常,makefile被构造为多个目标规则,其中包含可能依赖于其他依赖性的依赖性等。 “all”这个词暗示着“所有目标”,这意味着建立了“所有”目标的任何依赖关系。另外,make的一些实现允许伪目标,例如“all”,告诉make不要在预定义的后缀列表中查找带有后缀之一的文件,例如“all.c”来构建二进制文件(程序) )文件名为“all”。

关于为什么“目标”有效的实际问题与make的行为有关。除非给出特定目标,否则它会自动生成makefile中的第一个目标。在你的情况下,“target”是你文件中的第一个目标,所以“make”本身会使它(通常使用“all”代替它,但它只是一个名字;你应该使用“all”来简单地因为它是常见的做法)。

以下是如何使用多个目标重新编写文件的示例(请参阅make实用程序的文档以了解语法,例如“info make”或“man make”):

all: mytalkc mytalkd

mytalkc: mytalkc.c
    gcc $< -o $@

mytalkd: mytalkd.c
    gcc $< -o $@

在本答案的范围之外还有很多其他事情需要解决,包括隐式后缀规则和编译程序/库的几个单独部分以创建程序(将makefile规则拆分为program/library: object1.o object2.o main.o然后例如object1.o: object1.c)的个别规则。但是,这些是您现在需要了解的基础知识。

答案 1 :(得分:0)

据我所知,如果使用gcc mytalkc.c -o mytalkc进行编译,你只是将源文件编译为对象,这意味着编译进行得很顺利,但是文件仍然无法执行,因为你还没有完成任何喜欢。

试试这个:

all: mytalkc.o mytalkd.o

mytalkc.o: mytalkc.c
gcc mytalkc.c -c mytalkc.c

mytalkd.o: mytalkd.d
gcc mytalkc.c -c mytalkd.c

调用make all