【问题标题】:PHP compile fails with undefined symbols for architecture x86_64, libiconv on macOS SierraPHP 编译失败,架构 x86_64 的未定义符号,macOS Sierra 上的 libiconv
【发布时间】:2017-03-03 05:09:20
【问题描述】:

我已将 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 邮件列表中提问? (php.net/mailing-lists.php,可能是“安装问题和问题”列表)
  • 谢谢迈克。会的。

标签: php macos iconv macos-sierra libiconv


【解决方案1】:

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

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

**

他们的架构似乎不兼容。

**

一句话,原来的 libiconv 源代码绝对不兼容 OS X。 在 OS X 中通过命令安装解决了问题:

brew install libiconv.

taehwanjeoung@taehwanui-MacBookAir ~ % brew install libiconv

正在更新自制软件... ==> 自动更新 Homebrew! 更新了 1 个水龙头(自制/核心)。 ==> 新公式 千兆赫 ==> 更新公式 ammonite-repl contentful-cli gwt libwebsockets salt 角度-cli detekt homeassistant-cli mapserver stress-ng ask-cli ethereum katago php topgrade bazel 利用db 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”:

纳米制作文件

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

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

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

我在上面的答案sn-p旁边加了更合理的细节给你解释清楚。

所以让我解释一下:

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

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

我想推荐你阅读《软件》这本书 工匠 - 由 Sandro Mancuso 编写。”这是更适合的方法(无论如何不是工具) 我个人能想到的开发和调试空间。还有人否认 不知何故。

【讨论】:

  • 我正在尝试帮助自己,而且有时我什至会通过堆栈溢出来帮助他人。
【解决方案2】:
  1. brew install libiconv (libiconv will install in /usr/local/opt/libiconv/)
  2. 在 MakeFile 中找到 EXTRA_LIBS 变量。
  3. -liconv 更改为/usr/local/opt/libiconv/lib/libiconv.dylib

原因如下:

  • Mac os 在dir/usr/lib/libiconv.dylib 中有自己的libiconv.dylib,它们没有 包含_libiconv _libiconv_close . founctions。更新到新的 libiconv 版本并引用它会解决问题

【讨论】:

    【解决方案3】:

    这可能会解决问题

    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 
    

    【讨论】:

    • 你能解释一下“这个”是什么以及如何使用它吗?
    • 有没有办法在./configure 命令中进行修复?我们如何在不手动编辑Makefile 的情况下排除 MacOSX 库?
    • 是的,这也是为我做的。我没有删除该行,只是在我发现对 Xcode 路径的引用的每一行中的“-L / usr/local/iconv/lib”(这是我从源代码编译的 iconv lib)之后将其移动(注意还有 -rpath 对 -L.... 的引用,并将它们也更改为行尾
    • 实际上,我在编译 git 时以不同的方式遇到了同样的事情,这让我深入了解到底发生了什么并解决它。我创建了a post to explain why this is happening with iconv
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 2011-09-23
    • 1970-01-01
    相关资源
    最近更新 更多