使用pkg-config抽象包含路径和库名称?

时间:2015-10-03 08:17:30

标签: autotools crypto++ pkg-config

我正在处理一个项目,该项目由两个名称之一决定,具体取决于发行版。在Debian和衍生产品上,软件包名称为 libcrypto++ 。在Fedora和衍生物上,它被称为 libcryptopp 。 (官方项目名称为Crypto ++)。

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

#include <crypto++/aes.h>

之后,他们使用-lcrypto++链接到图书馆。

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

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

可以用pkg-config files来处理差异吗?如果是,那么它如何处理用户代码中的#include <crypto++/...>#include <cryptopp/...>? (我特别关注标题冲突,比如提供aes.h的OpenSSL和Crypto ++。)

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

2 个答案:

答案 0 :(得分:2)

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

有很多方法可以让它发挥作用。这是一对夫妇:

  • 使用您喜欢的名称在构建树中创建符号链接,指向包含树。也就是说,从libcrypto++/usr/include/libcrytpopp的符号链接;然后在源代码中使用#include <libcrypto++/mumble>。您可以从configure

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

答案 1 :(得分:0)

正如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的更多信息。