macOS中引入openssl/sha.h、openssl/md5.h编译C++代码报错如何解决
问题解决方法
1. 解决ld: library not found for -lcrypto报错
你在终端临时export的CPPFLAGS、LDFLAGS不会被g++自动读取,需要手动传入路径参数,或者修改shell配置让编译器默认识别路径。
- 方法一:直接修改编译命令(临时生效,单次编译可用)
把原有编译命令调整为以下内容即可:
注意参数顺序:源文件g++ main.cpp -I/usr/local/opt/openssl@3/include -L/usr/local/opt/openssl@3/lib -lcrypto -lssl -o main && ./mainmain.cpp需要放在-I、-L路径参数之后,-l链接库参数之前,否则仍会出现找不到库的报错 - 方法二:写入shell配置永久生效
编辑~/.zshrc文件,添加以下内容:
保存后执行export PATH="/usr/local/opt/openssl@3/bin:$PATH" export C_INCLUDE_PATH="/usr/local/opt/openssl@3/include:$C_INCLUDE_PATH" export CPLUS_INCLUDE_PATH="/usr/local/opt/openssl@3/include:$CPLUS_INCLUDE_PATH" export LIBRARY_PATH="/usr/local/opt/openssl@3/lib:$LIBRARY_PATH"source ~/.zshrc让配置生效,之后直接使用原来的编译命令即可正常识别头文件和库。
2. 解决MD5函数废弃警告
OpenSSL 3.0版本开始将MD5、SHA1等旧版直接调用的散列API标记为废弃,推荐使用通用的EVP系列API,有三种解决方式可选:
- 方法一:临时屏蔽警告(仅测试场景使用,不推荐生产环境用)
编译时添加参数-Wno-deprecated-declarations,即可屏蔽所有废弃声明类的警告。 - 方法二:替换为OpenSSL 3.0推荐的EVP_MD接口,代码示例如下:
替换原有直接调用MD5函数的代码后,不会再触发废弃警告,兼容性更好。#include <openssl/evp.h> #include <string.h> // 替换原有MD5调用逻辑 void calc_md5(const char* input_str, unsigned char* output_hash) { EVP_MD_CTX* md_ctx = EVP_MD_CTX_new(); EVP_DigestInit_ex(md_ctx, EVP_md5(), NULL); EVP_DigestUpdate(md_ctx, input_str, strlen(input_str)); EVP_DigestFinal_ex(md_ctx, output_hash, NULL); EVP_MD_CTX_free(md_ctx); } - 方法三:降级使用OpenSSL 1.1版本
如果需要保留原有旧API调用逻辑,可以安装OpenSSL 1.1版本:
之后将上述所有路径中的brew install openssl@1.1openssl@3替换为openssl@1.1即可,OpenSSL 1.1版本未将MD5等旧API标记为废弃。
内容的提问来源于stack exchange,提问作者samuel
相关产品推荐
相关产品推荐

