在 Snow Leopard 10.6 上编译带有 intl 扩展的 php 5.3.3

在 Snow Leopard 10.6 上编译带有 intl 扩展的 php 5.3.3

我正在尝试在我的 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.ta​​r.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 解决了该问题。

相关内容