我有几个关于在C中生成文件、头文件和包含文件的一般性问题,希望得到一个容易理解的答案,因为所有的教程都是从“ok I understand this”到“what the heck is this”的。
假设我有一个程序要为其创建makefile。

**fileA.c** contains the main and calls functions in **fileB.c** and **fileC.c**

**fileB.c** contains getopts and stdlib but no other file or function from other file

(所以正常的标题,对吗?没有链接到任何其他文件,因为它不调用任何内容。或者应该有fileA.c头,因为它是从那里调用的?)
**fileC.c** contains functions that call header1.h (given header file for library)

我只是搞不清包含了什么头文件,以及我在make文件中放了什么来支持make/clean函数。由于fileA.c从fileB.c和fileC.c调用函数,我是为它们创建头并将它们包含在fileA.c中,还是将其写入makefile中?
如果我在文件中包含某个头,然后为该文件创建一个makefile,它是否会转到预处理器两次?
我想我可能只是混淆了makefile和头文件的实际用途,这导致我失去了理智。
感谢您抽出时间阅读,如有任何帮助,我们将不胜感激。
编辑:
作为参考,
fileA.o: fileA.c fileA.h
${CC} ${CFLAGS} -c fileA.c

所以,既然fileA没有被任何东西调用,那么这是正确的(我确实将地址从fileA传递给fileB和fileC)?
文件B.o:包含文件B.c文件B.h,就这样?或者其他的标题呢?

最佳答案

对您来说,第一步是忘记makefile。只需在C中设置您的项目,并编译它,手动运行gcc命令,或者如果您对此感到厌倦,则在shell脚本中一个接一个地编写它们并运行它。
在尝试编写Makefile之前,请确保所有操作都能让您满意。
你可能会接到这样的电话

gcc -c fileB.c


gcc fileA.o fileB.o fileC.o -o fileA

如果你“手工”做起来有困难,就不能写Makefile,明白吗?
现在,是写Makefile的时候了。要做到这一点,你需要“规则”。规则是这样的:
file_to_write:  all the files that impact file_to_write
    command to create the file to write

每个规则都应该描述如何创建一个文件。那个文件在:的左边。它被称为“目标”。:右侧列出了“先决条件”。
现在仔细听。先决条件是所有文件,如果更改这些文件,可能会导致目标的行为不同。
下面是“recipe”,即读取先决条件并生成目标的命令。
如果配方读取某些文件,则这些文件很可能必须在先决条件列表中。
因此,例如,您将有一个规则来生成这样的fileA
fileA: fileA.o fileB.o fileC.o Makefile
    gcc fileA.o fileB.o fileC.o -o fileA

你看,如果任何file....o是不同的,fileA也可能是不同的,这就是为什么它们在先决条件中。而且,你也知道,如果Makefile本身是不同的,那么fileA最终可能会不同,因为配方可能已经改变了。
理论上,如果您更改了gcc文件(例如,对于较新的修订版),也可能会更改fileA的功能。但通常我们不包括像gcc这样的工具文件,这些文件很少更改并且不受源代码管理。
当然,对于fileA.o,您将有另一个规则。此规则可能有fileA.c和编译fileA.c时读取的一些头文件作为先决条件。等等。
fileA.c不需要规则。为什么?因为它不是由构建创建的,所以它总是在那里。

关于c - C makefile和 header 混淆,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26810873/

10-09 18:40