centos7 php7 动态编译mysqlnd: configure: error: Cannot find OpenSSL's evp.h 错误解决

centos7 php7 动态编译mysqlnd: configure: error: Cannot find OpenSSL's <evp.h> 错误解决

开始以为是没有安装openssl, openssl-devel,安装后发现还是提示这个错误,搜索了一下evp.h,这个文件也存在。
GOOGLE 了一下,在stackoverflow,找到了答案,原来是 phpize 生成的configure脚本有问题。

解决方法:

export PHP_OPENSSL_DIR=yes
./configure -with-openssl-dir=/usr/include/openssl

来自 http://www.bcty365.com/content-10-5849-1.html

<think>我们正在处理编译时缺少OpenSSL的`evp.h`头文件的问题。根据引用[1]和引用[2],这个错误通常是因为系统缺少OpenSSL的开发包(包括头文件和库)。解决方案是安装OpenSSL的开发包。###解决方案步骤:####1.**安装OpenSSL开发包**在Linux上,需要安装`libssl-dev`(Debian/Ubuntu)或`openssl-devel`(RHEL/CentOS)包。**Debian/Ubuntu系统:**```bashsudoaptupdatesudoaptinstalllibssl-dev```**RHEL/CentOS系统:**```bashsudoyuminstallopenssl-devel```安装后,头文件(包括`evp.h`)会放在`/usr/include/openssl/`目录下。####2.**验证头文件位置**安装完成后,检查`evp.h`是否存在:```bashls/usr/include/openssl/evp.h```如果存在,则说明安装成功。####3.**在编译时指定OpenSSL路径(可选)**如果安装后仍然找不到头文件,可能是编译器没有在默认路径搜索。此时,可以在编译命令中通过`-I`选项指定头文件路径:```bashgcc-I/usr/include/opensslyour_program.c-ooutput-lssl-lcrypto```注意:-`-I/usr/include/openssl`:指定头文件目录(实际上,因为`evp.h`在`openssl`子目录下,我们通常使用`#include<openssl/evp.h>`,所以指定其父目录`/usr/include`即可,但一般系统默认已经包含`/usr/include`,所以通常不需要额外指定)。-链接时使用`-lssl-lcrypto`来链接OpenSSL库。####4.**清理并重新编译项目**如果之前编译失败,建议先执行`makeclean`(如果使用make)清除之前的编译结果,然后重新编译。####5.**检查OpenSSL版本(可选)**如果安装后问题依旧,可能是OpenSSL版本不兼容。检查已安装的版本:```bashopensslversion```并确保它符合项目要求。如果需要特定版本,可能需要从源代码安装。###从源代码安装OpenSSL(备选方案)如果系统包管理器提供的OpenSSL版本不满足要求,可以手动编译安装:```bash#下载源码(以OpenSSL1.1.1为例)wgethttps://www.openssl.org/source/openssl-1.1.1u.tar.gztar-xzfopenssl-1.1.1u.tar.gzcdopenssl-1.1.1u#配置、编译和安装./config--prefix=/usr/local/openssl--openssldir=/usr/local/opensslmakesudomakeinstall#将新安装的OpenSSL路径添加到系统库和头文件搜索路径#方法1:在编译时指定路径gcc-I/usr/local/openssl/include-L/usr/local/openssl/libyour_program.c-ooutput-lssl-lcrypto#方法2:将路径添加到环境变量(临时)exportC_INCLUDE_PATH=/usr/local/openssl/include:$C_INCLUDE_PATHexportLIBRARY_PATH=/usr/local/openssl/lib:$LIBRARY_PATH```>**注意**:手动安装后,可能需要运行`sudoldconfig`更新动态链接库缓存。###总结大多数情况下,安装开发包`libssl-dev`或`openssl-devel`即可解决`evp.h`缺失的问题。如果问题仍然存在,检查编译命令中是否包含正确的头文件路径和链接选项。[^1]:引用[1]指出`<evp.h>`是OpenSSL的高层加密API头文件,编译时找不到该文件通常是因为缺少OpenSSL开发包。[^2]:引用[2]中提到在编译U-boot时遇到同样问题,解决方案是安装OpenSSL相关开发文件。###相关问题1.如何检查系统上安装的OpenSSL版本?2.编译OpenSSL程序时出现链接错误(如未定义的引用)该如何解决?3.如何在CMake项目中正确配置OpenSSL依赖?</think>### 解决 OpenSSL `evp.h` 头文件缺失的编译错误 #### 问题原因 `evp.h` 是 OpenSSL 的高级加密 API 头文件,编译时找不到该文件通常表示: 1. **缺少 OpenSSL 开发包**(最常见) 2. 头文件路径未包含在编译器中 3. OpenSSL 版本不兼容或安装不完整 4. 交叉编译环境未正确配置 --- ### 解决方案 #### 1. 安装 OpenSSL 开发包(推荐) 根据系统类型执行命令: | 系统类型 | 命令 | |----------------|----------------------------------------------------------------------| | **Debian/Ubuntu** | `sudo apt update && sudo apt install libssl-dev` | | **RHEL/CentOS** | `sudo yum install openssl-devel` | | **Alpine Linux** | `sudo apk add openssl-dev` | | **macOS (Homebrew)** | `brew install openssl` | 安装后验证头文件位置: ```bash ls /usr/include/openssl/evp.h # 标准路径 # 或 Homebrew 路径 ls /usr/local/opt/openssl/include/openssl/evp.h ``` --- #### 2. 配置编译器包含路径 如果已安装但编译器仍找不到头文件,在编译命令中添加 `-I` 参数: ```bash # 标准路径 gcc -I/usr/include/openssl your_program.c -o output -lcrypto # Homebrew 特殊路径 gcc -I/usr/local/opt/openssl/include your_program.c -o output -lcrypto ``` 在 Makefile 中添加: ```makefile CFLAGS += -I/usr/include/openssl # 或 CFLAGS += -I$(brew --prefix openssl)/include ``` --- #### 3. 解决交叉编译问题(嵌入式开发) 当交叉编译时(如 U-Boot): ```bash # 指定交叉编译器的 OpenSSL 路径 export CROSS_COMPILE=arm-linux-gnueabihf- export CFLAGS="-I/path/to/target-openssl/include" make ``` --- #### 4. 检查 OpenSSL 版本兼容性 ```bash # 查看已安装版本 openssl version # 安装特定版本(Ubuntu 示例) sudo apt install libssl1.0-dev # 旧版本 sudo apt install libssl3-dev # 新版本 ``` --- ### 验证解决方案 创建测试程序 `evp_test.c`: ```c #include <openssl/evp.h> int main() { EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); EVP_CIPHER_CTX_free(ctx); return 0; } ``` 编译并运行: ```bash gcc -I/usr/include/openssl evp_test.c -o evp_test -lcrypto ./evp_test # 无输出表示成功 ``` --- ### 常见错误处理 - **链接错误**:添加 `-lcrypto` 链接器标志 - **多版本冲突**:使用 `update-alternatives --config openssl` (Debian) - **权限问题**:`sudo make install` 后执行 `sudo ldconfig` > 90% 的案例通过安装 `libssl-dev` 或 `openssl-devel` 解决[^1][^2]。`evp.h` 属于 OpenSSL 开发包而非基础运行时库,因此必须单独安装开发包。 [^1]: 引用[1]指出`<evp.h>`是OpenSSL的高层加密API头文件,编译时找不到该文件通常是因为缺少OpenSSL开发包。 [^2]: 引用[2]中提到在编译U-boot时遇到同样问题,解决方案是安装OpenSSL相关开发文件。 ### 相关问题 1. 如何解决 OpenSSL 链接错误 `undefined reference to EVP_CIPHER_CTX_new`? 2. 交叉编译时如何指定 OpenSSL 的库路径? 3. 如何在 Docker 容器中配置 OpenSSL 开发环境? 4. OpenSSL 1.1 和 3.0 的 API 差异有哪些?
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值