You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 && ./main
    
    注意参数顺序:源文件main.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接口,代码示例如下:
    #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);
    }
    
    替换原有直接调用MD5函数的代码后,不会再触发废弃警告,兼容性更好。
  • 方法三:降级使用OpenSSL 1.1版本
    如果需要保留原有旧API调用逻辑,可以安装OpenSSL 1.1版本:
    brew install openssl@1.1
    
    之后将上述所有路径中的openssl@3替换为openssl@1.1即可,OpenSSL 1.1版本未将MD5等旧API标记为废弃。

内容的提问来源于stack exchange,提问作者samuel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 18:06:03