Mac M1环境编译SHA-3加密程序遇OpenSSL头文件缺失问题求助
问题描述
在MacBook Pro M1的iTerm bash环境下开发文本转MD5/SHA-3加密的程序,编译时出现头文件找不到的错误:
SHA-3Encrypter.c:4:10: fatal error: 'openssl/evp.h' file not foundfatal error: openssl/md5.h file not found
已执行brew install libsolv-dev,但问题仍未解决,程序代码如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/evp.h> void sha3_encrypt(const char *input, unsigned char *output, unsigned int *output_len) { EVP_MD_CTX *mdctx; const EVP_MD *md = EVP_sha3_256(); // Use SHA3-256, can change to SHA3-224, 384, or 512 if ((mdctx = EVP_MD_CTX_new()) == NULL) { fprintf(stderr, "Error: Failed to create context.\n"); exit(EXIT_FAILURE); } if (1 != EVP_DigestInit_ex(mdctx, md, NULL)) { fprintf(stderr, "Error: Failed to initialize digest.\n"); exit(EXIT_FAILURE); } if (1 != EVP_DigestUpdate(mdctx, input, strlen(input))) { fprintf(stderr, "Error: Failed to update digest.\n"); exit(EXIT_FAILURE); } if (1 != EVP_DigestFinal_ex(mdctx, output, output_len)) { fprintf(stderr, "Error: Failed to finalize digest.\n"); exit(EXIT_FAILURE); } EVP_MD_CTX_free(mdctx); } void print_hex(const unsigned char *hash, unsigned int length) { for (unsigned int i = 0; i < length; i++) { printf("%02x", hash[i]); } printf("\n"); } int main() { char input[256]; unsigned char output[EVP_MAX_MD_SIZE]; unsigned int output_len; printf("Enter text to hash (max 255 characters): "); if (fgets(input, sizeof(input), stdin) == NULL) { fprintf(stderr, "Error reading input.\n"); return 1; } // Remove newline character from input if present size_t len = strlen(input); if (len > 0 && input[len - 1] == '\n') { input[len - 1] = '\0'; } sha3_encrypt(input, output, &output_len); printf("SHA-3 (256-bit) hash:\n"); print_hex(output, output_len); return 0; }
问题根源与解决方法
根源分析
- 安装库错误:
libsolv-dev是包依赖解析库,和OpenSSL加密库完全无关,不是你需要的依赖。 - 路径未配置:M1 Mac上Homebrew安装的OpenSSL头文件和库不在系统默认搜索路径,编译时需手动指定路径。
解决步骤
安装正确的OpenSSL库
执行命令安装OpenSSL:brew install openssl获取OpenSSL安装路径
查看Homebrew安装的OpenSSL位置:brew --prefix opensslM1 Mac下输出通常为
/opt/homebrew/opt/openssl@3。编译时指定路径与链接库
使用gcc或clang编译时,通过-I指定头文件目录,-L指定库目录,-l链接OpenSSL的crypto库:gcc SHA-3Encrypter.c -o SHA-3Encrypter -I$(brew --prefix openssl)/include -L$(brew --prefix openssl)/lib -lcrypto(可选)配置环境变量简化编译
若不想每次编译都输入长命令,可将OpenSSL路径加入bash环境变量:echo 'export CFLAGS="-I$(brew --prefix openssl)/include $CFLAGS"' >> ~/.bash_profile echo 'export LDFLAGS="-L$(brew --prefix openssl)/lib $LDFLAGS"' >> ~/.bash_profile echo 'export LD_LIBRARY_PATH="$(brew --prefix openssl)/lib:$LD_LIBRARY_PATH"' >> ~/.bash_profile source ~/.bash_profile之后直接编译即可:
gcc SHA-3Encrypter.c -o SHA-3Encrypter -lcrypto扩展支持MD5功能
若需添加MD5加密,可新增md5_encrypt函数(复用EVP接口逻辑):void md5_encrypt(const char *input, unsigned char *output, unsigned int *output_len) { EVP_MD_CTX *mdctx; const EVP_MD *md = EVP_md5(); if ((mdctx = EVP_MD_CTX_new()) == NULL) { fprintf(stderr, "Error: Failed to create context.\n"); exit(EXIT_FAILURE); } if (1 != EVP_DigestInit_ex(mdctx, md, NULL)) { fprintf(stderr, "Error: Failed to initialize digest.\n"); exit(EXIT_FAILURE); } if (1 != EVP_DigestUpdate(mdctx, input, strlen(input))) { fprintf(stderr, "Error: Failed to update digest.\n"); exit(EXIT_FAILURE); } if (1 != EVP_DigestFinal_ex(mdctx, output, output_len)) { fprintf(stderr, "Error: Failed to finalize digest.\n"); exit(EXIT_FAILURE); } EVP_MD_CTX_free(mdctx); }在
main函数中调用该函数即可输出MD5哈希值。
内容的提问来源于stack exchange,提问作者Delta
相关产品推荐
相关产品推荐

