【问题标题】:How to compile PHP with OpenSSL on OS X 10.9?如何在 OS X 10.9 上使用 OpenSSL 编译 PHP?
【发布时间】:2016-03-28 13:50:00
【问题描述】:

我在尝试从源码编译PHP 5.6.10,遇到了如下问题:

Undefined symbols for architecture x86_64:
  "_PKCS5_PBKDF2_HMAC", referenced from:
      _zif_openssl_pbkdf2 in openssl.o
  "_TLSv1_1_client_method", referenced from:
      _php_openssl_setup_crypto in xp_ssl.o
  "_TLSv1_1_server_method", referenced from:
      _php_openssl_setup_crypto in xp_ssl.o
  "_TLSv1_2_client_method", referenced from:
      _php_openssl_setup_crypto in xp_ssl.o
  "_TLSv1_2_server_method", referenced from:
      _php_openssl_setup_crypto in xp_ssl.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [libs/libphp5.bundle] Error 1

OpenSSL 是通过 Brew 安装的。在 PHP 中包括 --with-openssl=/usr/local/Cellar/openssl/1.0.2c

附: 在尝试将 /usr 用于 OpenSSL 之前,但遇到了同样的错误。

【问题讨论】:

  • 能否提供平台详细信息和编译器信息?
  • @cyrbil 你到底需要什么?
  • 你的操作系统版本uname -smorv和你的编译器gcc --version(假设你使用gcc ...)
  • @cyrbil 这是你的选择dropbox.com/s/ap129bv74les772/…
  • 您能接受@Bob 的回答,因为它是正确的吗?谢谢

标签: php openssl homebrew osx-mavericks


【解决方案1】:

Makefile 中有一行 EXTRA_LIBS,类似于:

EXTRA_LIBS = -lresolv -lmcrypt -lltdl -liconv-lm -lxml2 -lcurl -lssl -lcrypto

删除所有出现的-lssl-lcrypto 并将完整路径添加到libssl.dyliblibcrypto.dylib (brew 将openssl 链接到/usr/local/opt/openssl/lib/)

EXTRA_LIBS = -lresolv -lmcrypt /usr/local/opt/openssl/lib/libssl.dylib /usr/local/opt/openssl/lib/libcrypto.dylib -lltdl -liconv-lm -lxml2 -lcurl

【讨论】:

  • 也适用于带有 PHP 7.0.5 + OpenSSL 1.0.2g 的 El Capitan 10.11.4,手动安装(无 brew,无端口)。
【解决方案2】:

要跟进 Bob Fanger 的回答(这对我来说在 os x 10.11.3 上非常有效),这里有一个小脚本,您可以在构建目录中运行它来更改 Makefile:

#!/usr/bin/php
<?php
if (true != copy('Makefile', 'Makefile.sav'))
    die("** cannot copy 'Makefile' to 'Makefile.sav'\n");
$lines = file('Makefile');
if (false == $lines)
    die("** connot read 'Makefile'\n");
$output = fopen('Makefile', 'wb');
if (false == $output)
    die("** unable to open 'Makefile'\n");
foreach ($lines as $line) {
    if (preg_match('/^EXTRA_LIBS\s+=\s+/', $line)) {
        $line = preg_replace('/^EXTRA_LIBS\s+=\s+/', 'EXTRA_LIBS = /usr/local/opt/openssl/lib/libssl.dylib /usr/local/opt/openssl/lib/libcrypto.dylib', $line);
        $line = preg_replace(['/-lssl/', '/-lcrypto/'], [], $line);
    }
    if (false === fwrite($output, $line))
        die("** writing line to 'Makefile' failed\n");
}
fclose($output);
echo "Success - your Makefile is set for ssl\n";

享受吧!

【讨论】:

    【解决方案3】:

    如果你在 OSX El Capitan 上使用 phpbrew,你需要提供你的 openssl 的完整路径:

    phpbrew install php-7.0.4 +openssl=/usr/local/Cellar/openssl/[YOUR OPEN SSL VERSION]

    【讨论】:

      猜你喜欢
      • 2015-01-21
      • 2013-11-10
      • 2014-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-03
      • 1970-01-01
      • 2013-12-11
      相关资源
      最近更新 更多