PHP 8.2.7集成cURL编译失败:未定义引用curl_easy_upkeep
编译PHP 8.2.7集成cURL报错
curl_easy_upkeep未定义的解决办法 问题描述
编译PHP 8.2.7时,只要配置中包含cURL就会编译失败,报错信息如下:
php-8.2.7/ext/curl/interface.c:3085: undefined reference to
curl_easy_upkeep
已尝试的操作:
- 执行
dnf install curl curl-devel安装系统依赖 - 手动将cURL 8.8.0安装到
/usr/local/curl - 移除cURL相关配置后编译可正常完成,但无法集成cURL扩展
- 系统存在两个cURL实例,即使使用
--with-curl=/usr/local/curl配置参数,编译仍未调用手动安装的高版本cURL库 - PHP 7.4、8.0版本可正常编译集成cURL
解决步骤
1. 配置环境变量,优先指向手动安装的cURL
在执行PHP配置命令前,先设置环境变量,让编译器优先搜索/usr/local/curl下的头文件和库文件:
export LD_LIBRARY_PATH=/usr/local/curl/lib:$LD_LIBRARY_PATH export C_INCLUDE_PATH=/usr/local/curl/include:$C_INCLUDE_PATH export LIBRARY_PATH=/usr/local/curl/lib:$LIBRARY_PATH
然后执行PHP配置命令,明确指定cURL路径(如果是64位系统,加上--with-libdir=lib64):
./configure --prefix=/usr/local/php82 --with-curl=/usr/local/curl --with-libdir=lib64 [你的其他配置参数]
2. 确认cURL版本兼容性
curl_easy_upkeep函数是cURL 7.62.0及以上版本才引入的,PHP 8.2.7的curl扩展依赖该函数。先确认手动安装的cURL版本:
/usr/local/curl/bin/curl --version
如果版本低于7.62.0,重新安装符合要求的cURL版本(8.8.0满足要求,确保安装过程无报错)。
3. 清理编译缓存
每次重新配置前,清理旧的编译文件,避免缓存干扰:
make clean make distclean
4. 强制指定链接库路径
如果上述方法仍无效,在配置时直接通过LDFLAGS指定链接参数,确保编译时链接到手动安装的cURL库:
./configure --prefix=/usr/local/php82 --with-curl=/usr/local/curl --with-libdir=lib64 LDFLAGS="-L/usr/local/curl/lib -Wl,-rpath,/usr/local/curl/lib" [你的其他配置参数]
其中-Wl,-rpath用于指定运行时加载器优先使用的库路径,避免后续运行PHP时出现库版本不匹配的问题。
5. 排查编译链接过程
若问题依旧,可通过以下方式排查编译时的链接细节:
- 查看
ext/curl/config.log文件,搜索curl_easy_upkeep,确认是否找到了/usr/local/curl中的函数定义 - 执行
make VERBOSE=1编译,查看链接阶段是否使用了/usr/local/curl/lib/libcurl.so,而非系统默认的/usr/lib64/libcurl.so
内容的提问来源于stack exchange,提问作者youdsmedia
相关产品推荐
相关产品推荐

