在 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 时出错的主要内容,如果未能解决你的问题,请参考以下文章
在 OS X 上从 zsh 切换到 bash,然后再切换回来?