假设我正在编写一个用 C 编写的小型库,大部分源代码位于两个文件夹src/A
和src/B
中,并且头文件{{1}需要包含src/A/a.h
。在为非库项目编写代码时,我通常会写
src/B/b.h
<{1>}中的并使用#include "B/b.h"
标志告诉编译器在哪里查找头文件。
现在假设我的库在a.h
本地安装,并且我想使用来自不同项目的-Isrc
中的函数。只需使用
~/mylib
无效,因为a.h
可能不属于搜索路径。我的问题是关于解决这个问题的规范方法。这可能是非常基本的,但我还没有在 C 中完成任何高级编程,并且在我尝试在线查找解决方案时失败了。
我想到的可能解决方案如下:
将#include "~/mylib/src/A/a.h"
添加到搜索路径,但如果库和客户端项目具有相同名称的头文件(例如~/mylib/src/B/b.h
),则可能会出现问题。是否可以包含一个头文件而不会使用我不需要的文件使搜索空间变得混乱?
使用相对路径,但在库头文件中,但不会感觉非常健壮。
谢谢。
答案 0 :(得分:1)
为什么您没有使用标准实施?将标题和源文件分解到自己的目录中。添加#define
标头以避免多个包含或命名空间损坏。
这是您的目录结构:
~/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__
答案 1 :(得分:1)
通常的方法是专门为构成库的公共接口的标题创建一个单独的目录。通常这个目录称为“包含”。
然后,您可以将库的公共头文件放在特定于库的目录下,即“mylib / include / mylib / b.h”。如果您正在使用其他具有“b.h”的库,则这个额外的“mylib”目录可以防止冲突。如果您愿意,您也可以在'src'目录下保留其他不构成库的公共接口的私有标头,以阻止它们向库的用户公开。
这意味着库的用户可以使用“-I mylib / include”来包含此目录,并包含单个文件,例如“#include”mylib / b.h“。