包含 cURL 时 PHP 8.2.7 编译不起作用

问题描述 投票:0回答:1

我安装 PHP 时得到以下信息:

php-8.2.7/ext/curl/interface.c:3085:对 `curl_easy_upkeep' 的未定义引用

我认为这是一个常见的错误(因此发布了这篇文章),到目前为止我已经尝试过以下操作:

  • dnf install curl curl-devel
  • 安装了最新的 cURL 到
    /usr/local/curl
    (可以看到 lib 和包含目录)
  • 尝试了多次,包括在 PHP 的配置命令中不使用curl

所以,如果有人能打败我,我就向你致敬。

仅供参考,错误的完整输出为:

lcrypto -lcrypt -lrt -o sapi/cli/php
ext/curl/interface.o: In function `zif_curl_upkeep':
/tmp/serverforge/downloads/php-8.2.7/ext/curl/interface.c:3085: undefined reference to `curl_easy_upkeep'
collect2: error: ld returned 1 exit status
make: *** [Makefile:310: sapi/cli/php] Error 1

我尝试从源代码(8.2.7)安装 PHP,我希望使用 cURL 安装它,但只能在 php 8.7.2 配置命令中没有 cURL 的情况下工作。

我使用的完整命令是:

./configure  --prefix=/usr/local/php82 --enable-cli --enable-fpm --program-suffix=82 --with-xsl --with-libxml=/usr/local/libxml2 --with-apxs2=/usr/local/apache/bin/apxs --enable-bcmath --with-bz2=/usr/local/bzip2 --enable-calendar --with-curl=/usr/local/curl --enable-ftp --enable-gd --with-libdir=lib64 --with-imap --with-imap-ssl --with-kerberos --enable-intl --enable-mbstring --with-mysqli --with-pdo-mysql --with-openssl=/usr/local/ssl --with-xsl --enable-soap --enable-sockets; make; make install;

另请注意,

/usr/local/curl/bin/curl --version
输出 8.8.0。

编辑 我后来发现 php74 和 php80 都编译得很好。有人能明白这里发生了什么吗?

下面列出了cURL版本,之后出现的libcurl安装不在我的控制范围内,所以我不知道在哪里可以找到它。

[root@localhost]# curl -V curl 8.8.0 (x86_64-pc-linux-gnu) libcurl/8.8.0 OpenSSL/1.1.1k zlib/1.2.11 zstd/1.4.4 OpenLDAP/2.4.46 Release-Date: 2024-05-22 Protocols: dict file ftp ftps gopher gophers http https imap imaps ipfs ipns ldap ldaps mqtt pop3 pop3s rtsp smb smbs smtp smtps telnet tftp Features: alt-svc AsynchDNS HSTS HTTPS-proxy IPv6 Largefile libz NTLM SSL threadsafe TLS-SRP UnixSockets zstd 

我将

which curl-config
的硬链接更改为符号链接到
/usr/local/curl/bin/curl-config
,这改变了输出,但没有改变它无法编译的事实。

从我的系统来看:

    /usr/local/curl/lib/libcurl.a
    /usr/local/curl/lib/libcurl.la
    /usr/local/curl/lib/libcurl.so
    /usr/local/curl/lib/libcurl.so.4
    /usr/local/curl/lib/libcurl.so.4.7.0
    /usr/local/curl/lib/libcurl.so.4.8.0
    /usr/local/lib/libcurl.a
    /usr/local/lib/libcurl.la
    /usr/local/lib/libcurl.so
    /usr/local/lib/libcurl.so.4
    /usr/local/lib/libcurl.so.4.7.0

看起来有两个安装。如何才能使用正确的安装方式?目前

--with-curl=/usr/local/curl
还没有这样做。

仅供参考:

[root@localhost]# curl-config --version
libcurl 8.8.0
[root@localhost]# curl-config --help
[root@localhost]# curl-config --static-libs
/usr/local/curl/lib/libcurl.a -lssl -lcrypto -lssl -lcrypto -lldap -llber -lzstd -lz -pthread
[root@localhost bin]# curl-config --ca
"/etc/pki/tls/certs/ca-bundle.crt"
[root@localhost]# curl-config --cc
gcc
[root@localhost]# curl-config --libs
-L/usr/local/curl/lib -lcurl
php curl
1个回答
0
投票

不是为了赏金,只是想帮忙:

从您的文件列表来看,您的系统上似乎安装了 2x libcurl

  1. /usr/local/curl/lib
  2. /usr/local/lib

由于多次安装,构建过程可能仍然链接到旧的 libcurl...所以让我们有一个新的开始:

  1. R刷新库缓存:
    ldconfig
  2. 检查尝试使用的 PHP 是哪个版本的 libcurl
    ldd /usr/local/curl/lib/libcurl.so
  3. 清除构建工件:
    make clean
  4. 确保在 LD_LIBRARY_PATH 中指定正确版本的
    libcurl
    ,以优先考虑此链接路径:
    export LD_LIBRARY_PATH=/usr/local/curl/lib:$LD_LIBRARY_PATH
  5. 您还可以添加
    PKG_CONFIG_PATH
    以确保 pkg-config 选择正确的 libcurl.pc
    export PKG_CONFIG_PATH=/usr/local/curl/lib/pkgconfig:$PKG_CONFIG_PATH
  6. 使用您自己的参数重新配置 PHP:
    ./configure --prefix=/usr/local/php82
    ...
  7. 构建它:
    make
  8. 验证正确的链接库:
    ldd sapi/cli/php | grep curl
    php -i | grep cURL

失败?您可以在配置命令中手动指定链接器标志:

./configure LDFLAGS="-L/usr/local/curl/lib" CPPFLAGS="-I/usr/local/curl/include" ...
© www.soinside.com 2019 - 2024. All rights reserved.