使用 ifdef 确定 OpenSSL 版本

Determining OpenSSL version with ifdef

我编写的代码在某些情况下可能会将 X509_STORE 加载到 SSL_CTX 中,由于我不知道它是否会发生,所以我在程序结束时释放了存储。

我在将存储加载到上下文中后调用 X509_STORE_up_ref 以避免引用计数错误,因为 SSL_CTX_free 也会释放存储以防它被加载到给定的上下文中。

但是,我注意到 X509_STORE_up_ref 是一个较新的命令,我的程序无法在旧系统上编译。在那种情况下,我想用 OpenSSL 版本的 #ifdef 包装对该函数的调用。

  1. 使用 #ifdef 检查 OpenSSL 版本的正确方法是什么?
  2. 我现在的位置是对的,还是我使用商店的方式不对?

您可以通过查看 OPENSSL_VERSION_NUMBER 宏来检查 OpenSSL 版本号。 opensslv.h 文件包含以下关于其值的注释:

/*-
 * Numeric release version identifier:
 * MNNFFPPS: major minor fix patch status
 * The status nibble has one of the values 0 for development, 1 to e for betas
 * 1 to 14, and f for release.  The patch level is exactly that.
 * For example:
 * 0.9.3-dev      0x00903000
 * 0.9.3-beta1    0x00903001
 * 0.9.3-beta2-dev 0x00903002
 * 0.9.3-beta2    0x00903002 (same as ...beta2-dev)
 * 0.9.3          0x0090300f
 * 0.9.3a         0x0090301f
 * 0.9.4          0x0090400f
 * 1.2.3z         0x102031af

因此,例如,如果您有某个功能需要 OpenSSL 1.1.0 或更高版本,您可以这样做:

#if OPENSSL_VERSION_NUMBER >= 0x10100000L
// code for version 1.1.0 or greater
#else
// core for 1.0.x or lower
#endif

#ifdef 只会在 compile-time 处告诉您是否使用支持您要调用的函数的 OpenSSL SDK 版本编译代码。但它不会在运行时告诉您 OpenSSL 二进制文件是否实际包含该函数。因此,您必须确保您实际使用的二进制文件与您编译时使用的 SDK 相匹配。或者在运行时动态加载函数,例如在 Windows 上使用 GetProcAddress(),在 Linux 上使用 dlsym(),等等