如何在库中组织 header 个文件

How to organize header files in a library

假设我正在 C 中编写一个小库,大部分源代码在两个文件夹 src/Asrc/B 中,并且 header 文件 src/A/a.h 需要包含 src/B/b.h。在为 non-library 项目编写代码时,我通常会写

#include "B/b.h"

in a.h 并使用 -Isrc 标志告诉编译器在哪里寻找 header 文件。

现在假设我的库本地安装在 ~/mylib 并且我想使用来自不同项目的 a.h 的函数。使用

简单地包含该文件
#include "~/mylib/src/A/a.h"

将不起作用,因为 ~/mylib/src/B/b.h 可能不在搜索路径中。我的问题是关于解决这个问题的规范方法。它可能是非常基础的,但我没有在 C 中进行过任何高级编程,并且我尝试在线查找解决方案的尝试均未成功。

我想到的可能的解决方案如下:

谢谢。

您为什么不使用标准实现?分成 header 和源文件到它们自己的目录中。添加 #define headers 以避免多次包含或名称空间损坏。

这是您的目录结构:

~/mylib/headers/a.h
                b.h
~/mylib/src/a.c
            b.c

现在 a.h 将在文件的最顶部...

#ifndef __A_H__
#define __A_H__
    //  code

#include "~/mylib/headers/b.h"

    // end of file
#endif

现在 b.h 将在文件的最顶部...

#ifndef __B_H__
#define __B_H__
    //  code

    // end of file
#endif

那就编译吧。 gcc -I~/mylib/headers

如果您有 2 个 helpers.h,只需将其中一个文件中的 #define __HELPERS_H__ 更改为其他内容,例如 #define __HELPERS2_H__

通常的方法是为 headers 建立一个单独的目录,它构成了您的库的 public 接口。通常这个目录会被称为 'include'.

然后您可以将您的图书馆的 public headers 放在 library-specific 目录下,即 "mylib/include/mylib/b.h"。这个额外的 'mylib' 目录可以防止在您使用其他一些也有 "b.h" 的库时发生冲突。如果您愿意,您也可以将不构成您图书馆的 public 界面的其他私有 headers 保留在 'src' 目录下,以阻止它们暴露给用户图书馆。

这意味着库的用户随后可以使用“-I mylib/include”来包含此目录,并包含单个文件,例如“#include "mylib/b.h".