如何解决C语言的Makefile
您好,我很难理解makefile。我和他们一起玩耍以更好地了解他们,但这是问题所在:
all: main
main: main.o funcIO.o funcMan.o
$(CC) -o $@ $^
----------------------------------
funcIO.o: funcIO.c
$(CC) -c -o funcIO.o funcIO.c
funcMan.o: funcMan.o
$(CC) -c -o funcMan.o funcMan.c
无论删节线下面的所有内容是否存在,此方法均有效。有人告诉我这是编写makefile的正确方法,但是为什么在没有目标funcIO.o和funcMan.o的情况下它可以工作,如果在没有目标的情况下也可以工作,我们为什么要编写它们?你能像我五岁那样解释吗?
感谢您的时间!
解决方法
假设您使用的是GNU Make(对于其他Makes可能是相同的),由于built-in rules,此方法有效。使Make知道如何编译C源文件,除非另有说明,否则它将对它应用此配方:
%.o: %.c
$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<
$@
是规则的目标(.o
文件的文件名),$<
是第一个前提条件(.c
文件的文件名)。其他变量具有合理的默认值(大多数为空)。
使用Makefile的正确方法是使它们尽可能小。 Makefile是关于确定依赖项的,并且只能用于构建程序。这是我重写您的Makefile的方法:
all: main
main: main.o funcIO.o funcMan.o
我只将all
目标放在那里,因为您首先要使用它。 Make包含一系列内置规则,这些规则知道在给定某些文件作为输入的情况下如何构建事物。如果您要求提供.o
文件,它将查找具有相同名称但扩展名为.c
,.cpp
,.f77
等的文件,并运行该规则,以使用该先决条件文件构建要求的内容。您甚至不需要指定如何构建它们,它们是免费提供的!如我上面的示例所示,需要阐明更复杂的关系(例如最终的二进制文件)。从.o
文件中构建二进制文件有一个相似的规则(假设其中一个文件与您的二进制文件具有相同的名称),因此您无需指定 any 任务,只是依赖关系。您可以通过调整特殊标志来控制它们的运行方式:
CFLAGS += -Wall -Wextra -Wpedantic
main: main.o funcIO.c funcMan.o
main: LDLIBS += -lm
此版本使用CFLAGS
构建每个C编译的文件,并在链接到main
数学库中的同时构建-lm
。
如果要构建普通的C程序,我强烈建议您使用此方法。指定最终二进制文件的先决条件,并通过这些Make变量构建控件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。