我正在编写一个依赖于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 #include。我不想为每个架构/平台都复制所有这些文件,尤其是因为变化太多。

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

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

最佳答案

作为一种解决方法,您可以生成opensslconf.h的多个版本(计划支持的每个拱门一个版本),将其称为opensslconf-win.hopensslconf-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/

10-12 00:19