Windows下编译 ImageMagick 的php API

转自:http://blog.csdn.net/golden_chan/article/details/5712266

首先,需要的软件包有:
PHP5.2.5 源码包[http://www.php.net/downloads.php]
bindlib_w32 [http://www.php.net/extra/bindlib_w32.zip]
win32build [http://www.php.net/extra/win32build.zip]
PHP5.2.5 Win32 二进制包 [http://www.php.net/downloads.php]
ImageMagick 6.3.8-0 Windows版源码 [http://www.imagemagick.org/download/windows/]
Imagick 2.1.0RC3 源码包 [http://pecl.php.net/package/imagick]
MagickWandForPHP 1.0.6 源码包 [http://www.imagemagick.org/download/php/]

说明一下:
php源码包就不用说了,编译需要php的源码的。
bindlib_w32 是为了编译一个resolv.lib
win32build是php编译最基本的一些lib文件和include文件。
php的二进制包是因为需要/dev/php5ts.lib文件,当然,你可以选择自己编译生成,但你的工作量将因此增加很多倍。
ImageMagick的windows源码是用来编译windows下的lib文件,同时,编译MagickWand和Imagick都还需要部分源码。
Imagick是PHP官方提供的一个ImageMagick的扩展,而MagickWandForPHP 则是ImageMagick官方提供的。

此外,还需要一些环境:

Microsoft Visual Studio 6, Cygwin


ok,现在开始。



       建立一个目录 E:/develop,然后分别建立两个子目录,ImageMagick,PHPBuild。将ImageMagick源码直接解压到ImageMagick目录下;将php5.2.5的源码解压到PHPBuild目录,同时,将bindlib_w32解压到PHPBuild/bindlib_w32下,win32build 解压到 PHPBuild/win32build 下。


       首先进入ImageMagick/ImageMagick-6.3.8/VisualMagick/configure,用VC6打开configure.dsw,编译,这样就可以把ImageMagick的编译配置文件生成。生成之后,运行当前目录的configure.exe,第二页选择Static Multi-threaded DLL runtimes (VisualStaticMTDLL).,Build Options什么都不选。Edit ‘magick-config.h’的根据自己的情况来定。直接下一步,下一步,完成,稍等一会儿,ImageMagick/ImageMagick-6.3.8/VisualMagick就会生成一个VisualStaticMTDLL.dsw.


        用VC6打开,Build ==> Set Active Configuration…,打开,选择All Release。然后,直接BuildèRebuild All。这个编译的过程耗时较长,所以可以考虑安装官方说明文档的说法,冲杯咖啡,慢慢等。

        编译完成之后,在ImageMagick/ImageMagick-6.3.8/VisualMagick/lib下会有17个以CORE_RL_开头的Lib文件,和两个原来就有的X11.lib和Xext.lib。

       将ImageMagick/ImageMagick-6.3.8/和ImageMagick/ImageMagick-6.3.8/magick加入VC的Include目录里边,将ImageMagick/ImageMagick-6.3.8/VisualMagick/lib加入Lib的目录里。

       接下来,进入PHPBuild/bindlib_w32,用vc打开bindlib.dsw,release编译,将生成的resolv.lib覆盖PHPBuild/win32build/lib下的同名文件。

解压PHP的二进制版本,并将目录添加到系统环境变量的Path里。
运行Cygwin,进入PHPBuild/php-5.2.5/ext,执行

[c-sharp] view plain copy
  1. php ext_skel_win32.php --extname=imagick  
  2. php ext_skel_win32.php --extname=magickwand  


这样,ext目录下就会生成两个新的目录,imagick和magickwand,将之前下载的两个扩展的源码分别直接解压覆盖两个目录的同名文件。并将php二进制包的dev/php5ts.lib分别复制到两个目录中。

       下面就得改dsp文件了。将这些替换原有dsp的相应内容。
magickwand.dsp:

[c-sharp] view plain copy
  1. !IF  "$(CFG)" == "magickwand - Win32 Release_TS"  
  2. # PROP BASE Use_MFC 0  
  3. # PROP BASE Use_Debug_Libraries 0  
  4. # PROP BASE Output_Dir "Release_TS"  
  5. # PROP BASE Intermediate_Dir "Release_TS"  
  6. # PROP BASE Ignore_Export_Lib 0  
  7. # PROP BASE Target_Dir ""  
  8. # PROP Use_MFC 0  
  9. # PROP Use_Debug_Libraries 0  
  10. # PROP Output_Dir "Release_TS"  
  11. # PROP Intermediate_Dir "Release_TS"  
  12. # PROP Ignore_Export_Lib 0  
  13. # PROP Target_Dir ""  
  14. # ADD BASE CPP /nologo /MT /W3 /GX /O2 /I "../.." /I "../../Zend" /I "../../TSRM" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_MAGICKWAND" /D ZTS=1 /YX /FD /c  
  15. # ADD CPP /nologo /MT /W3 /GX /O2 /I "../.." /I "../../main" /I "../../Zend" /I "../../TSRM" /I "../../win32" /I "../../../bindlib_w32" /D MAGICKWAND_BACKEND=/"ImageMagick/" /D "WIN32" /D "MAGICKWAND_EXPORTS" /D "COMPILE_DL_MAGICKWAND" /D ZTS=1 /D HAVE_MAGICKWAND=1 /D ZEND_DEBUG=0 /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ZEND_WIN32" /D "PHP_WIN32" /FR /YX /FD /c  
  16. # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32  
  17. # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32  
  18. # ADD BASE RSC /l 0x406 /d "NDEBUG"  
  19. # ADD RSC /l 0x409 /d "NDEBUG"  
  20. BSC32=bscmake.exe  
  21. # ADD BASE BSC32 /nologo  
  22. # ADD BSC32 /nologo  
  23. LINK32=link.exe  
  24. # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php5ts.lib /nologo /dll /machine:I386  
  25. # ADD LINK32 CORE_RL_zlib_.lib CORE_RL_xlib_.lib CORE_RL_wmf_.lib CORE_RL_wand_.lib CORE_RL_ttf_.lib CORE_RL_tiff_.lib CORE_RL_png_.lib CORE_RL_libxml_.lib CORE_RL_lcms_.lib CORE_RL_jpeg_.lib CORE_RL_jp2_.lib CORE_RL_jbig_.lib CORE_RL_filters_.lib CORE_RL_coders_.lib CORE_RL_bzlib_.lib CORE_RL_wand_.lib CORE_RL_magick_.lib CORE_RL_Magick++_.lib wsock32.lib php5ts.lib resolv.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /nodefaultlib:"LIBCMT.lib" /force /out:"../../Release_TS/php_magickwand.dll" /libpath:"../../Release_TS" /libpath:"../../Release_TS_Inline" /libpath:"../../../bindlib_w32/Release"  
  26. # SUBTRACT LINK32 /pdb:none  
  27. !ELSEIF  "$(CFG)" == "magickwand - Win32 Debug_TS"  
 

 

 

imagick.dsp

[c-sharp] view plain copy
  1. !IF  "$(CFG)" == "imagick - Win32 Release_TS"  
  2. # PROP BASE Use_MFC 0  
  3. # PROP BASE Use_Debug_Libraries 0  
  4. # PROP BASE Output_Dir "Release_TS"  
  5. # PROP BASE Intermediate_Dir "Release_TS"  
  6. # PROP BASE Ignore_Export_Lib 0  
  7. # PROP BASE Target_Dir ""  
  8. # PROP Use_MFC 0  
  9. # PROP Use_Debug_Libraries 0  
  10. # PROP Output_Dir "Release_TS"  
  11. # PROP Intermediate_Dir "Release_TS"  
  12. # PROP Ignore_Export_Lib 0  
  13. # PROP Target_Dir ""  
  14. # ADD BASE CPP /nologo /MT /W3 /GX /O2 /I "../.." /I "../../Zend" /I "../../TSRM" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_IMAGICK" /D ZTS=1 /YX /FD /c  
  15. # ADD CPP /nologo /MT /W3 /GX /O2 /I "../.." /I "../../main" /I "../../Zend" /I "../../TSRM" /I "../../win32" /I "../../../bindlib_w32" /D "WIN32" /D "IMAGICK_EXPORTS" /D "COMPILE_DL_IMAGICK" /D ZTS=1 /D HAVE_IMAGICK=1 /D IMAGICK_BACKEND=/"ImageMagick/" /D ZEND_DEBUG=0 /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ZEND_WIN32" /D "PHP_WIN32" /FR /YX /FD /c  
  16. # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32  
  17. # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32  
  18. # ADD BASE RSC /l 0x406 /d "NDEBUG"  
  19. # ADD RSC /l 0x409 /d "NDEBUG"  
  20. BSC32=bscmake.exe  
  21. # ADD BASE BSC32 /nologo  
  22. # ADD BSC32 /nologo  
  23. LINK32=link.exe  
  24. # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php5ts.lib /nologo /dll /machine:I386  
  25. # ADD LINK32 CORE_RL_zlib_.lib CORE_RL_xlib_.lib CORE_RL_wmf_.lib CORE_RL_wand_.lib CORE_RL_ttf_.lib CORE_RL_tiff_.lib CORE_RL_png_.lib CORE_RL_libxml_.lib CORE_RL_lcms_.lib CORE_RL_jpeg_.lib CORE_RL_jp2_.lib CORE_RL_jbig_.lib CORE_RL_filters_.lib CORE_RL_coders_.lib CORE_RL_bzlib_.lib CORE_RL_wand_.lib CORE_RL_magick_.lib CORE_RL_Magick++_.lib wsock32.lib php5ts.lib resolv.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /nodefaultlib:"LIBCMT.lib" /force /out:"../../Release_TS/php_imagick.dll"  /libpath:"../../Release_TS" /libpath:"../../Release_TS_Inline" /libpath:"../../../bindlib_w32/Release"  
  26. # SUBTRACT LINK32 /pdb:none  
  27. !ELSEIF  "$(CFG)" == "imagick - Win32 Debug_TS"  

因为我只需要Release的dll,所以Debug部分我没改。(这些内容,参考DIrk的Magickwand的编译以及他提供的dsp文件)

用VC6打开,选择release模式,编译。
成功后将会在PHPBuild/php-5.2.5/Release_TS下生成php_magickwand.dll 和 php_imagick.dll。编译过程就结束了。


PS:
我生成的php_imagick.dll和php_magickwand.dll




UPDATE:

嗯,关于安装,不得不说的
ImageMagick/ImageMagick-6.3.8/config
这个目录是ImageMagick的配置文件
php方面的安装,只要把dll复制到php的ext目录,再修改php.ini,加上extension=php_imagick.dll或extension=php_magickwand.dll

而配置文件部分
我是将这个config目录复制到了php的二进制文件夹的extra目录,改名为imagemagick_config,主要是方便管理和方便辨识
然后添加一个系统环境变量MAGICK_HOME,指到这个目录即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值