我正在编写一个依赖于 OpenSSL 的跨平台 C++ 库,我将其静态链接并与我的库捆绑在一起以便于使用。我希望我的库有一个 #include 目录,其中显然包含一个“openssl”子目录。
不幸的是,OpenSSL #include 目录的内容因架构和平台而异。因此,例如,iOS 有(至少)三个不同版本的 OpenSSL 头文件。为 TV-OS 支持和模拟器版本添加更多内容。同样的问题在Windows和Android上都存在不同程度。
经过仔细检查,唯一在所有平台和架构中通用但不同的文件是“opensslconf.h”,它通常只有几行不同,有时甚至只有一行。
例如,“opensslconf.h”的 tvOS 版本包含:
#ifndef OPENSSL_NO_ASYNC
# define OPENSSL_NO_ASYNC
#endif
而 iOS 版本没有。
更常见的差异是 RC4_INT 的定义:
// 64-bit architectures?
#define RC4_INT unsigned int
// 32-bit architectures?
#define RC4_INT unsigned char
我只想拥有一套适用于所有架构和平台的 OpenSSL #includes。我不想为每个架构/平台复制所有这些文件,尤其是因为有这么多变体。
我的第一个问题是是否可以像我希望的那样只拥有一个 OpenSSL #include 目录?如果是这样,我应该选择哪个版本的“opensslconf.h”,我怎么知道它会起作用?
我的第二个问题是为什么这根本就是一个问题。为什么不能用OpenSSL封装这些平台差异呢?它是否已经在跟踪许多其他变量和类型,这些变量和类型在您为不同的架构构建时会发生变化?
最佳答案
作为一种变通方法,您可以生成多个版本的 opensslconf.h
(一个用于您计划支持的每个架构),将它们命名为 opensslconf-win.h
, opensslconf-tvos.h
等
然后编写一个 opensslconf,它只包含基于平台生成的文件:
#ifdef WIN32
#include opensslconf-win.h
#endif
// and so for every arch
关于c++ - 为什么每个架构的 opensslconf.h 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42149017/