8

我已将 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

但这并没有什么不同。有什么建议么?

任何帮助将非常感激。

4

3 回答 3

8

这可能会解决问题

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 
于 2018-04-20T12:37:22.313 回答
3
  1. 酿造安装 libiconv (libiconv will install in /usr/local/opt/libiconv/)
  2. 在 MakeFile 中找到EXTRA_LIBS变量。
  3. 改为 -liconv_/usr/local/opt/libiconv/lib/libiconv.dylib

原因如下:

  • Mac os 有自己的libiconv.dylib in dir/usr/lib/libiconv.dylib,其中不包含_libiconv _libiconv_close . founctions. 更新到新的 libiconv 版本并对其进行引用将解决此问题
于 2019-03-08T09:24:12.160 回答
-1

我来教你。这是由于在您的 php 源代码编译过程中损坏的符号造成的。

由于 OS X 使用基于 llvm 工具链的 clang,而 php 原始源代码基于 GNU 库,其中它仅与 gcc 兼容,而不是您已经熟悉的 clang。

**

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

**

一言以蔽之,原来的 libiconv 源代码肯定与 OS X 不兼容。在 OS X 中通过命令安装解决了以下问题:

酿造安装 libiconv。

taehwanjeoung@taehwanui-MacBookAir ~ % brew install libiconv

正在更新 Homebrew... ==> 自动更新 Homebrew!更新了 1 个水龙头(自制/核心)。==> 新公式 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柯南盖茨比-cli libmypaint pidgin

警告:libiconv 1.16已经安装并且是最新的要重新安装 1.16,运行brew reinstall libiconv

因为它将安装具有完整 x86-64 位符号的 OS X 兼容库。

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

我建议您不要像往常一样使用每个开发工具链的最新版本。在某种程度上,你会更少冲突,这直接意味着当你在做更重要的任务时花费更少的时间。

你甚至需要在命令“make”在 OS X 上编译之前编辑 Makefile。

Mac 开发者经常使用“nano 命令行工具代替 vi”:

纳米 Makefile

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

那么你在哪里可以看到 linux 内核系统和 OS X 系统之间的差异:linux 一的 .so 文件扩展和 mac os 一的 dylib?

这些名字暗示了它们的编译架构和内部的结构有点不同。

我在上面的答案片段旁边为您添加了更多合理的细节,以便清楚地解释。

所以让我解释一下:

这是您的 GNU 源代码编译过程中架构符号损坏的问题,与 OS X Unix 系统环境不兼容。因为 OS X 比 linux 内核更像 BSD 系统。

  • 我正在培养爱好者。所以我什至都不知道。你也需要每天学习。祝你好运。

我想推荐您阅读《软件工匠 - Sandro Mancuso 所著》一书。它是我个人能想到的更适合开发和调试空间的方法(无论如何不是工具)。其他人以某种方式否认了这一点。

于 2020-05-15T04:33:44.173 回答