定义OPENSSL_API_COMPAT后引入OpenSSL头文件报兼容性错误解决方法
错误触发场景
开发C++项目时编写如下代码:
#define OPENSSL_API_COMPAT 0x10101000L #include <openssl/sha.h> #include <openssl/hmac.h>
编译过程中抛出如下错误:
#error: "OPENSSL_API_COMPAT expresses an impossible API compatibility level"
错误产生原因
该错误由OpenSSL头文件内置的版本校验逻辑触发,核心原因分两类:
- 版本不匹配:
OPENSSL_API_COMPAT宏的作用是指定代码需要兼容的最低OpenSSL API版本,头文件会据此屏蔽高版本新增API、匹配对应版本的接口行为。宏值0x10101000L对应OpenSSL 1.1.1版本,如果当前编译环境安装的OpenSSL版本低于1.1.1(比如1.1.0、1.0.2系列),头文件无法提供高于自身版本的API兼容能力,就会判定指定的兼容等级无效,抛出该错误。 - 宏定义顺序错误:如果在定义
OPENSSL_API_COMPAT之前,已经有其他依赖提前引入了OpenSSL相关头文件(比如openssl/opensslconf.h),会导致版本校验逻辑在宏生效前就执行,同样会触发该报错。
可行修复方案
根据实际开发场景选择对应方案即可:
- 匹配本地OpenSSL版本调整宏值
先执行命令查询当前环境的OpenSSL版本:
按照版本对应规则调整宏值,保证宏值不高于当前安装的OpenSSL版本即可:openssl version- OpenSSL 1.1.0 对应宏值
0x10100000L - OpenSSL 1.0.2 对应宏值
0x10002000L
- OpenSSL 1.1.0 对应宏值
- 升级编译环境OpenSSL版本
如果代码逻辑确实依赖OpenSSL 1.1.1及以上版本的API,直接将编译环境的OpenSSL升级到1.1.1或更高的稳定版本,原有宏定义无需修改即可正常编译。 - 调整宏定义位置
如果是宏生效顺序问题,将#define OPENSSL_API_COMPAT 0x10101000L移动到所有头文件引入语句的最顶部,保证在任何OpenSSL相关头文件被加载前,该宏已经被正确定义。
内容的提问来源于stack exchange,提问作者Remì1998
相关产品推荐
相关产品推荐

