繁体   English   中英

C makefile和标头混淆

[英]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.cfileB.cfileC.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM