C 如何在库中组织头文件

C 如何在库中组织头文件,c,header-files,C,Header Files,假设我正在用C编写一个小库,其中大部分源代码位于两个文件夹src/a和src/B,其中头文件src/a/a.h需要包含src/B/B.h。在为非库项目编写代码时,我通常会编写 #include "B/b.h" 在a.h中,使用-Isrc标志告知编译器在何处查找头文件 现在假设我的库安装在本地的~/mylib,并且我想使用来自不同项目的a.h的函数。只需使用 #include "~/mylib/src/A/a.h" 不起作用,因为~/mylib/src/B/B.h可能不在搜索路径中。我的问题是

假设我正在用C编写一个小库,其中大部分源代码位于两个文件夹
src/a
src/B
,其中头文件
src/a/a.h
需要包含
src/B/B.h
。在为非库项目编写代码时,我通常会编写

#include "B/b.h"
a.h
中,使用
-Isrc
标志告知编译器在何处查找头文件

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

#include "~/mylib/src/A/a.h"
不起作用,因为
~/mylib/src/B/B.h
可能不在搜索路径中。我的问题是关于解决这个问题的标准方法。这可能是非常基本的,但我还没有用C做过任何高级编程,也没有成功地尝试在线找到解决方案

我想到的可能解决办法如下:

  • ~/mylib
    添加到搜索路径,但如果库和客户端项目的头文件具有相同的名称(例如
    src/helpers.h
    ),则可能会导致问题。是否可以包含一个头文件,而不让搜索空间中的文件与我不需要的文件混淆

  • 在库头文件中使用相对路径,但这感觉不是很可靠


谢谢。

为什么不使用标准实现?将头文件和源文件分解到各自的目录中。添加
#定义
标题以避免多个包含或命名空间损坏

以下是您的目录结构:

~/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
#ifndef __B_H__
#define __B_H__
    //  code

    // end of file
#endif
现在
b.h
将在文件的最顶端显示

#ifndef __A_H__
#define __A_H__
    //  code

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

    // end of file
#endif
#ifndef __B_H__
#define __B_H__
    //  code

    // end of file
#endif
然后编译<代码>gcc-I~/mylib/headers


如果您有2个
helpers.h
只需将其中一个文件中的
\define\uuuu helpers\u h\uuu
更改为类似
\define\uu helpers 2\u h\uuuu

的其他文件,通常的方法是为构成库的公共接口的标题专门设置一个单独的目录。通常,该目录将被称为“include”

然后,您可以将库的公共标题放在其中特定于库的目录下,即“mylib/include/mylib/b.h”。这个额外的“mylib”目录可以防止在使用其他也有“b.h”的库时发生冲突。如果愿意,您还可以将其他不构成库的公共接口的私有头保存在“src”目录下,以防止它们向库的用户公开


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

看看其他库是如何做到的-它们要么有一个头文件(“mylib.h”)要么有几个(“mylib/helpers.h”)通过在编译时添加适当的-I选项可以指出这一点。谢谢!您有这样一个库的示例吗?(最好是一个小库,不太难理解)。您需要了解的只是文件布局,但请确定……”“是一个具有多个头文件的库在执行
#include
标准时如何指定完整路径?”?它不是很灵活,也不便于携带。而且没有意义,因为您也在使用
-I
来指定头的路径。是的,正常的方法是有一个单独的头目录(通常称为“include”),并且您将头放在库特定的目录下,即“mylib/include/mylib/b.h”。这意味着您可以使用“-I mylib/headers”然后随“#include”mylib/b.h”一起包含。如果您使用的其他库也有“b.h”,则额外的“mylib”目录可防止冲突。我很抱歉。我使用完整路径只是为了说明。但你是对的。不要使用完整路径。Sean,当你有一个包含多个头文件夹的复杂层次结构时,你觉得使用带有头文件符号链接的mylib/include/mylib文件夹怎么样?