Kompilowanie rozszerzenia PHP jako bezpiecznego dla wątków

Próbuję skompilować rozszerzenie imagemagick (imagick) do użycia w środowisku bez wątków w systemie Windows.

Używam PHP 5.3.10 i skonfigurowałem Visual C ++ express jako środowisko kompilacji. Problem polega na tym, że używam nie-wątkowej wersji PHP jako modułu FCGI w Apache 2.2.

Tak więc mój PHP jest dostarczany zphp5.lib a nie aphp5ts.lib. Uważam, że to jest powód, dla którego otrzymuję te błędy:

<code>imagick.obj : error LNK2019: unresolved external symbol __imp__tsrm_mutex_alloc referenced in function _zm_startup_imagick
</code>

Zawsze budowałem i kompilowałem rzeczy na Linuksie, więc nie jestem pewien, jak to zrobić w środowisku Windows.

Jak mogę skompilować rozszerzenie, aby nie było bezpieczne dla wątków?

Pobrałem binarny wątek PHP 5.3.10, aby uzyskać kopię php5ts.lib. Udało mi się skompilować rozszerzenie.

Zgaduję, że ustawienieZTS dyrektywy preprocesora1 lub0 spowodowałoby, że rozszerzenie skompilowało się jako bezpieczne wątkowo lub bez wątków. (Nie jestem tego pewien, więc jeśli ktoś mógłby mi powiedzieć, czy to jest poprawne, czy nie, byłoby to bardzo mile widziane.))

Następnie ustawiłem maszynę wirtualną z systemem Windows 7 i zainstalowałem najnowszą wersję WAMP. Powodem jest to, że używał wersji PHP z wątkami.

Umieściłem dll w folderze ext w instalacji PHP i włączyłem gophp.ini. Jednak nawet po wypróbowaniu obu wersji ts i nts w WAMP dostałbym:

<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>

Ale chodzi o toc:/wamp/bin/php/php5.3.10/ext/imagick.dll' istnieje i tak sprawdziłem to wiele razy.

Następnie obniżyłem ImageMagick do 6.6.2-10-Q16, ale nadal widzę ten sam problem.

Ten sam problem występuje na moim komputerze dev z uruchomioną wersją PHP 5.3.10 nts na Apache 2.2 (wszystkie zainstalowane ręcznie).

Wygląda na to, że mogę się mylić co doZTS preprocesor. Jeśli ustawięZTS=0 i skompiluj, używając chodzika zależności na skompilowanej dll, nadal pokazuje, że wymagaphp5ts.dll który jest obecny tylko w wersjach PHP z wątkami.

Zrobiłem więcej majsterkowicza przy pomocy walkera zależności i odkryłem, że muszę statystycznie połączyć się z msvc100d.dll. Potem usunąłemZTS w definicji preprocesora i był w stanie skompilować za pomocąphp5.lib zamiastphp5ts.dll. Myślę, że to powinno dać mi bibliotekę non-ts.

Jednak podczas ładowania rozszerzenia nadal otrzymuję:

<code>PHP Warning:  PHP Startup: Invalid library (maybe not a PHP library) 'imagick.dll' in Unknown on line 0
</code>

A błędy z walkera zależności:

<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>

Zainstalowany Visual C ++ Express 2008 i skompilowany przy użyciu platformy narzędziowej v90, ale wciąż ma te same problemy.

Wszelkie wskazówki mile widziane :)

Rozwiązanie znalezione! Zobacz moją odpowiedź.

questionAnswers(2)

yourAnswerToTheQuestion