我试图了解如何在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编程新手。
答案 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