C makefile和头文件混淆
我有几个关于C语言中生成文件、标题和包含文件的一般性问题,我希望得到一个简单易懂的答案,因为所有的教程都从“ok I Understance this”到“what heck is this”只有几行。 假设我有一个程序,我想为它创建一个makefileC 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
**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.c和fileC.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编译时,会出现一些错误,例如未定义的引用和多个定义。可以安全地假设我误用了头和函数定义?