Sto cercando di compilare l'estensione imagemagick (imagick) da utilizzare in un ambiente privo di thread su Windows.Compilazione di un'estensione PHP come non protetta da thread
Sto utilizzando PHP 5.3.10 e ho impostato Visual C++ Express come ambiente di compilazione. Il problema è che sto usando una versione non thread-safe di PHP come modulo FCGI in Apache 2.2.
Pertanto, il mio PHP è fornito con un php5.lib
e non un php5ts.lib
. Credo che questo sia il motivo per cui sto ottenendo questi errori:
imagick.obj : error LNK2019: unresolved external symbol __imp__tsrm_mutex_alloc referenced in function _zm_startup_imagick
Ho solo mai costruito e compilato le cose su Linux, quindi non sono troppo sicuro di come fare questo su un ambiente Windows.
Come posso compilare l'estensione in modo che non sia protetta da thread?
Ho scaricato il file binario di PHP 5.3.10 per ottenere una copia di php5ts.lib. Sono stato quindi in grado di compilare l'estensione.
sto indovinando che l'impostazione della direttiva ZTS
preprocessore a uno o 1
0
causerebbe l'estensione per compilare sia come threadsafe o non threadsafe. (Non sono sicuro di questo, quindi se qualcuno potrebbe farmi sapere se è corretto o no, sarebbe molto apprezzato :))
Ho quindi configurato una macchina virtuale con Windows 7 e installato l'ultima versione di WAMP. Il motivo è che ha usato una versione thread-safe di PHP.
Ho inserito la DLL nella cartella ext nell'installazione di PHP e abilitata in php.ini
. Tuttavia, anche dopo aver provato sia la versione ts e nti in WAMP, vorrei avere:
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
Ma la cosa è che c:/wamp/bin/php/php5.3.10/ext/imagick.dll'
esiste, e sì, ho controllato questo un sacco di volte.
Ho quindi eseguito il downgrade di ImageMagick a 6.6.2-10-Q16, ma continuo a vedere lo stesso problema.
Lo stesso problema si verifica sulla mia macchina di sviluppo che esegue una versione nts di PHP 5.3.10 su Apache 2.2 (tutti installati manualmente).
Sembra che potrei sbagliarmi per quanto riguarda la ZTS
preprocessore. Se imposto ZTS=0
e compile, utilizzando Dipendente Walker sul dll compilato mostra ancora che richiede che è presente solo su versioni threadsafe di PHP.
ho fatto più armeggiare con Dependency Walker e ha scoperto che ho dovuto statisticamente link per msvc100d.dll. Ho quindi rimosso ZTS
nella definizione del preprocessore ed è stato possibile compilare utilizzando php5.lib
anziché . Penso che questo dovrebbe farmi una dll non-ts.
Tuttavia, quando si carica l'estensione, ancora sto ottenendo:
PHP Warning: PHP Startup: Invalid library (maybe not a PHP library) 'imagick.dll' in Unknown on line 0
e gli errori da Dependency 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.
installati Visual C++ Express 2008 e compilati utilizzando la piattaforma toolkit v90 , ma ancora affrontando gli stessi problemi.
Eventuali suggerimenti apprezzato :)
domanda serverfault.com. – Raptor