C 如何在库中组织头文件
假设我正在用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可能不在搜索路径中。我的问题是
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文件夹怎么样?