我正在处理一个项目,该项目由两个包名称之一决定,具体取决于发行版。在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 ++。)
如果没有,我们可以做些什么来帮助解决不同平台上不同名称引起的问题?
答案 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
的更多信息。