c++ - 为什么每个架构的 opensslconf.h 不同?

标签 c++ ios openssl cross-platform xcode8

我正在编写一个依赖于 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.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/

相关文章:

ios - 尝试做一个简单的倒计时应用程序但计数器没有倒计时?

c++ - 如何将 int 数组转换为 OpenSSL BIGNUM?

c - 如何用openssl解密wpa 2 psk,用c编程

ssl - 在支持 FIPS 的操作系统中从 p12 生成 pem 文件

C++ 对象和命名空间

C++何时检查异步方法的异常

c++ - 寻找指针的来源

ios - 我如何在 iOS 中设计/构建我的用户详细信息应用程序

c++ - 如何从 boost 获取平台 ID?

ios - WatchKit 菜单项未在真实设备上显示