PHP: Проблема компіляції “iconv” – “Undefined symbols: _libiconv”

Mac OS Snow Leopard & PHP

Mac OS Snow Leopard & PHP

Не дивлячись на те, що Mac OS X 10.6 (Snow Leopard) був випущений уже більше місяця тому, а мені “пощупати” його так і не вдавалось досі (із-за відсутності вільного часу). Тому, я недавно оновив свого Leopard-а 🙂 В цьому процесі жодних проблем не було виявлено, за винятком USB Overdrive, який просто “убивав” систему своїм старим “kext”-ом, після першого перезавантаження. Але у новій версії 3.x це все було поправлено.

Найбільше веб-девелоперів, мабуть, порадував новий PHP 5.3 , який тепер комплектується у парі із останнім Apache в режимі 64bit. Але для тих людей, кому стандартної комплектації модулів не вистачає – вдаються до ручного збору PHP під свої потреби. Але у мене була інша особливість – мені потрібно зробити “downgrade” до останньої версії  5.2.x, так як PHP 5.3 поки знаходиться в такому стані, в якому його нормально використовувати не можна. Та і є багато нюансів із “deprecated” особливостями, після яких необхідно буде переглянути старі проекти чи їх окремі бібліотеки на сумісність з новим PHP…

На перший погляд, нічого складного не мало б бути. Але перше випробування перезібрати PHP не дало позитивних результатів. Все “розвалювалось” із-за модуля “iconv“. Спершу я пробував сам руками “ковиряти”, але потім “погугливши, виявилось, що це все набагато серйозніше, і з цим пов’язаний баг між Apple & PHP. На стороні PHP відкрито кілька багів ( 4819549267 ), а Apple, просто обійшлась “патчем”. Саме важливо те, що люди які використовували “патч” чи пропозиції – робили різні відгуки відносно того, кому це “допомогло”. У мене геть інша ситуація була, так як у мене ця проблема виникала саме із PHP 5.2.11. Спершу проблема була у тому, що для нової ОС я робив відновлення всіх даних із Time Capsule, а як виявилось, у /usr/local/ у мене “підтягнувся” старий “iconv”. Звісно, при компіляції PHP компілятор геть інша помилку видавав. Тобто, говорячи про те, що бібліотека застаріла. Звісно, я обновив “iconv”:

І ось звідси і почались більш серйозніші проблеми:

Undefined symbols:
“_libiconv_open”, referenced from:
_do_convert in gdkanji.o
_php_iconv_string in iconv.o
__php_iconv_strlen in iconv.o
__php_iconv_substr in iconv.o
__php_iconv_substr in iconv.o
__php_iconv_strpos in iconv.o
__php_iconv_mime_encode in iconv.o
__php_iconv_mime_encode in iconv.o
__php_iconv_mime_decode in iconv.o
__php_iconv_mime_decode in iconv.o
_php_iconv_stream_filter_ctor in iconv.o
_convert in encodings.o
“_res_9_dn_expand”, referenced from:
_zif_dns_get_mx in dns.o
“_res_9_search”, referenced from:
_zif_dns_check_record in dns.o
_zif_dns_get_mx in dns.o
“_libiconv”, referenced from:
_do_convert in gdkanji.o
__php_iconv_appendl in iconv.o
__php_iconv_appendl in iconv.o
_php_iconv_string in iconv.o
_php_iconv_string in iconv.o
__php_iconv_strlen in iconv.o
__php_iconv_substr in iconv.o
__php_iconv_strpos in iconv.o
__php_iconv_mime_encode in iconv.o
__php_iconv_mime_encode in iconv.o
__php_iconv_mime_encode in iconv.o
__php_iconv_mime_encode in iconv.o
__php_iconv_mime_encode in iconv.o
__php_iconv_mime_encode in iconv.o
_php_iconv_stream_filter_append_bucket in iconv.o
_php_iconv_stream_filter_append_bucket in iconv.o
_php_iconv_stream_filter_append_bucket in iconv.o
_convert in encodings.o
“_libiconv_close”, referenced from:
_do_convert in gdkanji.o

“Погугливши”,  і з різних варіантів, які начебто допомагали іншим користувачам, я для себе знайшов рішення:

  1. Для ти, хто ставить Apache/PHP у 64bit режимі – повідомляємо компілятору про свої бажання 🙂
  2. Дальше якраз і є часткове рішення нашої проблеми. Вказуємо компілятору опції для iconv бібліотеки:

    Після старту конфігуратора ми маємо побачити текст, що свідчить про те, що iconv бібліотека знайдена:

    checking for iconv support… yes
    checking for libiconv in -liconv… yes
    checking if iconv is glibc’s… no
    checking if using GNU libiconv… 269yes
    checking if iconv supports errno… yes

    P.S: Для тесту я лише вказав “–with-iconv” опцію. Але Ви можете задавати більш детальний опис конфігураційних параметрів (GD біліотека, БД і тд.).

  3. Останній крок: необхідно поправити Makefile, що був згенерований конфігуратором (./configure ). Відкриваємо редактором файл /php-x.x.x/Makefile і шукаємо наступний текст: “libs/libphp$” (без лапків). У мене для PHP 5.2.11 – це 140-141 лінійки. Заміняємо його на:

  4. Компілюємо PHP, і якщо все відбулось без помилок – встановлюємо його.

  5. Перезапускаємо ВЕБ-сервер.

Ось і все 🙂 Тепер можемо любуватися модулем “iconv” у