c/c++ 相对包含路径与 Makefile 包含标志

c/c++ relative include paths vs Makefile include flags

在文件结构为目录树结构的大型项目中,在源文件中包含相对路径更好,还是只包含头文件并通过 Makefile 指示编译器在哪里找到它更好?
有更好的方法吗?

示例:

#include "../path/to/file.h"  

对比

#include "file.h"
gcc -I../path/to  

我相信第一种情况可能更具可读性,而第二种方法可以无缝移动文件...

第二种方法效率更高,因为您不必每次要使用此文件时都重写路径。

我们举个例子。

您想构建一个包含一些有用函数的库。 然后你在一个项目上工作,你需要图书馆的一些功能,而不是全部。 所以你选择将这些文件中的一些 mv 到你的项目文件夹中。

这样,路径可能会不一样,如果您选择将路径包含在 Makefile 中,则不必重写所有内容。

正确编码您的 Makefile,让您拥有多个 $(PATH),这在处理需要多个二进制文件的大型项目时非常有用。

我尽量说清楚,但我真的认为,在我看来,Makefile 是一个非常强大的工具,可以充分利用它来使项目开发更容易。

视情况而定。对于项目中的包含文件,提供相对路径可能很有用,因为子目录是另一个结构元素,您不必关心相同的文件名(主要用于 C++,因为 C 不支持自定义命名空间).

对于外部路径(例如其他项目),你应该明确地使用第二种方法。可能只是那个结构的根。类似于 asm/byteorder.h.

无论如何,如果使用显式路径(在源文件中),您应该确保它们有良好的文档记录并且任何更改都被跟踪到源文件。 (经常有共同的子目录,如config等,不会改变)。

一个强烈建议:始终使用项目根目录作为工作目录。所有明确的相对路径都来自这个根。这样你就可以避免有问题的父(..)路径。

最终规则是不要使用跨越项目根目录的显式路径。

但是,没有其他通用规则。实际布局通常取决于个人喜好。如果目录结构经过深思熟虑,我更喜欢显式路径。