C makefile和头文件混淆

C makefile和头文件混淆,c,makefile,header,include,C,Makefile,Header,Include,我有几个关于C语言中生成文件、标题和包含文件的一般性问题,我希望得到一个简单易懂的答案,因为所有的教程都从“ok I Understance this”到“what heck is this”只有几行。 假设我有一个程序,我想为它创建一个makefile **fileA.c** contains the main and calls functions in **fileB.c** and **fileC.c** **fileB.c** contains getopts and stdlib

我有几个关于C语言中生成文件、标题和包含文件的一般性问题,我希望得到一个简单易懂的答案,因为所有的教程都从“ok I Understance this”到“what 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头,因为它是从那里调用的?)

我只是搞不清楚包含了哪些标题,以及我在make文件中放了什么来支持make/clean函数。既然fileA.c调用了fileB.cfileC.c中的函数,我是为它们创建头文件并将它们包含在fileA.c中,还是将其写入makefile? 如果我在文件中包含某个文件的头,然后为该文件创建一个makefile,它是否会进入预处理器两次

我想我可能只是混淆了makefile和头文件的实际用途,这让我失去了理智

感谢您抽出时间阅读,如有任何帮助,将不胜感激

编辑:

作为参考

fileA.o: fileA.c fileA.h
${CC} ${CFLAGS} -c fileA.c
所以,既然fileA没有被任何东西调用,那么这是正确的(我确实将地址从fileA传递到fileB和fileC)


fileB.o:是否包含fileB.c fileB.h,仅此而已?或者它会有其他的头吗?

如果fileA.c依赖于fileB.c和fileC.c,那么您的makefile应该是:

fileA: fileB.o fileC.o fileA.o
    $(CC) fileB.o fileC.o fileA.o -o fileA

第一步是忘记makefile。只需在C中设置您的项目,并编译它,手动运行
gcc
命令,或者如果您对此感到厌倦,在shell脚本中一个接一个地编写它们并运行它

在您尝试编写
Makefile
之前,请确保所有这些都运行到您满意的程度

你可能会接到这样的电话

gcc -c fileB.c

如果“手工”编写
Makefile
有困难,则无法编写,明白吗

现在,是编写
Makefile
的时候了。要做到这一点,你需要“规则”。规则是这样的:

file_to_write:  all the files that impact file_to_write
    command to create the file to write
fileA: fileA.o fileB.o fileC.o Makefile
    gcc fileA.o fileB.o fileC.o -o fileA
每个规则都应该描述如何创建一个文件。该文件位于
的左侧。它被称为“目标”。在
的右侧列出了“先决条件”

现在仔细听。先决条件是所有文件,如果更改这些文件,可能会导致目标行为不同

下面是“recipe”,即读取先决条件并生成目标的命令

如果配方读取了一些文件,则这些文件很可能必须在先决条件列表中

例如,您将有一个规则来生成
fileA
,如下所示:

file_to_write:  all the files that impact file_to_write
    command to create the file to write
fileA: fileA.o fileB.o fileC.o Makefile
    gcc fileA.o fileB.o fileC.o -o fileA
你看,如果任何
文件…o
不同,
fileA
也可能不同,这就是它们在必备条件中的原因。此外,您还意识到,如果
Makefile
本身是不同的,那么
fileA
最终可能会不同,因为配方可能已经改变了

理论上,如果您更改了
gcc
文件(例如,对于较新的修订版),也可能会更改
fileA
的功能。但是通常我们不包括像
gcc
这样的工具文件,这些工具文件很少更改,并且不受源代码控制

当然,
fileA.o
还有另一条规则。此规则可能将编译
fileA.c
时读取的
fileA.c
和一些头作为先决条件。等等


fileA.c
不需要规则。为什么?因为它不是由构建创建的,所以它总是已经存在

谢谢你,马克,你写的评论很有道理,我把它倒过来了。关于编译,当我单独编译文件时,它们编译时没有错误。当我使用-gcc-Wall-g-o fileA.c fileB.c fileC.c编译时,会出现一些错误,例如未定义的引用和多个定义。可以安全地假设我误用了头和函数定义?