Compilando uma extensão PHP como não-thread-safe
Eu estou tentando compilar a extensão imagemagick (imagick) para usar em um ambiente não thread-safe no windows.
Estou usando o PHP 5.3.10 e configurei o Visual C ++ express como meu ambiente de compilação. O problema é que eu estou usando uma versão não-thread-safe do PHP como um módulo FCGI no Apache 2.2.
Assim, meu PHP é fornecido com umphp5.lib
e não umphp5ts.lib
. Eu acredito que esta é a razão pela qual estou recebendo esses erros:
<code>imagick.obj : error LNK2019: unresolved external symbol __imp__tsrm_mutex_alloc referenced in function _zm_startup_imagick </code>
Eu só construí e compilei coisas no linux, então não tenho certeza de como fazer isso em um ambiente Windows.
Como posso compilar a extensão para que ela não seja thread-safe?
Eu baixei o binário thread-safe do PHP 5.3.10 para obter uma cópia do php5ts.lib. Eu fui então capaz de compilar a extensão.
Eu estou supondo que definir oZTS
diretiva de pré-processamento para1
ou0
faria com que a extensão fosse compilada como thread-safe ou não-thread-safe. (Não tenho certeza sobre isso, então se alguém puder me informar se isso está correto ou não, seria muito apreciado. :))
Em seguida, configurei uma máquina virtual executando o Windows 7 e instalei a versão mais recente do WAMP. Razão é que ele usou uma versão thread-safe do PHP.
Coloquei a dll na pasta ext na instalação do PHP e habilitei emphp.ini
. No entanto, mesmo depois de tentar a versão ts e nts no WAMP, eu recebia:
<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>
Mas a coisa é quec:/wamp/bin/php/php5.3.10/ext/imagick.dll'
existe, e sim eu verifiquei isso muitas vezes.
Eu então rebaixei o ImageMagick para 6.6.2-10-Q16, mas ainda vejo o mesmo problema.
O mesmo problema ocorre na minha máquina dev executando uma versão nts do PHP 5.3.10 no Apache 2.2 (todos instalados manualmente).
Parece que eu posso estar errado sobre oZTS
pré-processador. Se eu definirZTS=0
e compilar, usando walker dependência na dll compilada ainda mostra que requerphp5ts.dll
que está presente apenas nas versões thread-safe do PHP.
Eu fiz mais mexer com walker dependência e descobri que eu tinha que link para estatisticamente msvc100d.dll. Então eu removiZTS
na definição do pré-processador e foi capaz de compilar usandophp5.lib
ao invés dephp5ts.dll
. Eu acho que isso deve me dar um não-ts dll.
No entanto, ao carregar a extensão, ainda estou recebendo:
<code>PHP Warning: PHP Startup: Invalid library (maybe not a PHP library) 'imagick.dll' in Unknown on line 0 </code>
E erros do walker de dependência:
<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>
Instalado visual c ++ express 2008 e compilado usando o toolkit de plataforma v90, mas ainda enfrentando os mesmos problemas.
Alguma dica apreciada :)
Solução encontrada! Veja minha resposta.