Я пытаюсь скомпилировать расширение imagemagick (imagick) для использования в среде, отличной от потоковой среды, в окнах.
Я использую 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
Я только когда-либо создавал и компилировал вещи в Linux, поэтому не слишком уверен, как это сделать в среде Windows.
Как я могу скомпилировать расширение так, чтобы он не был потокобезопасным?
Я загрузил файловую бинарность PHP 5.3.10, чтобы получить копию php5ts.lib. Затем я смог скомпилировать расширение.
Я предполагаю, что установка директивы препроцессора ZTS
на 1
или 0
приведет к тому, что расширение будет компилироваться как потокобезопасное или не потокобезопасное. (Не слишком уверен в этом, поэтому, если кто-то может сообщить мне, если это правильно или нет, это было бы очень признательно. :))
Затем я настроил виртуальную машину под управлением 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
и скомпилировал, использование зависимого ходок на скомпилированной dll все еще показывает, что для него требуется php5ts.dll
который присутствует только в потокобезопасных версиях PHP.
Я больше потрудился с зависимым ходоком и обнаружил, что мне приходится статистически ссылаться на 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
И ошибки от хождения зависимостей:
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.
Установлен визуальный c ++ express 2008 и скомпилирован с использованием инструментария платформы v90, но все еще стоит перед теми же проблемами.
Любые советы оценили 🙂
Понял! Надеюсь, что это поможет в компиляции php-расширений в Windows в будущем. То, что я сделал, основано на: https://wiki.php.net/internals/windows/stepbystepbuild
Примечание. Я прочитал ответ на этом сайте, в котором говорится, что компиляция PHP-расширений сама по себе в окнах не поддерживается. Основываясь на моих экспериментах вчера, это, похоже, тоже много работает, поэтому я использую процесс сборки PHP.
Лучший способ – использовать процесс сборки PHP.
Установите Visual C ++ Express 2008 (любая версия будет работать, но экспресс является бесплатной) и 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
run 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
Я просматриваю здесь изображение.
Установите любые зависимости. В моем случае мне нужно установить ImageMagick, поэтому я загрузил последние рекомендуемые двоичные файлы Windows . Вам потребуется перезапустить после установки, чтобы обновить переменную PATH
, но вы можете сделать это после того, как вы скомпилировали. Убедитесь, что вы устанавливаете заголовки C / C ++ и включаете также.
Скопируйте содержимое каталога include из каталога установки ImageMagick в C:\php-sdk\php53dev\vc9\x86\deps\include
.
Скопируйте содержимое каталога lib
из каталога установки ImageMagick в папку C:\php-sdk\php53dev\vc9\x86\deps\lib
Теперь давайте построим: запустите 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
двоичное использование --disable-zts
, в противном случае удалите этот флаг конфигурации. Я не уверен, почему, но иногда расширения используют флаг --with-myextension
а иногда --enable-myextension
, поэтому --enable-myextension
флажок configure --help
для использования флага. Если вы добавите =shared
после флага расширения, он будет скомпилирован как отдельная DLL, что мы хотим.
Скомпилируйте: запустите 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-файле, аналогичном pecl-5.3.10-nts-Win32-VC9-x86.zip
. Откройте этот файл и извлеките extensio DLL в свою папку ext
в вашей установке PHP.
Включите расширение PHP и перезапустите веб-сервер. Запустите phpinfo()
и убедитесь, что расширение включено.
Если расширение не работает должным образом, убедитесь, что вы перезагрузились, чтобы обновить переменную PATH
. В моем случае мне нужно установить каталог установки imagemagick в свою PATH
.
???
Прибыль!
Есть ли причина, по которой вам нужно скомпилировать? Почему бы не скачать? В Windows это обычно намного проще / быстрее.
VC6: http://www.sk89q.com/2010/03/vc6-windows-binaries-for-imagick-2-3-0/