Компиляция расширения PHP как не поточно-ориентированного
Я пытаюсь скомпилировать расширение imagemagick (imagick) для использования в среде, не поддерживающей потоки в Windows.
Я использую PHP 5.3.10 и настроил Visual C ++ express в качестве среды компиляции. Проблема в том, что я использую не-поточно-ориентированную версию PHP в качестве модуля FCGI в Apache 2.2.
Таким образом, мой PHP поставляется сphp5.lib
и неphp5ts.lib
, Я считаю, что это причина, почему я получаю эти ошибки:
<code>imagick.obj : error LNK2019: unresolved external symbol __imp__tsrm_mutex_alloc referenced in function _zm_startup_imagick </code>
Я только когда-либо собирал и компилировал вещи на Linux, так что я не слишком уверен, как это сделать в среде Windows.
Как я могу скомпилировать расширение, чтобы оно не было поточно-ориентированным?
Я загрузил потокобезопасный двоичный файл PHP 5.3.10, чтобы получить копию php5ts.lib. Затем я смог скомпилировать расширение.
Я предполагаю, что установкаZTS
директива препроцессора либо1
или же0
приведет к тому, что расширение будет скомпилировано как поточно-безопасное или не поточно-безопасное. (Не слишком уверен в этом, поэтому, если кто-то может сообщить мне, если это правильно или нет, это будет высоко ценится. :))
Затем я настроил виртуальную машину под управлением Windows 7 и установил последнюю версию WAMP. Причина в том, что он использовал многопоточную версию PHP.
Я поместил DLL в папку ext в установке PHP и включил его вphp.ini
, Однако даже после того, как я попробовал обе версии ts и nts в WAMP, я получил бы:
<code>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 </code>
Но дело в том, чтоc:/wamp/bin/php/php5.3.10/ext/imagick.dll'
существует, и да, я проверял это много раз.
Затем я понизил ImageMagick до 6.6.2-10-Q16, но все еще вижу ту же проблему.
Та же проблема возникает на моем компьютере разработчика, использующем версию PHP 5.3.10 nts на Apache 2.2 (все устанавливаются вручную).
Похоже, я могу ошибаться в отношенииZTS
препроцессор. Если я установлюZTS=0
и скомпилировать, используя обходчик зависимостей на скомпилированном dll, все еще показывает, что это требуетphp5ts.dll
который присутствует только в многопоточных версиях PHP.
Я проделал большую работу с обходчиком зависимостей и обнаружил, что мне нужно было статистически ссылаться на msvc100d.dll. Я тогда удалилZTS
в определении препроцессора и был в состоянии скомпилировать с помощьюphp5.lib
вместоphp5ts.dll
, Я думаю, что это должно заставить меня не-дц.
Однако при загрузке расширения я по-прежнему получаю:
<code>PHP Warning: PHP Startup: Invalid library (maybe not a PHP library) 'imagick.dll' in Unknown on line 0 </code>
И ошибки от ходунков зависимостей:
<code>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. </code>
Установлен Visual C ++ Express 2008 и скомпилирован с использованием инструментария платформы v90, но все еще сталкивается с теми же проблемами.
Любые советы приветствуются :)
Solution Found! See my answer.