將PHP擴展編譯為非線程安全的


Answers

是否有你需要編譯的原因? 為什麼不下載? 在Windows上通常要簡單得多。

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

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

Question

我正在嘗試編譯imagemagick(imagick)擴展以在Windows上的非線程安全的環境中使用。

我正在使用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預處理器指令為10將導致擴展編譯為線程安全或非線程安全。 (不太清楚這個,所以如果有人能讓我知道這是否正確,將不勝感激:))

然後,我建立了一個運行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

來自依賴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.

安裝了Visual C ++ Express 2008,並使用平台工具包v90進行編譯,但仍面臨同樣的問題。

任何提示讚賞:)

找到解決方案 看到我的答案。




Links