【问题标题】:C makefile and header confusionC makefile和头文件混淆
【发布时间】:2015-01-04 19:31:00
【问题描述】:

我有几个关于在 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.cfileB.cfileC.c 调用函数,我是否为它们创建标题并将它们#include 到 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 吗?还是会有其他标题?

【问题讨论】:

    标签: c makefile header include


    【解决方案1】:

    对您来说,第一步是忘记 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 不需要规则。为什么?因为它不是由构建创建的,所以它总是已经存在的。

    【讨论】:

    • 谢谢你,马克,你的 file_to_write 评论很有意义,我把它倒过来了。至于编译,当我单独编译文件时,它们编译时没有错误。当我使用 -gcc -Wall -g -o fileA.c fileB.c fileC.c 进行编译时,我会收到诸如未定义引用和多个定义之类的错误。可以安全地假设我滥用了标头和函数定义?
    【解决方案2】:

    如果 fileA.c 依赖于 fileB.c 和 fileC.c 你的 makefile 应该是:

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

    【讨论】:

      猜你喜欢
      • 2016-01-11
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多