如何在库中组织 header 个文件
How to organize header files in a library
假设我正在 C 中编写一个小库,大部分源代码在两个文件夹 src/A
和 src/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 中进行过任何高级编程,并且我尝试在线查找解决方案的尝试均未成功。
我想到的可能的解决方案如下:
将 ~/mylib
添加到搜索路径,但如果库和客户端项目有 header 个同名文件(比如 src/helpers.h
).是否可以包含一个 header 文件而不用我不需要的文件扰乱搜索 space?
在库 header 文件中使用相对路径,但感觉不是很稳健。
谢谢。
您为什么不使用标准实现?分成 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".
假设我正在 C 中编写一个小库,大部分源代码在两个文件夹 src/A
和 src/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 中进行过任何高级编程,并且我尝试在线查找解决方案的尝试均未成功。
我想到的可能的解决方案如下:
将
~/mylib
添加到搜索路径,但如果库和客户端项目有 header 个同名文件(比如src/helpers.h
).是否可以包含一个 header 文件而不用我不需要的文件扰乱搜索 space?在库 header 文件中使用相对路径,但感觉不是很稳健。
谢谢。
您为什么不使用标准实现?分成 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".