Под Solaris как всегда всё приходится собирать вручную. И так, берём Solaris Studio и собираем.
Что бы получить модуль imagick.so для php, нужно сначала собрать сам ImageMagick, а потом на основе его собрать модуль imagick.so.
Тестовый стенд: Solaris 11, SolarisStudio 12.3
1) Сборка ImageMagick.
Качаем свежую версию исходников с сайта http://www.imagemagick.org/script/download.php , распаковываем и собираем такой командой:
#CC="/opt/solarisstudio12.3/bin/cc" CXX="CC" CFLAGS=-m64 CPPFLAGS=-m64 CCASFLAGS=-m64 LDFLAGS="-m64 -lsocket -lnsl -lrt -lresolv" ./configure --prefix=/opt/imagemagick && gmake
Если не указать либы -lsocket -lnsl -lrt -lresolv, то сборка прервётся с руганью
Undefined first referenced
symbol in file
symbol belongs to implicit dependency /lib/64/libsocket.so
Это специфика сборки под Solaris. Замечу, что при сборке через gcc этого не требуется – сборка проходит нормально и без этих библиотек. После сборки, в папке /opt/imagemagick/lib получаем либы libMagickWand-6.Q16.so.1.0.0, libMagickCore-6.Q16.so.1.0.0, которые положим в /usr/local/lib, что бы не мешались с основными либами и создадим симлинки:
#ln -s libMagickWand-6.Q16.so.1.0.0 libMagickWand-6.Q16.so
#ln -s libMagickWand-6.Q16.so.1.0.0 libMagickWand-6.so
#ln -s libMagickWand-6.Q16.so.1.0.0 libMagickWand.so.6
#ln -s libMagickWand-6.Q16.so.1.0.0 libMagickWand.so
#ln -s libMagickCore-6.Q16.so.1.0.0 libMagickCore-6.Q16.so
#ln -s libMagickCore-6.Q16.so.1.0.0 libMagickCore-6.so
#ln -s libMagickCore-6.Q16.so.1.0.0 libMagickCore.so
#ln -s libMagickCore-6.Q16.so.1.0.0 libMagickCore.so.6
Теперь добавим новую папку в список поиска библиотек:
#crle -64 -c /var/ld/64/ld.config -u -l /usr/local/lib
2) Сборка imagick.so
Качаем свежую версию с сайта http://pecl.php.net/package/imagick. Замечу, что успешно у меня собрались только версии 3.1.Х. Версии же ниже не собирались и валились с ошибками
"/export/home/skeletor/imagick-2.3.0/imagick_class.c", line 9483: undefined struct/union member: safe_mode
"/export/home/skeletor/imagick-2.3.0/imagick_class.c", line 9483: undefined symbol: CHECKUID_CHECK_FILE_AND_DIR
"/export/home/skeletor/imagick-2.3.0/imagick_class.c", line 9483: undefined symbol: CHECKUID_NO_ERRORS
cc: acomp failed for /export/home/skeletor/imagick-2.3.0/imagick_class.c
Если ошибки CHECKUID_CHECK_FILE_AND_DIR и CHECKUID_NO_ERRORS можно исправить (указав их значения в одном из хидеров), то safe_mode – никак. Есть даже баг https://bugs.php.net/bug.php?id=61501
И так, переходим к сборке версии 3.1.0.RC2. Я её собирал с такими параметрами:
PKG_CONFIG_PATH=/opt/imagemagick/lib/pkgconfig/ CC="/opt/solarisstudio12.3/bin/cc" CXX="CC" CFLAGS=-m64 CPPFLAGS=-m64 CCASFLAGS=-m64 LDFLAGS="-m64 -lMagickCore -lMagickWand" ./configure LDFLAGS="-m64 -lMagickCore -lMagickWand" --with-php-config=/usr/php54/bin/php-config --with-imagick=/opt/imagemagick
При этом, если запустить сразу сборку – то получим собранный, но не работоспособный модуль, который при подключении к php будет валить сам php с сообщением:
ld.so.1: php-fpm: fatal: relocation error: file /usr/php54/lib/php/extensions/no-debug-non-zts-20100525/imagick.so: symbol MagickWandGenesis: referenced symbol not found
Каким-то образом, Makefile не добавлять в сборку поддержку либ -lMagickCore -lMagickWand, поэтому добавим их вручную в Makefile, в строку LDFLAGS и только после этого начнём сборку:
#gmake
После сборки получаем готовый модуль, который можно подключать.
Примечание.
При переносе на другую систему – обязательно нужно так же наличии либ libMagickWand и libMagickCore.
3 коментарі “Сборка модуля imagick.so для php”
Спасибо за подсказку про либы -lMagickCore -lMagickWand
Собралось на линуксе.
А как собрать на виндовс?
а разве нет готовых пакетов под винду?