【问题标题】:How to make "common headers" for a library work when it's installed in /usr/include?当库安装在 /usr/include 中时,如何使库的“公共标头”工作?
【发布时间】:2015-03-06 20:19:22
【问题描述】:

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

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

我还将.a 文件放在/usr/lib 中。

我可以链接到库,但是当我导入 apriltag.h 时,gcc 在 /usr/include/libcapriltags/common 中找不到任何内容。

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

【问题讨论】:

    标签: c static-libraries header-files


    【解决方案1】:

    假设“库”标头通过表单引用共享的内部标头...

    #include "common/my_typedefs.h"
    

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

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

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

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

    【讨论】:

    • 谢谢!库的内部结构(我忘了提及)确实使用 #include "..." 来引用其他文件。所以我所要做的就是将 -I/usr/include/capriltags 行添加到 GCC?
    • 是的,不是添加符号链接,而是在编译需要这些标头的代码时使用选项-I/usr/include/libcapriltags(假设您将它们安装在/usr/include/libcapriltags,如您所说,而不是@ 987654337@).
    猜你喜欢
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多