当库安装在 /usr/include 中时,如何使 "common headers" 正常工作?

How to make "common headers" for a library work when it's installed in /usr/include?

我正在打包一个包含一堆头文件的库和一个 .a 静态库。 库 的 C 头文件 都在库的根文件夹中,但头文件使用了一些保存在 common/[=34= 中的外部类型定义]目录。

我尝试将所有 .h 文件复制到目录 /usr/include/libcapriltags,并将所有 common/*.h 文件复制到 /usr/include/libcapriltags/common。 然后我将主 .h 文件从 /usr/include/libcapriltags/apriltag.h symlink 编辑到 /usr/include/apriltag.h

我也把.a文件放在了/usr/lib.

我可以 link 针对库,但是当我导入 apriltag.h 时,gcc 在 /usr/include/libcapriltags/common.

中找不到任何内容

我在安装库时做错了什么?

假设 "library" headers 通过以下形式引用共享内部 headers ...

#include "common/my_typedefs.h"

...,将 headers 安装在 /usr/include/libcapriltags/common 中,同时将 /usr/include/libcapriltags/apriltag.h 符号链接到 /usr/include/apriltag.h 是不正确的。如果 apriltag.h 通过 double-quote 语法直接在 /usr/include/libcapriltags/ 中引用其他 headers,则符号链接也会成为问题。

当编译器找到 /usr/include/apriltag.h 时,它不太可能知道或关心这是否是一个符号链接。它通过 apriltag.h 对其他 headers #included 执行的任何相对查找都将相对于它找到 apriltag.h(符号链接)的路径。

另一方面,如果这些 headers 中的任何一个通过 angle-bracket include 语法相互引用,那么根本问题是您安装它们的目录不是在(默认)包含搜索路径。你的符号链接没有解决这个问题,除了它的特定目标文件。

假设你确实想把所有的headers放在/usr/include/libcapriltags里面和下面,这是完全合理的,你应该准备在编译时将该目录添加到包含文件搜索路径中使用它们的代码。这样做的传统编译器选项拼写为 -I/usr/include/libcapriltags。根据它们的编写方式,您也许还可以通过限定形式 (#include <libcapriltags/apriltags.h>) 引用它们。无论哪种方式,您都不需要也不想将该目录中的任何文件符号链接到 /usr/include.