-1

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

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

在终端中完全使用“make”执行上述代码时,一切运行良好,所有内容都编译并成功生成了可执行文件。所以我认为这是正确的,我将它用于我的makefile。

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

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

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

4

2 回答 2

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)。但是,这些是您现在需要了解的基础知识。

于 2013-10-25T23:41:49.073 回答
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

于 2013-10-25T23:22:37.373 回答