2012-04-10 92 views
6

我試圖編譯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預處理器指令設置爲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 

和錯誤從依賴學步車:

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 ,但仍面臨同樣的問題。

任何提示讚賞:)


發現的解決方案!看到我的答案。

+0

serverfault.com問題。 – Raptor 2012-04-10 16:26:11

回答

5

明白了!我希望這可以幫助那些未來在windows上編譯php擴展。我所做的是基於:https://wiki.php.net/internals/windows/stepbystepbuild

注意:我在這個網站上讀到一個答案,說在windows上自己編譯PHP擴展不受支持。根據我昨天的實驗,它似乎也有很多工作,所以我正在使用PHP構建過程。

最好的方法是使用PHP構建過程。

  1. 安裝Visual C++ Express 2008的(任何版本會做,但表達的是免費的)和Windows SDK 6.1(注意,我們希望6.1版沒有什麼舊或新)。

  2. 安裝SVN client tools如果您還沒有這樣做,並重新啓動您的PATH變量才能生效。

  3. 獲取PHP SDK binary tools並將其解壓至C:\php-sdk

  4. 在您的開始菜單中啓動CMD ShellMicrosoft Windows SDK v6.1下並運行cd C:\php-sdk

  5. 運行setenv /x86 /xp /release這創建了一個32位版本。您可以使用/x64構建64位版本(我還沒有嘗試過)。

  6. 運行bin\phpsdk_setvars.bat

  7. 運行bin\phpsdk_buildtree.bat php53dev

  8. 下載PHP source code並解壓到C:\php-sdk\php53dev\vc9\x86讓你最終C:\php-sdk\php53dev\vc9\x86\php5.3-xyz

  9. 下載最新deps並提取一切C:\php-sdk\php53dev\vc9\x86。系統可能會提示您覆蓋任何現有的文件夾,請按是。

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

  11. 退房分機從svn庫的最新版本:svn co http://svn.php.net/repository/pecl/imagick/trunk pecl/imagick我在這裏檢查出imagick。

  12. 安裝任何依賴項。在我的情況下,我需要安裝ImageMagick,所以我下載了最新推薦的windows binary。安裝後需要重新啓動才能更新PATH變量,但編譯後可以這樣做。確保你安裝了C/C++頭文件,並且也包含在內。

  13. includes目錄的內容從ImageMagick安裝目錄複製到C:\php-sdk\php53dev\vc9\x86\deps\include

  14. 複製lib目錄的來自ImageMagick的內容安裝目錄C:\php-sdk\php53dev\vc9\x86\deps\lib

  15. 現在,讓我們來構建:運行cd C:\php-sdk\php53dev\vc9\x86\php5.3-xyz然後buildconf然後configure --help。正確地查看幫助。它會顯示所有配置標誌和任何可用的擴展來啓用。在我的情況,因爲我加入imagick,我只好叫--with-imagick

  16. 運行配置選項:configure --enable-cli --with-imagick=shared --disable-zts如果你想建立一個非線程安全的二進制使用--disable-zts,否則刪除配置標誌。我不知道爲什麼,但有時擴展名使用--with-myextension標誌,有時使用--enable-myextension,因此請檢查configure --help以使用標誌。如果在擴展標誌之後添加=shared,它將被編譯爲單獨的DLL,這就是我們想要的。

  17. 編譯:運行nmake然後nmake snap

  18. 完成:)檢查C:\php-sdk\php53dev\vc9\x86\php-5.3.10\Release(非線程安全)或C:\php-sdk\php53dev\vc9\x86\php-5.3.10\Release_TS(線程安全)。你編譯的二進制文件應該在那裏。編譯的擴展名(pecl)應該在類似於pecl-5.3.10-nts-Win32-VC9-x86.zip的ZIP文件中。打開此文件並將PHP擴展DLL提取到您的PHP安裝中的ext文件夾中。

  19. 啓用PHP擴展並重新啓動您的網絡服務器。運行phpinfo()並檢查是否啓用了擴展。

  20. 如果分機無法正常工作,請確保您重新啓動以更新您的PATH變量。在我的情況下,我需要在我的PATH變量中有imagemagick安裝目錄。

  21. ???

  22. 利潤!

+0

我想感謝您花時間寫下這段美麗的指示。真的有幫助! – 2017-07-10 04:05:40

0

是否有你需要編譯的原因?爲什麼不下載?它通常在Windows上更簡單/更快。

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

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

+0

我嘗試從Valokuva.org構建,但他們沒有在我手動安裝的服務器或WAMP上工作。 sk89q.com的二進制文件也不起作用。這就是爲什麼我想針對最新版本的imagemagick編譯3.1.0b1。 – F21 2012-04-10 22:54:32

+0

我的意思是3.1.0rc1而不是3.1.0b1。 – F21 2012-04-10 23:10:06