在 OS X 上从源代码构建 PHP 5.2.10 时链接 libresolv 时出错

Posted

技术标签:

【中文标题】在 OS X 上从源代码构建 PHP 5.2.10 时链接 libresolv 时出错【英文标题】:Errors linking libresolv when building PHP 5.2.10 from source on OS X 【发布时间】:2009-07-30 04:23:45 【问题描述】:

首先,我通常会选择使用 php 的预编译二进制文件,但需要从源代码构建以满足特定的业务需求。 (我不是那种为了好玩而编译开源应用程序的类型。)

我在 OS X 10.6 上构建,当我尝试将 make PHP 5.2.10 作为 Apache 模块 (--with-apxs2) 时遇到以下错误:

Undefined symbols:
  "_res_9_dn_expand", referenced from:
      _zif_dns_get_mx in dns.o
  "_res_9_search", referenced from:
      _zif_dns_get_mx in dns.o
      _zif_dns_check_record in dns.o
  "_res_9_dn_skipname", referenced from:
      _zif_dns_get_mx in dns.o
      _zif_dns_get_mx in dns.o
ld: symbol(s) not found

这些符号是 libresolv 的一部分,它包含在 OS X 上的 /usr/lib/libresolv.dylib 中(并且自至少 10.4 以来一直存在)。请注意,*.dylib 文件在 Mac 上等同于 Linux 上的 *.so 文件,我已经通过将--with-iconv=shared,/usr 传递给./configure 成功地在libiconv.dylib 中编译,这消除了iconv 库的类似链接器错误.

当我运行./configure 时,它会检测到/usr/include/resolv.h 并在makefile 中启用它。但是,我似乎无法弄清楚如何让共享库正确链接。关于让它发挥作用的任何提示?我从来没有做过类似将自定义链接器标志传递给./configure 之类的事情,不幸的是,谷歌在这个问题上对我没有帮助。


编辑:如果有人想尝试在 Snow Leopard 上复制错误,我将从 this TAR download 构建。

【问题讨论】:

【参考方案1】:

尝试将 -lresolv 添加到您的 Makefile。

希望这会有所帮助。我从这个discussion得到了建议。

【讨论】:

这是一个很好的线索。我刚刚在一台 10.5 的机器上运行了我的编译脚本,它构建得很好,所以这对 Snow Leopard 来说绝对是一个新问题。不幸的是,我无法确定在 Makefile 中添加-lresolv 的位置。 (如果我可以设置一个环境变量并让./configure 为我添加它会更好。)MacPorts 使用他们自己的端口文件格式,所以它对具体细节没有多大帮助,不幸的是......跨度> 想通了。我添加了 if [ uname -r == "10.0.0" ];然后导出 EXTRA_LDFLAGS=-lresolv; fi 在使用其他选项调用./configure 之前,它成功地将-lresolv 添加到Makefile。我接受这个答案,因为它为我指明了正确的方向。谢谢! 我应该注意到,自从接受这个答案后,我已经更新了我的代码以使用uname -r | cut -d . -f 1 来获取内核主要版本(在本例中为 10)。这很重要,因为尽管 OS X 10.6.0 的内核版本为 10.0.0,但 OS X 10.6.2 的内核版本为 10.2.0,以此类推。我现在将此值存储到 $KERNEL_MAJOR 并使用 if [ $KERNEL_MAJOR -ge 10 ]; then ... fi 检查 10.6 或更高版本。 在 ./configure 为我工作之前添加了 export EXTRA_LDFLAGS=-lresolv。非常感谢 如果EXTRA_LDFLAGS=-lresolv不起作用,您可以尝试在Makefile中直接在EXTRA_LIBS末尾添加“-lresolv”。如果您没有看到以 EXTRA_LIBS 开头的行,请将其添加到 EXTENSION_DIR 行下方,如下所示:EXTRA_LIBS = -lresolv 这对我有用。【参考方案2】:

如果您在运行配置脚本之前设置了配置环境变量,则不必编辑生成文件。例如:

LIBS=-lresolv ./configure --with-apxs2 --with-gd (etc.)

这个解决方案对我有用。

【讨论】:

【参考方案3】:

我建议使用 fink/macports 解决依赖关系。使用 macports 构建所有组件,然后从源代码编译 php,将 lib 目录指向 /opt/...

您甚至可以使用 macports 直接从源代码构建 php。

【讨论】:

不幸的是,这是不可行的,因为编译后的二进制文件必须在一个非常特定的自定义位置(即不在/opt)并且具有最小的依赖关系。不过总的来说,这是一个很好的建议。【参考方案4】:

对于那些不知道在哪里添加 -lresolv 的人:)

编辑Makefile,找到行:

EXTRA_LIBS = [...lots of libs here...]

并将 -lresolv 添加到这一行,如下所示:

EXTRA_LIBS = -lresolv [...lots of libs here...]

在为 LiteSpeed 编译 PHP 时在 MacOS X 10.6 Snow Leopard 上为我工作。

【讨论】:

是的,这也行。我在上面接受的答案中添加了一条评论,它将在运行 ./configure 之前在需要的地方添加此标志,并且仅在 Snow Leopard 上。比手动调整更容易(并且更自动化)。

以上是关于在 OS X 上从源代码构建 PHP 5.2.10 时链接 libresolv 时出错的主要内容,如果未能解决你的问题,请参考以下文章

如何在 10.6 上为 OS X 10.5 构建 Qt

在 OS X 上从 XCode 迁移到 GCC

Mac OS X 上的 Qt 安装问题

在 OS X 上从 zsh 切换到 bash,然后再切换回来?

如何在 mac os x 上从通过 USB 连接的多轨混音器获取输入

在 Windows 上从源代码构建 NSIS(VS2012)