C makefile和header confusion

时间:2014-11-07 22:06:58

标签: c makefile header include

我有几个关于Make文件,标题和包含C语言文件的一般性问题,我希望得到一个易于理解的答案,因为所有的教程都来自"好的我理解这个"到了"这到底是什么"只是几行。 假设我有一个程序,我想为其创建一个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)?

将fileB.o:包含fileB.c fileB.h,那就是它?还是会有其他标题?

2 个答案:

答案 0 :(得分:2)

你的第一步是忘记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

每条规则都应该描述如何创建一个文件。该文件位于:的左侧。它被称为“目标”。在:的右侧列出了“先决条件”。

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

下面是“配方” - 这是读取先决条件并生成目标的命令。

如果配方读取某些文件,则很可能这些文件必须位于先决条件列表中。

例如,您将有一条规则来生成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不需要规则。为什么?因为它不是由构建创建的,所以它始终存在。

答案 1 :(得分:0)

如果file.c依赖于file.c而文件C.c,则makefile应为:

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