[英]C makefile and header confusion
我对Make文件,标头以及包含C语言中的文件有几个一般性问题,希望得到一个易于理解的答案,因为所有教程都从“确定,我明白了”变成“这到底是什么”在几行中。 可以说我有一个要为其创建文件的程序。
**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和header文件的实际目的感到困惑,这使我迷失了方向。
感谢您抽出宝贵的时间阅读本书,任何帮助将不胜感激。
编辑:
以供参考,
fileA.o: fileA.c fileA.h
${CC} ${CFLAGS} -c fileA.c
因此,由于fileA没有被任何东西调用,这是正确的(我确实将地址从fileA传递到了fileB和fileC)吗?
将fileB.o:包含fileB.c fileB.h就是这样吗? 还是会有其他标题?
对您来说,第一步是忘记makefile。 只需使用C设置您的项目,然后进行编译,手动运行gcc
命令,或者如果您对此感到厌倦,则可以在shell脚本中逐个编写它们并运行它。
在尝试编写Makefile
之前,请确保一切运行令人满意。
您可能会收到类似的电话
gcc -c fileB.c
和
gcc fileA.o fileB.o fileC.o -o fileA
如果您无法手动执行Makefile
则无法编写该Makefile
。
现在,是时候编写Makefile
。 为此,您需要“规则”。 规则是这样的:
file_to_write: all the files that impact file_to_write
command to create the file to write
每条规则应描述如何创建一个文件。 该文件是在左边:
。 它称为“目标”。 在:
右边列出了“先决条件”。
现在仔细听。 前提条件是所有文件,如果更改,可能会导致目标文件的行为有所不同。
在其下方的是“食谱”,即读取先决条件并生成目标的命令。
如果配方读取某些文件,则很可能这些文件必须在先决条件列表中。
因此,例如,您将具有如下规则来生成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
不需要规则。 为什么? 因为它不是由构建创建的,所以它始终已经存在。
如果fileA.c依赖于fileB.c和fileC.c,则您的makefile应该为:
fileA: fileB.o fileC.o fileA.o
$(CC) fileB.o fileC.o fileA.o -o fileA
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.