2009-07-30 8 views
5

Na początek chciałbym normalnie zdecydować się na stosowanie wstępnie skompilowana binarnego PHP, ale mam obowiązek budować od źródła do konkretnej potrzeby biznesu. (Nie jestem typem, który kompiluje aplikacje typu open source tylko do kopnięć.)Błędy łączące libresolv przy budowie PHP 5.2.10 ze źródła na OS X

Buduję na OS X 10.6 i napotykam następujący błąd, gdy próbuję wykonać make PHP 5.2.10 jako moduł 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 

symbole te są częścią libresolv, który jest zawarty w /usr/lib/libresolv.dylib na OS X (i jest od przynajmniej 10.4). Zauważ, że pliki *.dylib są odpowiednikami Macintosha plików *.so na Linuksie. Udało mi się już skompilować libiconv.dylib, przekazując --with-iconv=shared,/usr do ./configure, co wyeliminowało podobne błędy linkera dla biblioteki iconv.

Po uruchomieniu ./configure wykrywa /usr/include/resolv.h i włącza go w pliku Makefile. Jednak nie wydaje mi się, aby dowiedzieć się, jak poprawnie podłączyć bibliotekę współdzieloną. Wszelkie wskazówki, jak to zrobić? Nigdy nie zrobiłem nic takiego, jak przekazanie niestandardowych flag linkerów do ./configure, a Google niestety nie pomogło mi w rozwiązaniu tego problemu.


Edit: buduję od this TAR download jeśli ktoś chce spróbować powtórzyć błąd na Snow Leopard.

Odpowiedz

4

Spróbuj dodać -lresolv do pliku Makefile.

Mam nadzieję, że to pomoże. Dostałem sugestię z tego discussion.

+0

To dobra przewaga. Właśnie uruchomiłem mój skrypt kompilacyjny na maszynie z wersją 10.5 i wszystko dobrze, więc jest to zdecydowanie nowy problem w Snow Leopard. Niestety, mam problem z ustaleniem, gdzie dodać '-lresolv' w pliku Makefile. (Byłoby jeszcze lepiej, gdybym mógł zrobić coś jak ustawić zmienną środowiskową i mieć './ configure' dodaj to dla mnie.) MacPorts używa własnego formatu portfeli, więc nie jest zbyt pomocny dla szczegółów, niestety ... –

+1

Wyliczyłem to. Dodałem **, jeśli ['uname -r' ==" 10.0.0 "]; następnie wyeksportuj EXTRA_LDFLAGS = -lresolv; fi ** przed wywołaniem './configure' z innymi opcjami i pomyślnie dodała -lresolv do Makefile. Przyjmuję tę odpowiedź, ponieważ skierowała mnie we właściwym kierunku. Dzięki! –

+0

Należy zauważyć, że od czasu zaakceptowania tej odpowiedzi zaktualizowałem swój kod, aby pobrać główną wersję jądra (w tym przypadku 10) używając 'uname -r | wyciąć -d. Zamiast tego -f 1'. Jest to ważne, ponieważ chociaż OS X 10.6.0 ma wersję jądra 10.0.0, OS X 10.6.2 ma wersję 10.2.0 i tak dalej. Teraz przechowuję tę wartość na '$ KERNEL_MAJOR' i używam' if [$ KERNEL_MAJOR -ge 10]; następnie ... fi' sprawdzić 10,6 lub więcej. –

2

Polecam rozwiązywania zależności używając fink/macports. Budowanie wszystkie składniki przy użyciu MacPorts a następnie skompilować PHP ze źródła wskazując lib katalogi do/opt/...

Można nawet zbudować php bezpośrednio ze źródła przy użyciu MacPorts.

+0

Niestety, nie jest to możliwe, ponieważ skompilowane pliki binarne muszą znajdować się w ściśle określonej niestandardowej lokalizacji (tj. Nie w '/ opt') i muszą mieć minimalne zależności. Generalnie jednak dobra sugestia. –

2

Dla tych, którzy nie mogą dowiedzieć się, gdzie dodać -lresolv :)

Edycja Makefile, znajdź linię:

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

i dodać do tego -lresolv linię:

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

Pracowałem dla mnie na MacOS X 10.6 Snow Leopard podczas kompilowania PHP dla LiteSpeed.

+0

Tak, to też działa. Dodałem komentarz do powyższej odpowiedzi, która doda tę flagę w razie potrzeby przed uruchomieniem ./configure i tylko w systemie Snow Leopard. Trochę łatwiejsze (i łatwiejsze do automatyzacji) niż ręczne podkręcanie. –

3

Jeśli ustawisz zmienną środowiskową configure przed uruchomieniem skryptu configure, nie musisz edytować pliku Makefile. Na przykład:

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

To rozwiązanie sprawdziło się u mnie.