我試圖編譯imagemagick(imagick)擴展以在Windows上的非線程安全的環境中使用。將PHP擴展編譯爲非線程安全的
我使用的是PHP 5.3.10,並將Visual C++ express設置爲我的編譯環境。 問題是我在Apache 2.2中使用非線程安全版本的PHP作爲FCGI模塊。
因此,我的PHP提供了php5.lib
而不是php5ts.lib
。我認爲,這就是爲什麼我得到這些錯誤的原因:
imagick.obj : error LNK2019: unresolved external symbol __imp__tsrm_mutex_alloc referenced in function _zm_startup_imagick
我只有史以來在Linux編譯的東西,所以我也不太清楚如何做到這一點在Windows環境。
我該如何編譯擴展,以便它是非線程安全的?
我下載了PHP 5.3.10的threadsafe二進制文件來獲取php5ts.lib的副本。那時我可以編譯擴展。
我猜測,將ZTS
預處理器指令設置爲1
或0
會導致擴展程序編譯爲線程安全或非線程安全。 (不太清楚這個,所以如果有人能讓我知道這是否正確,這將是非常感激:) :)
然後我建立了一個運行Windows 7的虛擬機,並安裝了最新版本的WAMP。原因是它使用了PHP的線程安全版本。
我把dll放在PHP安裝的ext文件夾中,並在php.ini
中啓用它。然而,即使試圖在兩者的WAMP TS和NTS版本後,我會得到:
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
但問題是,c:/wamp/bin/php/php5.3.10/ext/imagick.dll'
確實存在,是的,我有這個查了很多次。
然後我將ImageMagick降級到6.6.2-10-Q16,但仍然看到相同的問題。
我的開發機器在Apache 2.2上運行PHP 5.3.10的nts版本時發生了同樣的問題(全部手動安裝)。
看起來我對ZTS
預處理器可能是錯的。如果我設置ZTS=0
並編譯,在編譯後的dll上使用dependency walker仍然表明它需要php5ts.dll
,它只存在於線程安全版本的PHP中。
我做了更多修補與依賴沃克,發現我不得不統計鏈接到msvc100d.dll。然後,我在預處理器定義中刪除了ZTS
,並且能夠使用php5.lib
而不是php5ts.dll
進行編譯。我認爲這應該讓我一個非ts的dll。
然而,加載擴展的時候,我仍然得到:
PHP Warning: PHP Startup: Invalid library (maybe not a PHP library) 'imagick.dll' in Unknown on line 0
和錯誤從依賴學步車:
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.
安裝Visual C++表示2008年和編譯使用平臺工具包V90 ,但仍面臨同樣的問題。
任何提示讚賞:)
serverfault.com問題。 – Raptor 2012-04-10 16:26:11