Компиляция расширения PHP как не потокобезопасного
я пытаюсь скомпилировать расширение imagemagick (imagick) для использования в не потокобезопасной среде в windows.
я использую PHP 5.3.10 и настроил Visual C++ express в качестве среды компиляции. Проблема в том, что я использую не потокобезопасную версию PHP в качестве модуля FCGI в Apache 2.2.
таким образом, мой PHP поставляется с php5.lib
, а не php5ts.lib
. Я считаю, что это причина, по которой я получаю эти ошибки:
imagick.obj : error LNK2019: unresolved external symbol __imp__tsrm_mutex_alloc referenced in function _zm_startup_imagick
I только когда-либо построенные и скомпилированные вещи на linux, поэтому я не слишком уверен, как это сделать в среде windows.
как я могу скомпилировать расширение, чтобы оно не было потокобезопасным?
я загрузил threadsafe двоичный файл PHP 5.3.10, чтобы получить копию php5ts.движение за освобождение. Затем я смог скомпилировать расширение.
я предполагаю, что установка ZTS
директива препроцессора, либо 1
или 0
приведет к компиляции расширения как либо threadsafe, либо non-thread-safe. (Не слишком уверен в этом, поэтому, если кто-то может дать мне знать, правильно это или нет, это было бы очень ценно. :))
затем я настроил виртуальную машину под управлением Windows 7 и установил последнюю версию WAMP. Причина в том, что он использовал потокобезопасную версию PHP.
я поместил dll в папку ext в установке PHP и включил его в php.ini
. Однако, даже после попытки версии ts и nts в WAMP, я получит:
PHP Warning: PHP Startup: Unable to load dynamic library 'c:/wamp/bin/php/php5.3.10/ext/imagick.dll' - The specified module could not be found.
in Unknown on line 0
но дело в том, что c:/wamp/bin/php/php5.3.10/ext/imagick.dll'
существует, и да я проверял это много раз.
затем я понизил ImageMagick до 6.6.2-10-Q16, но по-прежнему вижу ту же проблему.
та же проблема возникает на моей машине dev под управлением nts версии PHP 5.3.10 на Apache 2.2 (все установлены вручную).
похоже, я могу ошибаться в отношении ZTS
препроцессора. Если я установлю ZTS=0
и скомпилировать, используя зависимость walker от скомпилированной dll по-прежнему показывает, что она требует php5ts.dll
который присутствует только в threadsafe версиях PHP.
я больше возился с зависимостью walker и обнаружил, что мне нужно статистически связать с msvc100d.dll - ... Затем я удалил ZTS
в определении препроцессора и смог скомпилировать с помощью php5.lib
вместо php5ts.dll
. Я думаю, что это должно получить мне dll non-ts.
однако при загрузке расширения я все еще получаю:
PHP Warning: PHP Startup: Invalid library (maybe not a PHP library) 'imagick.dll' in Unknown on line 0
и ошибки из зависимостей walker:
Error: At least one module has an unresolved import due to a missing export function in an implicitly dependent module.
Error: Modules with different CPU types were found.
Warning: At least one delay-load dependency module was not found.
Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module.
установлен visual c++ express 2008 и скомпилирован с помощью platform toolkit v90, но по-прежнему сталкивается с теми же проблемами.
любые советы оценил :)
Решение Найдено! Смотрите мой ответ.
2 ответов
понял! Я надеюсь, что это может помочь тем, кто компилирует расширения php в windows в будущем. То, что я сделал, основано на:https://wiki.php.net/internals/windows/stepbystepbuild
Примечание: я прочитал ответ на этом сайте, который сказал, что компиляция расширений PHP сама по себе в windows не поддерживается. Основываясь на моих экспериментах вчера, кажется, что это тоже много работы, поэтому я использую процесс сборки PHP.
лучший способ-использовать сборку PHP процесс.
установите Visual C++ Express 2008 (любая версия будет делать, но express бесплатно) и Windows SDK 6.1 (обратите внимание, что мы хотим, чтобы версия 6.1 не была старше или новее).
установить SVN клиентские инструменты если вы этого не сделали и перезагрузите для своего
PATH
переменная вступит в силу.скачать PHP SDK бинарные инструменты и извлеките его к
C:\php-sdk
.начать
CMD Shell
подMicrosoft Windows SDK v6.1
в меню Пуск и запуститьcd C:\php-sdk
.выполнить
setenv /x86 /xp /release
это создает 32-разрядный выпуск. Вы можете использовать/x64
для создания 64-разрядной версии (я не пробовал это).выполнить
bin\phpsdk_setvars.bat
выполнить
bin\phpsdk_buildtree.bat php53dev
скачать исходный код PHP и извлечь его в
C:\php-sdk\php53dev\vc9\x86
так что вы в конечном итоге сC:\php-sdk\php53dev\vc9\x86\php5.3-xyz
скачать последнюю дэпс и извлечь все
C:\php-sdk\php53dev\vc9\x86
. Может потребоваться перезаписать все существующие папки, поэтому нажмите кнопку Да.выполнить
cd C:\php-sdk\php53dev\vc9\x86
Проверьте последнюю версию вашего расширения из репозитория svn:
svn co http://svn.php.net/repository/pecl/imagick/trunk pecl/imagick
Я проверяю imagick здесь.установите все зависимости. В моем случае, мне нужно установить ImageMagick, поэтому я загрузил последние рекомендуемые двоичный файл windows. Вам нужно будет перезапустить после установки, чтобы обновить свой
PATH
переменная, но вы можете сделать это после компиляции. Убедитесь,что вы установили заголовки C/C++ и includes.скопируйте содержимое
includes
каталог из каталога установки ImageMagick вC:\php-sdk\php53dev\vc9\x86\deps\include
.скопируйте содержимое от ImageMagick установить каталог в
C:\php-sdk\php53dev\vc9\x86\deps\lib
теперь давайте построим: run
cd C:\php-sdk\php53dev\vc9\x86\php5.3-xyz
затемbuildconf
затемconfigure --help
. Посмотрите на помощь должным образом. Он покажет вам все флаги конфигурации и любые доступные расширения для включения. В моем случае, поскольку я добавил imagick, у меня была опция--with-imagick
запустите config:
configure --enable-cli --with-imagick=shared --disable-zts
если вы хотите создать не потокобезопасное двоичное использование--disable-zts
, в противном случае снимите этот флаг конфигурации. Не знаю почему, но иногда расширения используют--with-myextension
флаг и иногда--enable-myextension
, так что проверьтеconfigure --help
для использования флага. Если добавить=shared
после флага расширения он будет скомпилирован как отдельная DLL, которая si то, что мы хотим.Compile: run
nmake
затемnmake snap
.Готово :) Проверить
C:\php-sdk\php53dev\vc9\x86\php-5.3.10\Release
(не-потокобезопасный) илиC:\php-sdk\php53dev\vc9\x86\php-5.3.10\Release_TS
(потокобезопасным). Ваши скомпилированные двоичные файлы должны быть там. Скомпилированные расширения (pecl) должны быть в ZIP-файле similiar кpecl-5.3.10-nts-Win32-VC9-x86.zip
. Откройте этот файл и извлеките DLL extensio на свойext
папка в вашей установке PHP.включите расширение PHP и перезапустите веб-сервер. Запустить
phpinfo()
и убедитесь, что расширение включено.если расширение не работает должным образом, убедитесь, что вы перезагрузите компьютер, чтобы обновить свой
PATH
переменной. В моем случае мне нужно иметь каталог установки imagemagick в моемPATH
переменная.???
профит!
есть ли причина, по которой вам нужно скомпилировать? Почему не скачать? Обычно это намного проще/быстрее в Windows.
VC6:http://www.sk89q.com/2010/03/vc6-windows-binaries-for-imagick-2-3-0/