我正在尝试在我的 Mac 上编译 php。
我已遵循本教程:http://www.malisphoto.com/tips/php-on-os-x.html
我也检查了这篇文章:在 Snow Leopard 10.6.3 上使用 intl 扩展编译 PHP 5.3.2
这是我的配置选项:
。/配置 \ --prefix=/usr \ --with-apxs2=/usr/sbin/apxs \ --with-ldap=/usr \ --with-kerberos=/usr \ --启用-cli \ --with-zlib-dir=/usr \ --启用-exif \ --启用-ftp \ --启用-mbstring \ --启用-mbregex \ --启用套接字 \ --with-iodbc=/usr \ --with-curl=/usr \ --with-config-file-path=/etc \ --sysconfdir=/private/etc \ --with-mysql-sock=/tmp \ --with-mysql=/usr/local/mysql \ --with-openssl=/usr \ --with-xmlrpc \ --with-xsl=/usr \ --无梨 \ --with-libxml-dir=/usr \ --with-iconv=/usr/local \ --with-pdo-mysql=/usr/local/mysql/bin/mysql_config \ --with-gd \ --with-jpeg-dir=/opt/local \ --with-png-dir=/opt/local \ --with-freetype-dir=/opt/local \ --with-mcrypt=/opt/本地 \ --启用国际 \ –with-icu-dir=/opt/local
我修改了 Makefile,将其替换为:
$(CC) $(MH_BUNDLE_FLAGS) $(CFLAGS_CLEAN) $(EXTRA_CFLAGS) $(LDFLAGS) $(EXTRA_LDFLAGS) $(PHP_GLOBAL_OBJS:.lo=.o) $(PHP_SAPI_OBJS:.lo=.o) $(PHP_FRAMEWORKS) $(EXTRA_LIBS) $(ZEND_EXTRA_LIBS) -o $@ && cp $@ libs/libphp$(PHP_MAJOR_VERSION).so
改为:
$(CC) $(CFLAGS_CLEAN) $(EXTRA_CFLAGS) $(LDFLAGS) $(EXTRA_LDFLAGS) $(PHP_GLOBAL_OBJS:.lo=.o) $(PHP_SAPI_OBJS:.lo=.o) $(PHP_FRAMEWORKS) $(EXTRA_LIBS) $(ZEND_EXTRA_LIBS) $(MH_BUNDLE_FLAGS) -o $@ && cp $@ libs/libphp$(PHP_MAJOR_VERSION).so
我也将这个 -lstdc++ 放入 Makefile 中的 EXTRA_LIBS 中。
这是错误消息:
在 /opt/local/include/unicode/utypes.h:36 包含的文件中, 来自/usr/local/src/php-5.3.3/ext/intl/grapheme/grapheme.h:21, 来自 /usr/local/src/php-5.3.3/ext/intl/php_intl.h:26, 来自 main/internal_functions.c:47: /opt/local/include/unicode/umachine.h:308:错误:重新定义 typedef‘UChar’ /usr/include/libxml2/libxml/encoding.h:41:错误:先前的“UChar”声明在这里 make:*** [main/internal_functions.lo] 错误 1
我尝试了另一个没有 intl 的构建(删除 ./configure 中的最后两行)并且它可以工作。
有人可以向我解释错误信息,或者指出 ./configure 选项中可能存在什么错误吗? 提前谢谢了
答案1
我尝试做同样的事情,但由于大量相同类型的错误而失败。我尝试逐一更正,结果又出现了一个错误!我“降级”到 php 5.2.14,没有再出现问题。
答案2
或者,你也可以自己从最新的稳定源码包构建 libxml2,我就是这么做的,因为回到 5.2 不是一个选择,而且我在我的 G4 dev box 上手动编译了几乎所有的 php 依赖项(还有 libicu):1) 从以下位置获取 libxml2 的最新发布源码包http://www.xmlsoft.org/downloads.html 2)编译 libxml2: tar xf libxml2-sources-2.7.7.tar.gz cd libxml2-2.7.7 VER=2.7.7 ./configure --enable-shared --enable-static --prefix=/opt/libxml2-${VER} make && make install cd /opt; rm -rf libxml2; ln -s libxml2-${VER} libxml2 3)使用 --with-libxml-dir=/opt/libxml2 编译 php(不要忘记 rm config.cache,以防您在配置/构建尝试之间没有清理所有内容。)
希望这能有所帮助,克里斯
答案3
我知道这已经过时了,但我遇到了同样的问题。只需注释掉以下行
typedef uint16_t UChar;
/opt/local/include/unicode/umachine.h 为我解决了这个问题。
答案4
问题在于 ICU 和 libxml2 都定义了 UChar。这是 libxml2 中存在问题的代码,具体来说是 /usr/include/libxml2/libxml/encoding.h:
#ifdef LIBXML_ICU_ENABLED
/* Forward-declare UConverter here rather than pulling in <unicode/ucnv.h>
* to prevent unwanted ICU symbols being exposed to users of libxml2.
* One particular case is Qt4 conflicting on UChar32: <rdar://problem/5100933>.
*/
#include <stdint.h> struct UConverter; typedef struct UConverter UConverter;
#ifdef _MSC_VER typedef wchar_t UChar;
#else typedef uint16_t UChar;
#endif
#endif
如果从源代码安装 libxml2,则该代码似乎不存在,因此我通过使用从源代码安装的 libxml2 解决了该问题。