在macOS Sierra上,PHP编译失败,出现undefined symbols for architecture x86_64和libiconv的错误。

9

我把一台 Mac 升级到了 macOS 10.12.0 Sierra,并试图将 PHP 升级到7.0.9版本,但是在“make test”过程中出现了错误:

Undefined symbols for architecture x86_64:
  "_libiconv", referenced from:
      _zif_iconv_substr in iconv.o
      _zif_iconv_mime_encode in iconv.o
      _php_iconv_string in iconv.o
      __php_iconv_strlen in iconv.o
      __php_iconv_strpos in iconv.o
      __php_iconv_appendl in iconv.o
      _php_iconv_stream_filter_append_bucket in iconv.o
      ...
  "_libiconv_close", referenced from:
      _zif_iconv_substr in iconv.o
      _zif_iconv_mime_encode in iconv.o
      _php_iconv_string in iconv.o
      __php_iconv_strlen in iconv.o
      __php_iconv_strpos in iconv.o
      __php_iconv_mime_decode in iconv.o
      _php_iconv_stream_filter_factory_create in iconv.o
      ...
  "_libiconv_open", referenced from:
      _zif_iconv_substr in iconv.o
      _zif_iconv_mime_encode in iconv.o
      _php_iconv_string in iconv.o
      __php_iconv_strlen in iconv.o
      __php_iconv_strpos in iconv.o
      __php_iconv_mime_decode in iconv.o
      _php_iconv_stream_filter_factory_create in iconv.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/libphp7.bundle] Error 1
我使用以下方式编译它:
./configure --prefix=/usr/local/php5 --mandir=/usr/share/man --infodir=/usr/share/info --sysconfdir=/etc --with-config-file-path=/etc --with-zlib --with-zlib-dir=/usr --with-openssl=/usr/local --enable-exif --enable-ftp --enable-mbstring --enable-mbregex --enable-sockets --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-apxs2=/usr/local/apache2/bin/apxs --enable-zip --with-curl

我尝试添加不同的'--with-iconv-dir='选项,但总是出现相同的未定义符号错误。

我已经下载并编译了libiconv,但没有效果。甚至使用以下配置进行编译:

CFLAGS='-arch x86_64' CCFLAGS='-arch x86_64' CXXFLAGS='-arch x86_64' ./configure

但这没有任何区别。有什么建议吗?

非常感谢您的帮助。


作为编译问题,您是否确保在适当的PHP邮件列表上进行了询问?(http://php.net/mailing-lists.php,可能是“安装问题和故障”列表) - Mike 'Pomax' Kamermans
谢谢 Mike。我会的。 - jlbrown
3个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
9
这可能会解决问题。
vim Makefile
find EXTRA_LDFALGS and EXTRA_LDFLAGS_PROGRAMS
remove L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/lib 

你能澄清一下“this”是什么以及如何使用它吗? - Nico Haase
有没有办法在 ./configure 命令中进行修复?我们如何在不手动编辑 Makefile 的情况下排除 MacOSX 库? - Logan
1
是的,这对我也起作用了。我没有删除那一行,而是将它移动到每个引用Xcode路径的行的“-L /usr/local/iconv/lib”(这是我从源代码编译的iconv库)之后(请注意,还有-rpath引用-L....,并将其更改为在行末)。 - John Q
实际上,我在编译git时以不同的方式遇到了同样的问题,这促使我深入研究并找出了真正的原因并解决了它。我创建了一篇文章来解释为什么在Mac OSX上会出现iconv的undefined symbol - John Q

4
  1. 安装libiconv: brew install libiconv (libiconv将会被安装在/usr/local/opt/libiconv/目录下)
  2. 在Makefile文件中查找EXTRA_LIBS变量。
  3. -liconv替换为/usr/local/opt/libiconv/lib/libiconv.dylib

原因如下:

  • Mac OS自带的libiconv.dylib位于dir/usr/lib/libiconv.dylib,但它不包含_libiconv_libiconv_close等函数。升级到新版本的libiconv并引用将解决此问题。

-1

我来教你。这是由于在你的PHP源代码编译过程中出现了损坏的符号所致。

由于OS X使用基于clang的llvm工具链,而PHP原始源代码基于GNU库,只兼容于gcc而不是你已经熟悉的clang。

**

他们的架构似乎在某种程度上不兼容。

**

一句话,原始的libiconv源代码与OS X不兼容。 通过在OS X中使用命令进行安装可以解决这些问题: brew install libiconv。 taehwanjeoung@taehwanui-MacBookAir~%brew install libiconv 更新Homebrew... ==> 自动更新Homebrew! 更新1个tap(homebrew / core)。 ==> 新公式 ghz ==> 已更新公式 ammonite-repl contentful-cli gwt libwebsockets salt angular-cli detekt homeassistant-cli mapserver stress-ng ask-cli ethereum katago php topgrade bazel exploitdb lerna php @ 7.2 borgmatic fastlane libdeflate php @ 7.3 conan gatsby-cli libmypaint pidgin 警告:libiconv 1.16已经安装并且是最新的 要重新安装1.16,请运行brew reinstall libiconv 因为它将安装完整的x86-64位符号的OS X兼容库。

昨天我在练习早期版本的php 5时遇到了同样的问题。我在最新版本的"Mac OS X 10.15.4,Catalina"上成功编译。

我建议您不要总是使用每个开发工具链的最新版本。这样,您会更少地发生冲突,这直接意味着在执行更重要的任务时耗费更少的时间。

在OS X上进行编译之前,您甚至需要编辑Makefile:

Mac开发人员通常使用"nano命令行工具而不是vi":

nano Makefile

然后找到EXTRA_LIBS环境变量,将-liconv更改为/usr/local/opt/libiconv/lib/libiconv.dylib - 这是homebrew安装的Mac OS X兼容库的位置。因为-liconv的默认路径在其他地方:/usr/lib/ - 其中不兼容的损坏架构符号驻留。

那么你在哪里可以看到Linux内核系统和OS X系统之间的差异:

.so文件扩展名用于Linux,而dylib用于Mac OS。

名称暗示它们的编译体系结构和内部结构有所不同。

除了上面的答案片段之外,我为你添加了更合理的细节以清楚地解释。

所以让我解释一下:

这是一个关于你的GNU源代码编译过程中出现的损坏的体系结构符号的问题,它不兼容OS X Unix系统环境。 因为OS X更像BSD系统而不是像Linux内核那样。

  • 我在业余时间进行开发。所以我并不知道所有的东西。你也需要每天学习。祝你好运。

我想推荐你阅读《软件工匠——Sandro Mancuso著》这本书。我个人认为它是更适合开发和调试空间的方法(无论如何都不是工具)。但也会有其他人拒绝这种方法。


我正在尝试帮助自己,而且有时我甚至会前往Stack Overflow帮助他人。 - Jeoung Taehwan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,