2009-07-30 3 views
5

Для начала я бы предпочел использовать предварительно скомпилированный двоичный файл PHP, но мне нужно построить из источника для конкретной бизнес-потребности. (Я не тип, который компилирует приложения с открытым исходным кодом только для ударов.)Ошибки, связывающие libresolv при создании PHP 5.2.10 из исходного кода на OS X

Я строил на 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, которая входит в /usr/lib/libresolv.dylib на OS X (и был с по крайней мере 10,4). Обратите внимание, что файлы *.dylib являются эквивалентом Mac *.so файлов в Linux, и я успешно скомпилировал его в libiconv.dylib, пропустив --with-iconv=shared,/usr до ./configure, что устраняет аналогичные ошибки компоновщика для библиотеки iconv.

Когда я запустил ./configure, он обнаружил /usr/include/resolv.h и включил его в файл makefile. Тем не менее, я не могу понять, как правильно использовать общую библиотеку. Какие-нибудь советы по работе с этим? Я никогда не делал ничего подобного прохождению пользовательских флагов компоновщика до ./configure, и Google, к сожалению, не помог мне в этой проблеме.


Edit: Я строю из this TAR download, если кто-то хочет, чтобы попытаться воспроизвести ошибку на Snow Leopard.

ответ

4

Попробуйте добавить -lresolv в свой файл Makefile.

Надеюсь, это поможет. Я получил предложение от этого discussion.

+0

Это хорошее преимущество. Я просто запускал свой скрипт компиляции на машине с 10.5, и он был построен просто отлично, поэтому это определенно проблема, новая для Snow Leopard. К сожалению, мне трудно понять, где добавить '-lresolv' в Makefile. (Было бы еще лучше, если бы я мог сделать что-то вроде установки переменной среды и иметь './ configure' добавьте его для меня.) MacPorts использует собственный формат портфайлов, поэтому, к сожалению, это не очень полезно для специфики ... –

+1

Выяснил это. Я добавил **, если ['uname -r' ==" 10.0.0 "]; затем экспортируйте EXTRA_LDFLAGS = -lresolv; fi ** перед вызовом './configure' с другими параметрами, и он успешно добавил -lresolv в Makefile. Я принимаю этот ответ, так как он указал мне в правильном направлении. Благодаря! –

+0

Я должен отметить, что, приняв этот ответ, я обновил свой код, чтобы захватить основную версию ядра (в этом случае 10), используя 'uname -r | cut -d. -f 1' вместо этого. Это важно, потому что, хотя OS X 10.6.0 имеет версию ядра 10.0.0, OS X 10.6.2 имеет версию 10.2.0 и так далее. Теперь я сохраняю это значение '$ KERNEL_MAJOR' и использую' if [$ KERNEL_MAJOR -ge 10]; затем ... fi' для проверки на 10.6 и выше. –

2

Я бы рекомендовал разрешить зависимости с помощью fink/macports. Создайте все компоненты, используя macports, а затем скомпилируйте php из источника, указав lib dirs на/opt/...

Вы можете даже строить php напрямую из исходного кода с помощью macports.

+0

К сожалению, это невозможно, поскольку скомпилированные двоичные файлы должны быть в определенном настраиваемом месте (то есть не в '/ opt') и иметь минимальные зависимости. В общем, хотя хорошее предложение. –

2

Для тех, кто не может понять, куда добавить -lresolv :)

Отредактируйте Makefile, найти строку:

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

и добавить -lresolv к этой линии, как это:

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

Работал для меня на MacOS X 10.6 Snow Leopard при компиляции PHP для LiteSpeed.

+0

Да, это тоже сработает. Я добавил комментарий к принятому ответу выше, который добавит этот флаг, где это необходимо, прежде чем запускается ./configure и только на Snow Leopard. Немного легче (и более автоматизировано), чем ручная настройка. –

3

Если вы установите переменную среды конфигурации перед запуском скрипта configure, вам не нужно редактировать make-файл. Например:

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

Это решение сработало для меня.