使用 ifdef 确定 OpenSSL 版本
Determining OpenSSL version with ifdef
我编写的代码在某些情况下可能会将 X509_STORE
加载到 SSL_CTX
中,由于我不知道它是否会发生,所以我在程序结束时释放了存储。
我在将存储加载到上下文中后调用 X509_STORE_up_ref
以避免引用计数错误,因为 SSL_CTX_free
也会释放存储以防它被加载到给定的上下文中。
但是,我注意到 X509_STORE_up_ref
是一个较新的命令,我的程序无法在旧系统上编译。在那种情况下,我想用 OpenSSL 版本的 #ifdef
包装对该函数的调用。
- 使用
#ifdef
检查 OpenSSL 版本的正确方法是什么?
- 我现在的位置是对的,还是我使用商店的方式不对?
您可以通过查看 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()
,等等
我编写的代码在某些情况下可能会将 X509_STORE
加载到 SSL_CTX
中,由于我不知道它是否会发生,所以我在程序结束时释放了存储。
我在将存储加载到上下文中后调用 X509_STORE_up_ref
以避免引用计数错误,因为 SSL_CTX_free
也会释放存储以防它被加载到给定的上下文中。
但是,我注意到 X509_STORE_up_ref
是一个较新的命令,我的程序无法在旧系统上编译。在那种情况下,我想用 OpenSSL 版本的 #ifdef
包装对该函数的调用。
- 使用
#ifdef
检查 OpenSSL 版本的正确方法是什么? - 我现在的位置是对的,还是我使用商店的方式不对?
您可以通过查看 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()
,等等