为什么每种架构的opensslconf.h不同?

Bun*_*les 5 c++ openssl cross-platform ios xcode8

我正在编写一个依赖于OpenSSL的跨平台C ++库,我将其静态链接并捆绑到我的库中以便于使用。我想为我的库提供一个#include目录,该目录显然包含一个“ openssl”子目录。

不幸的是,每个体系结构,每个平台的OpenSSL #include目录的内容是不同的。因此,例如,(最小)iOS的三个不同版本的OpenSSL头文件。添加更多有关TV-OS支持和模拟器版本的信息。Windows和Android上存在不同程度的相同问题。

仔细检查后,在所有平台和体系结构中唯一通用但不同的文件是“ opensslconf.h”,它通常仅相差几行,有时甚至只有一行。

例如,tvOS版本的“ opensslconf.h”包含:

#ifndef OPENSSL_NO_ASYNC
# define OPENSSL_NO_ASYNC
#endif
Run Code Online (Sandbox Code Playgroud)

而iOS版本没有。

RC4_INT的定义之间存在更频繁的区别:

// 64-bit architectures?
#define RC4_INT unsigned int

// 32-bit architectures?
#define RC4_INT unsigned char
Run Code Online (Sandbox Code Playgroud)

我只希望有一套适用于所有体系结构和平台的OpenSSL #include。我不想为每个架构/平台都复制所有这些文件,尤其是因为变化太多。

我的第一个问题是,是否可以根据需要设置一个OpenSSL #include目录?如果是这样,我应该选择哪个版本的“ opensslconf.h”,我怎么知道它会起作用?

我的第二个问题是,为什么这是一个问题。为什么OpenSSL无法封装这些平台差异?它是否已经在跟踪为其他体系结构构建时会发生变化的许多其他变量和类型?

小智 3

作为一种解决方法,您可以生成多个版本opensslconf.h(您计划支持的每个架构一个),将它们称为opensslconf-win.hopensslconf-tvos.h等。然后编写一个 opensslconf ,其中仅包含基于平台生成的文件:

#ifdef WIN32
#include opensslconf-win.h
#endif
// and so for every arch
Run Code Online (Sandbox Code Playgroud)