Próbuję skompilować rozszerzenie imagemagick (imagick) do użytku w środowisku bezpiecznym dla wątków w systemie Windows.Kompilowanie rozszerzenia PHP jako nie-wątku
Używam PHP 5.3.10 i skonfigurowałem Visual C++ express jako moje środowisko kompilujące. Problem polega na tym, że używam nie-wątkowej wersji PHP jako modułu FCGI w Apache 2.2.
W ten sposób mój PHP jest dostarczany z php5.lib
, a nie z php5ts.lib
. Wierzę, że to jest powód, dlaczego ja się tych błędów:
imagick.obj : error LNK2019: unresolved external symbol __imp__tsrm_mutex_alloc referenced in function _zm_startup_imagick
Mam tylko kiedykolwiek zbudowano i zebrane rzeczy na Linux, więc nie jestem zbyt pewien, jak to zrobić w środowisku Windows.
Jak mogę skompilować rozszerzenie, aby nie było bezpieczne dla wątków?
Pobrałem binarne zabezpieczenie wątków w PHP 5.3.10, aby uzyskać kopię pliku php5ts.lib. Byłem wtedy w stanie skompilować rozszerzenie.
Jestem zgadywania, że ustawienie dyrektywy preprocesora ZTS
albo 1
lub 0
spowodowałoby rozszerzenie skompilować zarówno jako THREADSAFE lub braku THREADSAFE. (Nie jestem tego pewien, więc gdyby ktoś mógł dać mi znać, czy to prawda, czy nie, byłoby to bardzo cenne.))
Następnie skonfigurowałem maszynę wirtualną z systemem Windows 7 i zainstalowałem najnowszą wersję WAMP. Powodem jest to, że używał PHP z wątkami bezpieczeństwa.
Umieściłem bibliotekę dll w folderze ext w instalacji PHP i włączyłem ją w php.ini
. Jednak nawet po próbie zarówno TS NTS wersję w WAMP, chciałbym uzyskać:
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
Ale chodzi o to, że c:/wamp/bin/php/php5.3.10/ext/imagick.dll'
istnieje, i tak mam zaznaczone to wiele razy.
Następnie zmodernizowałem ImageMagick do wersji 6.6.2-10-Q16, ale nadal widzę ten sam problem.
Ten sam problem występuje na moim komputerze dev, który pracuje z wersją PHP 5.3.10 na Apache 2.2 (wszystkie zainstalowane ręcznie).
Wygląda na to, że mogę się mylić w stosunku do preprocesora ZTS
. Jeśli ustawię ZTS=0
i skompiluję, użycie zależności w kompilowanej bibliotece dll nadal pokazuje, że wymaga ona php5ts.dll
, która jest obecna tylko w wersjach PHP obsługujących wątki.
Zrobiłem więcej majsterkowania z zależność walker i stwierdziłem, że musiałem statystycznie link do msvc100d.dll. Następnie usunąłem ZTS
w definicji preprocesora i udało mi się skompilować przy użyciu php5.lib
zamiast php5ts.dll
. Myślę, że to powinno dostać mi nie-ts dll.
Jednak podczas ładowania rozszerzenia, ja wciąż się:
PHP Warning: PHP Startup: Invalid library (maybe not a PHP library) 'imagick.dll' in Unknown on line 0
i błędów z 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.
Zainstalowane Visual C++ wyrazić 2008 i skompilowany przy użyciu platformy toolkit V90 , ale wciąż boryka się z tymi samymi problemami.
Wszelkie wskazówki mile widziane :)
pytanie serverfault.com. – Raptor