2012-04-10 14 views
6

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 10 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 :)


soluzione trovata! Vedi la mia risposta.

+0

domanda serverfault.com. – Raptor

risposta

5

Got it! Spero che questo possa aiutare chi compila le estensioni php su Windows in futuro. Quello che ho fatto si basa su: https://wiki.php.net/internals/windows/stepbystepbuild

Nota: ho letto una risposta su questo sito che dice che compilare estensioni PHP da solo su Windows non è supportato. Sulla base dei miei esperimenti di ieri, sembra che ci sia anche molto lavoro, quindi sto usando il processo di compilazione di PHP.

Il modo migliore è utilizzare il processo di compilazione di PHP.

  1. installare Visual C++ Express 2008 (qualsiasi versione farà, ma Express è gratuito) e Windows SDK 6.1 (notare che vogliamo che la versione 6.1 non è nulla di più vecchia o più recente).

  2. Installare lo SVN client tools se non lo si è fatto e riavviare per rendere effettiva la variabile PATH.

  3. Prendi il PHP SDK binary tools ed estrailo a C:\php-sdk.

  4. Avviare CMD Shell in Microsoft Windows SDK v6.1 nel menu di avvio ed eseguire cd C:\php-sdk.

  5. Run setenv /x86 /xp /release crea una versione a 32 bit. È possibile utilizzare /x64 per creare una versione a 64 bit (non l'ho provato).

  6. corsa bin\phpsdk_setvars.bat

  7. corsa bin\phpsdk_buildtree.bat php53dev

  8. Scarica il PHP source code ed estrarlo in C:\php-sdk\php53dev\vc9\x86 in modo che si finisce con C:\php-sdk\php53dev\vc9\x86\php5.3-xyz

  9. Scarica l'ultima deps ed estrarre tutto per C:\php-sdk\php53dev\vc9\x86. Potrebbe essere richiesto di sovrascrivere qualsiasi cartella esistente, quindi premere Sì.

  10. corsa cd C:\php-sdk\php53dev\vc9\x86

  11. Partenza l'ultima versione del proprio interno dal repository svn: svn co http://svn.php.net/repository/pecl/imagick/trunk pecl/imagick Sto controllando imagick qui.

  12. Installare qualsiasi dipendenza. Nel mio caso, ho bisogno di installare ImageMagick, quindi ho scaricato l'ultimo raccomandato windows binary. Sarà necessario riavviare dopo l'installazione per aggiornare la variabile PATH, ma è possibile farlo dopo averlo compilato. Assicurati di installare le intestazioni C/C++ e includi anche.

  13. Copiare il contenuto della directory includes dalla directory di installazione di ImageMagick su C:\php-sdk\php53dev\vc9\x86\deps\include.

  14. Copiare il contenuto della directory lib dal ImageMagick directory di installazione di C:\php-sdk\php53dev\vc9\x86\deps\lib

  15. Ora, costruiamo: correre cd C:\php-sdk\php53dev\vc9\x86\php5.3-xyz quindi buildconf poi configure --help. Guarda l'aiuto correttamente. Ti mostrerà tutti i flag di configurazione e tutte le estensioni disponibili per abilitate. Nel mio caso, dal momento che ho aggiunto imagick, ho avuto un'opzione chiamata --with-imagick

  16. Esegui config: configure --enable-cli --with-imagick=shared --disable-zts Se si vuole costruire un non-thread-safe uso binario --disable-zts, altrimenti rimuovere quella bandiera configurazione. Non sono sicuro del motivo, ma a volte le estensioni utilizzano il flag --with-myextension e talvolta lo --enable-myextension, quindi controlla configure --help per il flag da utilizzare. Se aggiungi =shared dopo il flag di estensione, verrà compilato come una DLL separata, che si quello che vogliamo.

  17. Compilare: eseguire nmake quindi nmake snap.

  18. Fine :) Controllare C:\php-sdk\php53dev\vc9\x86\php-5.3.10\Release (non protetto da thread) o C:\php-sdk\php53dev\vc9\x86\php-5.3.10\Release_TS (thread-safe). I tuoi binari compilati dovrebbero essere lì. Le estensioni compilate (pecl), dovrebbero essere in un file ZIP simile a pecl-5.3.10-nts-Win32-VC9-x86.zip. Apri questo file ed estrai la DLL extensio nella tua cartella ext nell'installazione di PHP.

  19. Abilita l'estensione PHP e riavvia il server web. Esegui phpinfo() e verifica che l'estensione sia abilitata.

  20. Se l'estensione non funziona correttamente, assicurarsi di riavviare per aggiornare la variabile PATH. Nel mio caso, ho bisogno di avere la directory di installazione imagemagick nella mia variabile PATH.

  21. ???

  22. Utile!

+0

Voglio ringraziarti per aver dedicato del tempo a scrivere questo bellissimo pezzo di istruzioni. Davvero utile! –

0

C'è un motivo per cui è necessario compilare? Perché non scaricare? Di solito è molto più semplice/veloce su Windows.

VC6: http://www.sk89q.com/2010/03/vc6-windows-binaries-for-imagick-2-3-0/

VC9: http://valokuva.org/builds/

+0

Ho provato i build da Valokuva.org, ma non hanno funzionato sul mio server o WAMP installato manualmente. Anche i binari di sk89q.com non funzionavano. Ecco perché voglio compilare 3.1.0b1 contro l'ultima versione di imagemagick. – F21

+0

Intendevo 3.1.0rc1 non 3.1.0b1. – F21

Problemi correlati