我有几个关于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,那就是它?还是会有其他标题?
答案 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