gpt4 book ai didi

c - 如何在 C 中处理包含带有 makefile 的 header 的 header ?

转载 作者:行者123 更新时间:2023-11-30 14:20:15 30 4
gpt4 key购买 nike

假设您有一个名为 file.c 的文件。

  • file.c 包含 header1.h
  • header1.h 包含 header2.h

这是我的 makefile:

file.x: file.o
-gcc file.o -o file.x

file.o: file.c header1.h header2.h
-gcc file.c header1.h header2.h

当 header2.h 包含 header1.h 时,我对如何处理感到困惑。

这条线是多余的吗?或者显示依赖关系是否是一种好的风格?

file.c header1.h header2.h

更新:对于造成的困惑,我深表歉意。我已恢复对问题所做的编辑。当前的 makefile 是我在 Jonathan 的回答所提到的原始问题中发布的文件。

最佳答案

问题的原始版本在 makefile 中包含以下几行:

file.o: file.c header1.h header2.h
-gcc file.c header1.h header2.h

我的回答解决了问题得到修复之前的原始版本。

请注意,编译行会生成可执行文件a.out,除非编译器反对编译头文件。您应该在命令行中有 -c

<小时/>

几个问题:

  1. makefile中,什么时候需要重建目标文件?

    答案:当源文件或其包含的 header 之一发生更改时。

    子公司问:这个依赖行是什么意思:

    file.o: file.c header1.h header2.h

    子公司A:如果源文件或其包含的 header 之一发生更改,则需要重建file.o

  2. 如果您规定:header1.h 取决于 header2.h,那么当您更改header2.h

    答案:没什么。您本身不编译 header1.h 。改变的是目标文件。

  3. 如果您规定 file.c 取决于 header1.hheader2.h 或两者,将会发生什么当您更改其中一个 header 时,会更改为 file.c 吗?

    回答:什么也没有了。您不更改file.c;您再次重新编译目标文件。

因此,目标文件规则的依赖关系部分很好(在与自动依赖关系生成相关的限制内)。规则中没有任何意义说源文件依赖于 header ;事实上,源文件并不直接依赖于 header 。 (它间接依赖于它们,因为如果 header 内容发生更改,使得有效代码不再有效,则在源代码修复之前不会编译任何内容。但这有点偏离主题。)

对依赖项进行硬编码是有问题的;他们改变了。另一方面,自动生成依赖关系是很繁琐的。有 GCC 选项(例如 -M-MM-MF-MG- MP-MQ-MD-MMD-MT- H - 如此丰富的选项告诉您这里存在问题!)来提供帮助,并且 GNU make 具有“条件包含”,可以包含依赖文件(如果存在),如果不存在则不包含't。这些可以提供帮助。查找 makedependmkdep 和相关命令,了解其他自动化方法。

<小时/>

忽略自动依赖项生成,您的 makefile 可能会显示:

FILES.o = file.o

file.x: ${FILES.o}
${CC} -o $@ ${CFLAGS} ${FILES.o}

file.o: file.c header1.h header2.h

make 将提供将 file.c 编译为 file.o 的命令。

当您的程序也开始使用 other.o 时,您只需将 other.o 添加到宏 FILES.o (这就是为什么这是一个复数名称)。您也可以添加依赖项信息。如果您也需要库,那​​么您可以向链接行添加选项:

LDFLAGS = -L/usr/local/lib
LDLIBS = -llocal

FILES.o = file.o other1.o other2.o

file.x: ${FILES.o}
${CC} -o $@ ${CFLAGS} ${FILES.o} ${LDFLAGS} ${LDLIBS}

file.o: file.c header1.h header2.h

请注意,库应该位于目标文件之后。在目标文件之前列出库很容易导致其他平台上的链接时失败,从而激怒那些尝试构建软件的人。

关于c - 如何在 C 中处理包含带有 makefile 的 header 的 header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15649678/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com