Windows上編譯PHP的MagickWand擴充

來源:互聯網
上載者:User

標籤:windows   php   編譯   

首先這是一個漫長的過程,嘗試編譯此外掛程式的使用者一定要有耐心。大致流程可以劃分為:

  1. 編譯ImageMagick

  2. 編譯MagickWand


關於PHP的版本。Windows的PHP是用哪個版本的VC編譯的,這個一定要先弄清楚,例如我的是VC9編譯的,那麼一定要下載對應的VC來編譯。例如VC9對應VS2008,VC10對應VS2010。


下面切入正題:

  1. 首先下載PHP的原始碼,注意你下載的原始碼也要跟你Windows上的PHP可執行檔是同一個版本。例如我的是5.4.31RC1。

  2. 下載ImageMagick的原始碼,我寫這篇文章的時候最新版是ImageMagick-6.8.9

  3. 下載MagickWandforPHP的原始碼,我寫這篇文章的時候最新版是MagickWandForPHP-1.0.9-2.zip
    (註:以上原始碼建議都從官方下載,並且如果有對應的windows版本的,都下載windows版本的。如果沒有明顯標記windows版本的,那麼.zip格式的壓縮包通常就預設是windows版本的原始碼。)

  4. 首先編譯 MagickWand
    MagickWand的原始碼目錄下有一個叫做VisualMagick的目錄,這裡面存放了VS的工程檔案。雙擊,升級到你所用的VS版本的解決方案,然後開啟。
    第一次編譯,難免會遇到錯誤,如果最後編譯有5個或者5個以上的項目失敗了,那就一定要檢查,然後修改錯誤以後重新編譯。
    我第一次編譯的時候有5個項目沒有編譯成功,導致一些CORE開頭的lib檔案沒能產生。正確的情況下, 應該是每一個子工程都有一個lib檔案和對應的dll檔案產生的。其中CORE開頭的工程尤為重要。如果最後有一個IM_MOD開頭的工程沒有成功,那可能對後面的影響不大,可以忽略。

    一般來收,工程檔案沒有編譯成功,可能是互相關聯的,例如工程A的編譯,可能需要工程B的編譯出來的lib檔案作為支援。我第一次編譯的時候,失敗原因最後發現是其中一個和多語言功能有關的模組的源檔案,裡面有各國語言文字,但是這個源檔案編碼是不帶BOM的UTF8,根據微軟官方的解釋,在VS裡面使用這種UTF8的錯誤是不可預知的,用MadEdit加上了BOM,問題解決,最後只剩下一個MOD工程沒有編譯成功,可以忽略了。

  5. 然後編譯MagickWand
    首先建立一個解決方案,選擇win32的dll工程(空項目),然後匯入MagickWand下的對應的c檔案和h檔案。

    加入對應的包含檔案目錄:
    PHP源碼所在目錄
    PHP源碼所在目錄下的Zend目錄
    PHP源碼所在目錄下的main目錄
    PHP源碼所在目錄下的TSRM目錄
    ImageMagick源碼所在目錄
    ImageMagick源碼所在目錄下的magick目錄  

    加入對應的庫檔案目錄:
    PHP可執行檔所在目錄
    PHP可執行檔所在目錄下的extras目錄
    PHP可執行檔所在目錄下的dev目錄
    ImageMagick源碼所在目錄下的VisualMagick\Lib目錄

    進入工程檔案的屬性,展開 C/C++ > 前置處理器 欄目,在前置處理器定義中加入如下內容:
    ZEND_DEBUG=0
    WIN32
    NDEBUG
    _WINDOWS
    _USRDLL
    MAGICKWAND_EXPORTS
    COMPILE_DL_MAGICKWAND
    ZEND_WIN32
    PHP_WIN32
    HAVE_MAGICKWAND=1
    LIBZEND_EXPORTS

    進入 連接器 > 輸入 欄目,在附加依賴項中加入如下內容:
    odbc32.lib
    odbccp32.lib
    php5embed.lib
    CORE_RL_wand_.lib
    CORE_RL_zlib_.lib
    CORE_RL_webp_.lib
    CORE_RL_ttf_.lib
    CORE_RL_tiff_.lib
    CORE_RL_png_.lib
    CORE_RL_pixman_.lib
    CORE_RL_openjpeg_.lib
    CORE_RL_Magick++_.lib
    CORE_RL_magick_.lib
    CORE_RL_lqr_.lib
    CORE_RL_libxml_.lib
    CORE_RL_lcms_.lib
    CORE_RL_jpeg_.lib
    CORE_RL_jp2_.lib
    CORE_RL_jbig_.lib
    CORE_RL_glib_.lib
    CORE_RL_ffi_.lib
    CORE_RL_croco_.lib
    CORE_RL_cairo_.lib
    CORE_RL_bzlib_.lib.
    CORE_RL_librsvg_.lib

    此時就可以開始產生解決方案了,中間肯定會遇上錯誤,大概是C++的一個編譯器的斷點,找到對應原始碼注釋掉。(MagickWand for Windows萬年不更新代碼了,只有根據錯誤去一個個調整,如果遇上其他錯誤,解決方案也類似)

  6. 最後產生的dll檔案就是標註PHP的擴充檔案了,如何使用不再贅述。最後有幾點要說明的:

    首先是這個方法預設都是動態連結,所以最後可能需要在我們的環境變數中加入ImageMagick源碼所在目錄下的VisualMagick\Bin目錄,也就是ImageMagick編譯出來的那些Dll所在的目錄,才能正確載入這個PHP擴充,當然使用者在編譯的時候也可以選擇全靜態串連。

    其次是,下載的PHP源碼裡,很有可能有一處宏定義:#define PHP_COMPILER_ID "VC9",如果遇上了這種情況,改成你自己的編譯器版本即可,否則最後載入的時候可能會提示版本無法對接。

    最後,一定要用NTS,也就是非安全執行緒編譯,一般來說Windows的PHP一定要用非安全執行緒版本。



    




本文出自 “僅用於記錄” 部落格,請務必保留此出處http://dajyaretakuya.blog.51cto.com/2823475/1537516

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.