【问题标题】:Abstracting include paths and library names with pkg-config?使用 pkg-config 抽象包含路径和库名称?
【发布时间】:2015-10-03 08:17:30
【问题描述】:

我正在处理一个使用两个 package 名称之一的项目,具体取决于发行版。在 Debian 及其衍生版本上,软件包名称为 libcrypto++。在 Fedora 和衍生产品上,它称为 libcryptopp。 (正式项目名称为 Crypto++)。

用户编写代码,并执行以下操作:

#include <crypto++/aes.h>

然后,他们使用-lcrypto++ 链接到库。

显然,在 Fedora 上使用“Debian 约定”会破坏一些东西(反之亦然)。例如,请参阅How to change the include file path with autotools?

我正在尝试确定可以使用什么来抽象出差异,以便用户的代码“正常工作”。

可以使用pkg-config files 处理差异吗?如果是这样,那么它如何处理用户代码中的#include &lt;crypto++/...&gt;#include &lt;cryptopp/...&gt;? (我特别担心标头冲突,例如 OpenSSL 和 Crypto++ 都提供aes.h)。

如果不是,我们可以做些什么来帮助解决不同平台上不同名称引起的问题?

【问题讨论】:

    标签: autotools crypto++ pkg-config


    【解决方案1】:

    自动工具没有任何内置功能可以自动执行此操作。这是一个相当不寻常的需求。

    您可以通过多种方式使其发挥作用。以下是一对:

    • 在您的构建树中创建一个符号链接,使用您喜欢的名称,指向包含树。即从libcrypto++/usr/include/libcrytpopp的符号链接;然后在您的源代码中使用#include &lt;libcrypto++/mumble&gt;。您可以从 configure 创建此符号链接。

    • configure 时间生成一个新的 C 宏定义(参见 AC_DEFINE),该定义扩展为包含前缀的字符串,例如 "libcryptopp"。然后在#include 行中使用粘贴来包含正确的标题。见this answer

    【讨论】:

      【解决方案2】:

      正如 Tom Tromey 所说,没有什么可以帮助您解决这个问题。但在 Crypto++ 开发人员的帮助下,您可以想出一个更标准化的方法来发现这一点。

      诀窍是使用 pkg-config 定义的变量,然后使用 Tom 建议的宏和粘贴方法。本质上,您只需要在 .pc 文件中定义前缀变量:

      includepathprefix = libcryptopp
      

      然后使用PKG_CHECK_VAR 阅读。

      PKG_CHECK_VAR([CRYPTOPP_PREFIX], [libcrypto++], [includepathprefix])
      AC_DEFINE([CRYPTOPP_PREFIX], [$CRYPTOPP_PREFIX],
          [Prefix for crypto++ header files.])
      

      那么您应该使用字符串粘贴来包含文件。这绝对是笨重的,但它在黑暗中的拍摄略少。

      如果您想查看完整的语法,我在Autotools Mythbuster 上写了有关PKG_CHECK_VAR 的更多信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-05
        • 2012-04-22
        • 2021-08-29
        • 1970-01-01
        • 1970-01-01
        • 2016-11-07
        • 2013-02-25
        相关资源
        最近更新 更多